]> git.ipfire.org Git - people/ms/dma.git/commitdiff
dma-mbox-create: refactor to use a /var/mail directory fd
authorEd Maste <emaste@freebsd.org>
Thu, 29 Sep 2016 21:25:36 +0000 (17:25 -0400)
committerEd Maste <emaste@freebsd.org>
Thu, 29 Sep 2016 21:27:07 +0000 (17:27 -0400)
Based on a patch to Capsicumize dma-mbox-create for FreeBSD by
cem@FreeBSD.org, in https://reviews.freebsd.org/D7988

dma-mbox-create.c

index fa30fb9fe8b585808fe125cc47812b1ff8959356..80088601f2d75c91d7925273d5b70a65c3f93b01 100644 (file)
@@ -89,9 +89,7 @@ main(int argc, char **argv)
        struct group *gr;
        uid_t user_uid;
        gid_t mail_gid;
-       int error;
-       char fn[PATH_MAX+1];
-       int f;
+       int f, maildirfd;
 
        openlog("dma-mbox-create", 0, LOG_MAIL);
 
@@ -131,26 +129,22 @@ main(int argc, char **argv)
        if (!pw)
                logfail(EX_NOUSER, "cannot find user `%s'", user);
 
-       user_uid = pw->pw_uid;
+       maildirfd = open(_PATH_MAILDIR, O_RDONLY);
+       if (maildirfd < 0)
+               logfail(EX_NOINPUT, "cannot open maildir %s", _PATH_MAILDIR);
 
-       error = snprintf(fn, sizeof(fn), "%s/%s", _PATH_MAILDIR, user);
-       if (error < 0 || (size_t)error >= sizeof(fn)) {
-               if (error >= 0) {
-                       errno = 0;
-                       logfail(EX_USAGE, "mbox path too long");
-               }
-               logfail(EX_CANTCREAT, "cannot build mbox path for `%s/%s'", _PATH_MAILDIR, user);
-       }
+       user_uid = pw->pw_uid;
 
-       f = open(fn, O_RDONLY|O_CREAT|O_NOFOLLOW, 0600);
+       f = openat(maildirfd, user, O_RDONLY|O_CREAT|O_NOFOLLOW, 0600);
        if (f < 0)
-               logfail(EX_NOINPUT, "cannot open mbox `%s'", fn);
+               logfail(EX_NOINPUT, "cannot open mbox `%s'", user);
 
        if (fchown(f, user_uid, mail_gid))
-               logfail(EX_OSERR, "cannot change owner of mbox `%s'", fn);
+               logfail(EX_OSERR, "cannot change owner of mbox `%s'", user);
 
        if (fchmod(f, 0620))
-               logfail(EX_OSERR, "cannot change permissions of mbox `%s'", fn);
+               logfail(EX_OSERR, "cannot change permissions of mbox `%s'",
+                   user);
 
        /* file should be present with the right owner and permissions */