dovecot-1.2: Logging: Make sure we don't recurse infinitely when...

dovecot at dovecot.org dovecot at dovecot.org
Sun Jul 20 18:16:23 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/bd0a8f1485b5
changeset: 8019:bd0a8f1485b5
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Jul 20 17:56:52 2008 +0300
description:
Logging: Make sure we don't recurse infinitely when running out of memory.
Also cleaned up the logging handlers' code a bit.

diffstat:

1 file changed, 12 insertions(+), 7 deletions(-)
src/lib/failures.c |   19 ++++++++++++-------

diffs (68 lines):

diff -r 2621f6f10c2e -r bd0a8f1485b5 src/lib/failures.c
--- a/src/lib/failures.c	Sun Jul 20 17:42:57 2008 +0300
+++ b/src/lib/failures.c	Sun Jul 20 17:56:52 2008 +0300
@@ -110,16 +110,15 @@ default_handler(const char *prefix, int 
 default_handler(const char *prefix, int fd, const char *format, va_list args)
 {
 	static int recursed = 0;
-	int ret, old_errno = errno;
+	int ret;
 
 	if (recursed >= 2) {
 		/* we're being called from some signal handler or we ran
 		   out of memory */
-		return 0;
+		return -1;
 	}
 
 	recursed++;
-
 	T_BEGIN {
 		string_t *str = t_str_new(256);
 		log_prefix_add(str);
@@ -132,9 +131,7 @@ default_handler(const char *prefix, int 
 		ret = log_fd_write(fd, str_data(str), str_len(str));
 	} T_END;
 
-	errno = old_errno;
 	recursed--;
-
 	return ret;
 }
 
@@ -274,9 +271,8 @@ syslog_handler(int level, enum log_type 
 {
 	static int recursed = 0;
 
-	if (recursed != 0)
+	if (recursed >= 2)
 		return -1;
-
 	recursed++;
 
 	/* syslogs don't generatelly bother to log the level in any way,
@@ -391,8 +387,16 @@ static int ATTR_FORMAT(2, 0)
 static int ATTR_FORMAT(2, 0)
 internal_handler(char log_type, const char *format, va_list args)
 {
+	static int recursed = 0;
 	int ret;
 
+	if (recursed >= 2) {
+		/* we're being called from some signal handler or we ran
+		   out of memory */
+		return -1;
+	}
+
+	recursed++;
 	T_BEGIN {
 		string_t *str;
 
@@ -404,6 +408,7 @@ internal_handler(char log_type, const ch
 		ret = write_full(2, str_data(str), str_len(str));
 	} T_END;
 
+	recursed--;
 	return ret;
 }
 


More information about the dovecot-cvs mailing list