X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/blobdiff_plain/69f27b85a2cc006585a1118fb9fd2c0c06c57d13..c8b07ee5563f43ea65ee46cec4d8215ba54e6b3a:/libexec/dma/spool.c diff --git a/libexec/dma/spool.c b/libexec/dma/spool.c index f5a9d790ee..25c6a99d2c 100644 --- a/libexec/dma/spool.c +++ b/libexec/dma/spool.c @@ -32,6 +32,9 @@ * SUCH DAMAGE. */ +#include "dfcompat.h" + +#include #include #include @@ -120,9 +123,11 @@ writequeuef(struct qitem *it) int error; int queuefd; - queuefd = open_locked(it->queuefn, O_CREAT|O_EXCL|O_RDWR, 0600); + queuefd = open_locked(it->queuefn, O_CREAT|O_EXCL|O_RDWR, 0660); if (queuefd == -1) return (-1); + if (fchmod(queuefd, 0660) < 0) + return (-1); it->queuef = fdopen(queuefd, "w+"); if (it->queuef == NULL) return (-1); @@ -290,9 +295,7 @@ load_queue(struct queue *queue) queuefn = NULL; mailfn = NULL; - /* ignore temp files */ - if (strncmp(de->d_name, "tmp_", 4) == 0 || de->d_type != DT_REG) - continue; + /* ignore non-queue files */ if (de->d_name[0] != 'Q') continue; if (asprintf(&queuefn, "%s/Q%s", config.spooldir, de->d_name + 1) < 0) @@ -300,6 +303,18 @@ load_queue(struct queue *queue) if (asprintf(&mailfn, "%s/M%s", config.spooldir, de->d_name + 1) < 0) goto fail; + /* + * Some file systems don't provide a de->d_type, so we have to + * do an explicit stat on the queue file. + * Move on if it turns out to be something else than a file. + */ + if (stat(queuefn, &sb) != 0) + goto skip_item; + if (!S_ISREG(sb.st_mode)) { + errno = EINVAL; + goto skip_item; + } + if (stat(mailfn, &sb) != 0) goto skip_item;