summaryrefslogtreecommitdiffstats
path: root/usr.sbin/smtpd/queue_fsqueue.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/smtpd/queue_fsqueue.c')
-rw-r--r--usr.sbin/smtpd/queue_fsqueue.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/usr.sbin/smtpd/queue_fsqueue.c b/usr.sbin/smtpd/queue_fsqueue.c
index d640f5b6ef2..c4a10fcbe54 100644
--- a/usr.sbin/smtpd/queue_fsqueue.c
+++ b/usr.sbin/smtpd/queue_fsqueue.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: queue_fsqueue.c,v 1.57 2013/01/26 09:37:23 gilles Exp $ */
+/* $OpenBSD: queue_fsqueue.c,v 1.58 2013/01/31 18:34:43 eric Exp $ */
/*
* Copyright (c) 2011 Gilles Chehade <gilles@poolp.org>
@@ -157,8 +157,9 @@ fsqueue_envelope_dump(char *dest, char *evpbuf, size_t evplen, int do_atomic, in
log_warn("warn: fsqueue_envelope_dump: fsync");
goto tempfail;
}
- if (fclose(fp)) {
+ if (fclose(fp) != 0) {
log_warn("warn: fsqueue_envelope_dump: fclose");
+ fp = NULL;
goto tempfail;
}
fp = NULL;
@@ -229,7 +230,7 @@ fsqueue_envelope_load(uint64_t evpid, char *buf, size_t len)
{
char pathname[MAXPATHLEN];
FILE *fp;
- ssize_t r;
+ size_t r;
fsqueue_envelope_path(evpid, pathname, sizeof(pathname));
@@ -241,7 +242,14 @@ fsqueue_envelope_load(uint64_t evpid, char *buf, size_t len)
}
r = fread(buf, 1, len, fp);
-
+ if (r) {
+ if (r == len) {
+ log_warn("warn: fsqueue_envelope_load: too large");
+ r = 0;
+ }
+ else
+ buf[r] = '\0';
+ }
fclose(fp);
return (r);
@@ -297,6 +305,7 @@ fsqueue_envelope_walk(uint64_t *evpid, char *buf, size_t len)
hdl = fsqueue_qwalk_new();
if (fsqueue_qwalk(hdl, evpid)) {
+ bzero(buf, len);
r = fsqueue_envelope_load(*evpid, buf, len);
if (r) {
msgid = evpid_to_msgid(*evpid);