From: Mark Wooding Date: Mon, 22 Dec 2014 20:32:58 +0000 (+0000) Subject: tmpdir.c: Explain why we reject candidates, if we do. X-Git-Tag: 1.2.4~1 X-Git-Url: https://git.distorted.org.uk/~mdw/checkpath/commitdiff_plain/2422994b351992769be18b4fccf33d9b59669969 tmpdir.c: Explain why we reject candidates, if we do. --- diff --git a/tmpdir.c b/tmpdir.c index b14f6d6..0bf51d3 100644 --- a/tmpdir.c +++ b/tmpdir.c @@ -69,6 +69,17 @@ static struct passwd *pw; * and @*f@ is set, then try to create the directory. */ +static void complain(const char *p, const char *msg, int err) +{ + dstr d = DSTR_INIT; + + if (!cp.cp_verbose) return; + dstr_putf(&d, "Path: %s: %s", p, msg); + if (err) dstr_putf(&d, ": %s", strerror(err)); + moan(d.buf); + dstr_destroy(&d); +} + static int ok(const char *p, int *f) { struct stat st; @@ -79,9 +90,12 @@ static int ok(const char *p, int *f) /* --- Maybe create it if it doesn't exist --- */ - if (errno != ENOENT || !f || !*f) + if (errno != ENOENT || !f || !*f) { + complain(p, "can't stat", errno); return (0); + } if (mkdir(p, 0700)) { + complain(p, "can't create", errno); *f = 0; return (0); } @@ -92,8 +106,10 @@ static int ok(const char *p, int *f) * the @mkdir@. */ - if (lstat(p, &st)) + if (lstat(p, &st)) { + complain(p, "can't stat after creating", errno); return (0); + } } /* --- Make sure the directory is good --- * @@ -102,7 +118,13 @@ static int ok(const char *p, int *f) * and writable only by its owner, and that owner must be me. */ - if (S_ISDIR(st.st_mode) && (st.st_mode & 0777) == 0700 && st.st_uid == me) + if (!S_ISDIR(st.st_mode)) + complain(p, "not a directory", 0); + else if (st.st_uid != me) + complain(p, "not owner", 0); + else if ((st.st_mode & 0777) != 0700) + complain(p, "non-owner access permitted", 0); + else return (1); return (0); }