Ignore:
Timestamp:
Jun 26, 2020, 7:16:26 PM (5 years ago)
Author:
bird
Message:

kmk: Avoid setting umask just to get it, store the current value in a global variable (g_fUMask). The umask(0777) call in cp.c raced other code (kmk_append) that created files and directories, leaving us with read-only files sometimes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/kmkbuiltin/mkdir.c

    r3215 r3389  
    4949#include "err.h"
    5050#include <errno.h>
     51#include <assert.h>
    5152#ifndef _MSC_VER
    5253# include <libgen.h>
     
    8081};
    8182
     83extern mode_t g_fUMask;
    8284
    8385extern void * bsd_setmode(const char *p);
     
    167169
    168170#ifdef KMK_BUILTIN_STANDALONE
     171mode_t g_fUMask;
    169172int main(int argc, char **argv, char **envp)
    170173{
    171174    KMKBUILTINCTX Ctx = { "kmk_mkdir", NULL };
     175    umask(g_fUMask = umask(0077));
    172176    return kmk_builtin_mkdir(argc, argv, envp, &Ctx);
    173177}
     
    240244                         * instead of doing chmod's.
    241245                         */
    242                         oumask = umask(0);
     246#ifdef KMK_BUILTIN_STANDALONE
     247                        oumask = umask(0077);
     248#else
     249                        oumask = g_fUMask;
     250                        assert(oumask == umask(g_fUMask));
     251#endif
    243252                        numask = oumask & ~(S_IWUSR | S_IXUSR);
    244                         (void)umask(numask);
     253                        if (numask != oumask)
     254                            (void)umask(numask);
    245255                        first = 0;
    246256                }
    247                 if (last)
     257                if (last && oumask != numask)
    248258                        (void)umask(oumask);
    249259                if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
     
    255265                                        retval = 1;
    256266                                        break;
    257                                 } else if (!S_ISDIR(sb.st_mode)) {
     267                                }
     268                                if (!S_ISDIR(sb.st_mode)) {
    258269                                        if (last)
    259270                                                errno = EEXIST;
     
    274285                    *p = '/';
    275286        }
    276         if (!first && !last)
     287        if (!first && !last && oumask != numask)
    277288                (void)umask(oumask);
    278289        return (retval);
Note: See TracChangeset for help on using the changeset viewer.