diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2007-09-30 16:14:21 +0200 |
---|---|---|
committer | Johannes Berg <johannes@sipsolutions.net> | 2007-09-30 16:14:21 +0200 |
commit | 962f82ed3028cd8de2c19f4c9baf4299c15ea4e4 (patch) | |
tree | dccdf2071e262f390f5c9ed6b205dfc7cd1332f3 | |
parent | f07994f4ba5f6496b9d5a20e56834a89c86fe179 (diff) | |
download | dovecot-antispam-962f82ed3028cd8de2c19f4c9baf4299c15ea4e4.tar.gz dovecot-antispam-962f82ed3028cd8de2c19f4c9baf4299c15ea4e4.tar.xz dovecot-antispam-962f82ed3028cd8de2c19f4c9baf4299c15ea4e4.zip |
fix remaining error handling bugs
Diffstat (limited to '')
-rw-r--r-- | dspam-exec.c | 21 | ||||
-rw-r--r-- | plugin.c | 6 |
2 files changed, 13 insertions, 14 deletions
diff --git a/dspam-exec.c b/dspam-exec.c index b413209..b3e9ca2 100644 --- a/dspam-exec.c +++ b/dspam-exec.c @@ -28,7 +28,7 @@ static const char *dspam_binary = "/usr/bin/dspam"; -static bool call_dspam(pool_t pool, const char *signature, bool is_spam) +static int call_dspam(pool_t pool, const char *signature, bool is_spam) { pid_t pid; const char *class_arg; @@ -88,32 +88,33 @@ static bool call_dspam(pool_t pool, const char *signature, bool is_spam) return WEXITSTATUS(status); } else { int fd = open("/dev/null", O_RDONLY); + close(0); close(1); close(2); /* see above */ close(pipes[0]); - if (dup2(pipes[1], 2) != 2) { + if (dup2(pipes[1], 2) != 2) exit(1); - } - if (dup2(pipes[1], 1) != 1) { + if (dup2(pipes[1], 1) != 1) exit(1); - } close(pipes[1]); - if (dup2(fd, 0) != 0) { + if (dup2(fd, 0) != 0) exit(1); - } close(fd); debug("antispam: %s --source=error --stdout %s %s", - dspam_binary, class_arg, sign_arg); + dspam_binary, class_arg, sign_arg); execl(dspam_binary, dspam_binary, "--source=error", "--stdout", class_arg, sign_arg, NULL); - exit(127); /* fall through if dspam can't be found */ - return -1; /* never executed */ + + /* fall through if dspam can't be found */ + exit(127); + /* not reached */ + return -1; } } @@ -163,10 +163,8 @@ static int fetch_and_copy(struct client *client, /* MODIFIED: pass to backend */ #ifdef BACKEND_WANTS_SIGNATURE /* got all signatures now, pass them to backend if no errors */ - if (ret > 0) { - if (backend(pool, src_spam, siglist)) - ret = BACKEND_FAILURE; - } + if (ret > 0 && !backend(pool, src_spam, siglist)) + ret = BACKEND_FAILURE; #else #error Not implemented #endif |