diff --git a/src/slurmd/slurmstepd/task.c b/src/slurmd/slurmstepd/task.c index 0137fdc7edb5f01c90be2a63c84f375a8f60ba99..549512c4b371b87890461e2b4e6dace174835277 100644 --- a/src/slurmd/slurmstepd/task.c +++ b/src/slurmd/slurmstepd/task.c @@ -480,16 +480,20 @@ _make_tmpdir(slurmd_job_t *job) if (!(tmpdir = getenvp(job->env, "TMPDIR"))) setenvf(&job->env, "TMPDIR", "/tmp"); /* task may want it set */ else if (mkdir(tmpdir, 0700) < 0) { - if (errno == EEXIST) { - struct stat st; - - if (stat(tmpdir, &st) == 0 && /* does user have access? */ - S_ISDIR(st.st_mode) && /* is it a directory? */ - ((st.st_mode & S_IWOTH) || /* can user write there? */ - (st.st_uid == job->uid && (st.st_mode & S_IWUSR)))) - return; - } - error("Unable to create TMPDIR [%s]: %m", tmpdir); + struct stat st; + int mkdir_errno = errno; + + if (stat(tmpdir, &st)) { /* does the file exist ? */ + /* show why we were not able to create it */ + error("Unable to create TMPDIR [%s]: %s", + tmpdir, strerror(mkdir_errno)); + } else if (!S_ISDIR(st.st_mode)) { /* is it a directory? */ + error("TMPDIR [%s] is not a directory", tmpdir); + } else if (eaccess(tmpdir, X_OK|W_OK)) /* check permissions */ + error("TMPDIR [%s] is not writeable", tmpdir); + else + return; + error("Setting TMPDIR to /tmp"); setenvf(&job->env, "TMPDIR", "/tmp"); }