Mercurial > dovecot > original-hg > dovecot-1.2
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; }