From b952835efe865a8303f69d7fdac75c7dc11265ce Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sun, 6 May 2007 01:37:21 +0000 Subject: [PATCH] svlogd: fix 'SEGV on uninitialized data' and make it honor TERM --- runit/svlogd.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/runit/svlogd.c b/runit/svlogd.c index c2cff9679..4e9644fd5 100644 --- a/runit/svlogd.c +++ b/runit/svlogd.c @@ -642,9 +642,11 @@ static int buffer_pread(int fd, char *s, unsigned len, struct taia *now) trotate = dir[i].trotate; } - while (1) { + do { sigprocmask(SIG_UNBLOCK, blocked_sigset, NULL); iopause(&input, 1, &trotate, now); +// TODO: do not unblock/block, but use sigpending after iopause +// to see whether there was any sig? (one syscall less...) sigprocmask(SIG_BLOCK, blocked_sigset, NULL); i = ndelay_read(fd, s, len); if (i >= 0) break; @@ -653,7 +655,7 @@ static int buffer_pread(int fd, char *s, unsigned len, struct taia *now) break; } /* else: EAGAIN - normal, repeat silently */ - } + } while (!exitasap); if (i > 0) { int cnt; @@ -784,12 +786,12 @@ int svlogd_main(int argc, char **argv) ////if (buflen <= linemax) usage(); fdwdir = xopen(".", O_RDONLY|O_NDELAY); coe(fdwdir); - dir = xmalloc(dirn * sizeof(struct logdir)); + dir = xzalloc(dirn * sizeof(struct logdir)); for (i = 0; i < dirn; ++i) { dir[i].fddir = -1; dir[i].fdcur = -1; ////dir[i].btmp = xmalloc(buflen); - dir[i].ppid = 0; + /*dir[i].ppid = 0;*/ } /* line = xmalloc(linemax + (timestamp ? 26 : 0)); */ fndir = argv;