diff options
author | 2012-08-19 10:32:32 +0000 | |
---|---|---|
committer | 2012-08-19 10:32:32 +0000 | |
commit | 046adb15fee675cf210158e06180f9f4146fcade (patch) | |
tree | eed287b67b275cb6d3d329e86e0885e56b8c3f00 | |
parent | Add warnings on io errors to help diagnosis. (diff) | |
download | wireguard-openbsd-046adb15fee675cf210158e06180f9f4146fcade.tar.xz wireguard-openbsd-046adb15fee675cf210158e06180f9f4146fcade.zip |
Kill envelope_{dump,load}_file() and replace them with envelope_{dump,load}_buffer().
with input from eric@
ok eric@
-rw-r--r-- | usr.sbin/smtpd/envelope.c | 70 | ||||
-rw-r--r-- | usr.sbin/smtpd/queue_fsqueue.c | 69 | ||||
-rw-r--r-- | usr.sbin/smtpd/smtpd.h | 6 |
3 files changed, 81 insertions, 64 deletions
diff --git a/usr.sbin/smtpd/envelope.c b/usr.sbin/smtpd/envelope.c index 6cbb2c8e923..ce0bc6d3917 100644 --- a/usr.sbin/smtpd/envelope.c +++ b/usr.sbin/smtpd/envelope.c @@ -1,4 +1,4 @@ -/* $OpenBSD: envelope.c,v 1.6 2012/06/03 19:52:56 eric Exp $ */ +/* $OpenBSD: envelope.c,v 1.7 2012/08/19 10:32:32 chl Exp $ */ /* * Copyright (c) 2011 Gilles Chehade <gilles@openbsd.org> @@ -90,11 +90,8 @@ envelope_set_errormsg(struct envelope *e, char *fmt, ...) } int -envelope_load_file(struct envelope *ep, FILE *fp) +envelope_load_buffer(struct envelope *ep, char *buf, size_t buflen) { - char *buf, *lbuf; - char *field; - size_t len; enum envelope_field fields[] = { EVP_VERSION, EVP_ID, @@ -121,24 +118,20 @@ envelope_load_file(struct envelope *ep, FILE *fp) EVP_MTA_RELAY_FLAGS, EVP_MTA_RELAY_AUTHMAP }; - int i; - int n; - int ret; + char *field, *nextline; + size_t len; + int i; + int n; + int ret; n = sizeof(fields) / sizeof(enum envelope_field); bzero(ep, sizeof (*ep)); - lbuf = NULL; - while ((buf = fgetln(fp, &len))) { - if (buf[len - 1] == '\n') - buf[len - 1] = '\0'; - else { - if ((lbuf = malloc(len + 1)) == NULL) - err(1, NULL); - memcpy(lbuf, buf, len); - lbuf[len] = '\0'; - buf = lbuf; - } + while (buflen > 0) { + len = strcspn(buf, "\n"); + buf[len] = '\0'; + nextline = buf + len + 1; + buflen -= (nextline - buf); for (i = 0; i < n; ++i) { field = envelope_ascii_field_name(fields[i]); len = strlen(field); @@ -160,6 +153,7 @@ envelope_load_file(struct envelope *ep, FILE *fp) ret = envelope_ascii_load(fields[i], ep, buf); if (ret == 0) goto err; + buf = nextline; break; } } @@ -168,16 +162,14 @@ envelope_load_file(struct envelope *ep, FILE *fp) if (i == n) goto err; } - free(lbuf); - return 1; + return (1); err: - free(lbuf); - return 0; + return (0); } int -envelope_dump_file(struct envelope *ep, FILE *fp) +envelope_dump_buffer(struct envelope *ep, char *dest, size_t len) { char buf[8192]; @@ -211,9 +203,10 @@ envelope_dump_file(struct envelope *ep, FILE *fp) EVP_MTA_RELAY_FLAGS }; enum envelope_field *pfields = NULL; - int i; - int n; + int i, n, l; + char *p; + p = dest; n = sizeof(fields) / sizeof(enum envelope_field); for (i = 0; i < n; ++i) { bzero(buf, sizeof buf); @@ -221,8 +214,13 @@ envelope_dump_file(struct envelope *ep, FILE *fp) goto err; if (buf[0] == '\0') continue; - fprintf(fp, "%s: %s\n", - envelope_ascii_field_name(fields[i]), buf); + + l = snprintf(dest, len, "%s: %s\n", + envelope_ascii_field_name(fields[i]), buf); + if (l == -1 || (size_t) l >= len) + goto err; + dest += l; + len -= l; } switch (ep->type) { @@ -249,18 +247,20 @@ envelope_dump_file(struct envelope *ep, FILE *fp) goto err; if (buf[0] == '\0') continue; - fprintf(fp, "%s: %s\n", - envelope_ascii_field_name(pfields[i]), buf); + + l = snprintf(dest, len, "%s: %s\n", + envelope_ascii_field_name(pfields[i]), buf); + if (l == -1 || (size_t) l >= len) + goto err; + dest += l; + len -= l; } } - if (fflush(fp) != 0) - goto err; - - return 1; + return (dest - p); err: - return 0; + return (0); } char * diff --git a/usr.sbin/smtpd/queue_fsqueue.c b/usr.sbin/smtpd/queue_fsqueue.c index b405c2aa9c6..5e56ae6de6e 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.47 2012/08/08 17:31:55 eric Exp $ */ +/* $OpenBSD: queue_fsqueue.c,v 1.48 2012/08/19 10:32:32 chl Exp $ */ /* * Copyright (c) 2011 Gilles Chehade <gilles@openbsd.org> @@ -108,46 +108,60 @@ fsqueue_envelope_path(uint64_t evpid, char *buf, size_t len) static int fsqueue_envelope_dump_atomic(char *dest, struct envelope *ep) { - FILE *fp; - char buf[MAXPATHLEN]; + int fd; + char evpname[MAXPATHLEN]; + char evpbuf[sizeof(struct envelope)]; + size_t evplen; + ssize_t w; + + evplen = envelope_dump_buffer(ep, evpbuf, sizeof evpbuf); + if (evplen == 0) + return (0); /* temporary fix for multi-process access to the queue, * should be fixed by rerouting ALL queue access through * the queue process. */ - snprintf(buf, sizeof buf, PATH_EVPTMP".%d", getpid()); + snprintf(evpname, sizeof evpname, PATH_EVPTMP".%d", getpid()); - fp = fopen(buf, "w"); - if (fp == NULL) { + if ((fd = open(evpname, O_RDWR | O_CREAT | O_EXCL, 0600)) == -1) { if (errno == ENOSPC || errno == ENFILE) goto tempfail; fatal("fsqueue_envelope_dump_atomic: open"); } - if (! envelope_dump_file(ep, fp)) { + w = write(fd, evpbuf, evplen); + if (w == -1) { + log_warn("fsqueue_envelope_dump_atomic: write"); if (errno == ENOSPC) goto tempfail; - fatal("fsqueue_envelope_dump_atomic: fwrite"); + fatal("fsqueue_envelope_dump_atomic: write"); } - if (! safe_fclose(fp)) + if ((size_t) w != evplen) { + log_warnx("fsqueue_envelope_dump_atomic: partial write"); goto tempfail; - fp = NULL; + } + + if (fsync(fd)) + fatal("fsync"); + close(fd); - if (rename(buf, dest) == -1) { + if (rename(evpname, dest) == -1) { + log_warn("fsqueue_envelope_dump_atomic: rename"); if (errno == ENOSPC) goto tempfail; fatal("fsqueue_envelope_dump_atomic: rename"); } - return 1; + return (1); tempfail: - if (fp) - fclose(fp); - if (unlink(buf) == -1) + if (fd != -1) + close(fd); + if (unlink(evpname) == -1) fatal("fsqueue_envelope_dump_atomic: unlink"); - return 0; + return (0); } static int @@ -174,23 +188,26 @@ again: static int fsqueue_envelope_load(struct envelope *ep) { - char pathname[MAXPATHLEN]; - FILE *fp; - int ret; + char pathname[MAXPATHLEN]; + char evpbuf[sizeof(struct envelope)]; + int fd; + ssize_t r; fsqueue_envelope_path(ep->id, pathname, sizeof(pathname)); - fp = fopen(pathname, "r"); - if (fp == NULL) { + fd = open(pathname, O_RDONLY); + if (fd == -1) { if (errno == ENOENT || errno == ENFILE) - return 0; - fatal("fsqueue_envelope_load: fopen"); + return (0); + fatal("fsqueue_envelope_load: open"); } - ret = envelope_load_file(ep, fp); - fclose(fp); + if ((r = read(fd, evpbuf, sizeof evpbuf)) == -1) + return (0); - return ret; + close(fd); + + return (envelope_load_buffer(ep, evpbuf, r)); } static int diff --git a/usr.sbin/smtpd/smtpd.h b/usr.sbin/smtpd/smtpd.h index 7eb4d7bdf94..e0d46b6d8e2 100644 --- a/usr.sbin/smtpd/smtpd.h +++ b/usr.sbin/smtpd/smtpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: smtpd.h,v 1.324 2012/08/19 08:45:44 chl Exp $ */ +/* $OpenBSD: smtpd.h,v 1.325 2012/08/19 10:32:32 chl Exp $ */ /* * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org> @@ -971,8 +971,8 @@ void envelope_set_errormsg(struct envelope *, char *, ...); char *envelope_ascii_field_name(enum envelope_field); int envelope_ascii_load(enum envelope_field, struct envelope *, char *); int envelope_ascii_dump(enum envelope_field, struct envelope *, char *, size_t); -int envelope_load_file(struct envelope *, FILE *); -int envelope_dump_file(struct envelope *, FILE *); +int envelope_load_buffer(struct envelope *, char *, size_t); +int envelope_dump_buffer(struct envelope *, char *, size_t); /* expand.c */ int expand_cmp(struct expandnode *, struct expandnode *); |