changeset 8019:bd0a8f1485b5 HEAD

Logging: Make sure we don't recurse infinitely when running out of memory. Also cleaned up the logging handlers' code a bit.
author Timo Sirainen <tss@iki.fi>
date Sun, 20 Jul 2008 17:56:52 +0300
parents 2621f6f10c2e
children 701828d42e66
files src/lib/failures.c
diffstat 1 files changed, 12 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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 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 @@
 		ret = log_fd_write(fd, str_data(str), str_len(str));
 	} T_END;
 
-	errno = old_errno;
 	recursed--;
-
 	return ret;
 }
 
@@ -274,9 +271,8 @@
 {
 	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)
 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 @@
 		ret = write_full(2, str_data(str), str_len(str));
 	} T_END;
 
+	recursed--;
 	return ret;
 }