Whamcloud - gitweb
Save and restore umask around calls to mkstemp()
authorTheodore Ts'o <tytso@mit.edu>
Thu, 9 Jan 2014 20:18:44 +0000 (15:18 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 9 Jan 2014 20:18:44 +0000 (15:18 -0500)
The races would be hard to exploit, but let's close them off.

Addresses-Coverity-Id: #709504
Addresses-Coverity-Id: #709505
Addresses-Coverity-Id: #709506

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
e2fsck/dirinfo.c
lib/blkid/save.c
lib/ext2fs/icount.c

index dc08f90..dbaf471 100644 (file)
@@ -42,6 +42,7 @@ static void setup_tdb(e2fsck_t ctx, ext2_ino_t num_dirs)
        struct dir_info_db      *db = ctx->dir_info;
        unsigned int            threshold;
        errcode_t               retval;
+       mode_t                  save_umask;
        char                    *tdb_dir, uuid[40];
        int                     fd, enable;
 
@@ -62,7 +63,9 @@ static void setup_tdb(e2fsck_t ctx, ext2_ino_t num_dirs)
 
        uuid_unparse(ctx->fs->super->s_uuid, uuid);
        sprintf(db->tdb_fn, "%s/%s-dirinfo-XXXXXX", tdb_dir, uuid);
+       save_umask = umask(077);
        fd = mkstemp(db->tdb_fn);
+       umask(save_umask);
        if (fd < 0) {
                db->tdb = NULL;
                return;
index 6c20168..c55e043 100644 (file)
@@ -94,8 +94,10 @@ int blkid_flush_cache(blkid_cache cache)
        if (ret == 0 && S_ISREG(st.st_mode)) {
                tmp = malloc(strlen(filename) + 8);
                if (tmp) {
+                       mode_t save_umask = umask(022);
                        sprintf(tmp, "%s-XXXXXX", filename);
                        fd = mkstemp(tmp);
+                       umask(save_umask);
                        if (fd >= 0) {
                                file = fdopen(fd, "w");
                                opened = tmp;
index 80085e1..a3b20f0 100644 (file)
@@ -181,6 +181,7 @@ errcode_t ext2fs_create_icount_tdb(ext2_filsys fs, char *tdb_dir,
        errcode_t       retval;
        char            *fn, uuid[40];
        ext2_ino_t      num_inodes;
+       mode_t          save_umask;
        int             fd;
 
        retval = alloc_icount(fs, flags,  &icount);
@@ -193,11 +194,13 @@ errcode_t ext2fs_create_icount_tdb(ext2_filsys fs, char *tdb_dir,
        uuid_unparse(fs->super->s_uuid, uuid);
        sprintf(fn, "%s/%s-icount-XXXXXX", tdb_dir, uuid);
        icount->tdb_fn = fn;
+       save_umask = umask(077);
        fd = mkstemp(fn);
        if (fd < 0) {
                retval = errno;
                goto errout;
        }
+       umask(save_umask);
        /*
         * This is an overestimate of the size that we will need; the
         * ideal value is the number of used inodes with a count