Make sure to set umask() before calling mkstemp().
authorAndreas Schneider <asn@samba.org>
Mon, 25 Feb 2013 16:34:21 +0000 (17:34 +0100)
committerDavid Disseldorp <ddiss@samba.org>
Wed, 6 Mar 2013 00:16:34 +0000 (01:16 +0100)
Reviewed-by: David Disseldorp <ddiss@samba.org>
Autobuild-User(master): David Disseldorp <ddiss@samba.org>
Autobuild-Date(master): Wed Mar  6 01:16:34 CET 2013 on sn-devel-104

13 files changed:
lib/krb5_wrap/krb5_samba.c
lib/util/util.c
libgpo/gpo_ini.c
source3/client/client.c
source3/lib/smbrun.c
source3/libads/kerberos.c
source3/libnet/libnet_samsync_ldif.c
source3/printing/printing.c
source3/printing/printspoolss.c
source3/smbd/message.c
source3/utils/interact.c
source3/utils/net_usershare.c
source4/client/client.c

index 0876ab628452e7086b0943daef3e6ab92f725265..3a2401a9ad28ee8a700813f3f8d0e617d62ab677 100644 (file)
@@ -21,6 +21,7 @@
 */
 
 #include "includes.h"
+#include "system/filesys.h"
 #include "krb5_samba.h"
 #include "lib/util/asn1.h"
 
@@ -1483,6 +1484,7 @@ krb5_error_code kerberos_kinit_keyblock_cc(krb5_context ctx, krb5_ccache cc,
 {
        krb5_error_code code = 0;
        krb5_creds my_creds;
+       mode_t mask;
 
 #if defined(HAVE_KRB5_GET_INIT_CREDS_KEYBLOCK)
        code = krb5_get_init_creds_keyblock(ctx, &my_creds, principal,
@@ -1500,7 +1502,9 @@ krb5_error_code kerberos_kinit_keyblock_cc(krb5_context ctx, krb5_ccache cc,
        *(KRB5_KT_KEY(&entry)) = *keyblock;
 
        memcpy(tmp_name, SMB_CREDS_KEYTAB, sizeof(SMB_CREDS_KEYTAB));
+       mask = umask(S_IRWXO | S_IRWXG);
        mktemp(tmp_name);
+       umask(mask);
        if (tmp_name[0] == 0) {
                return KRB5_KT_BADNAME;
        }
index d49e20e6cd5f99bc4b74edf5d8e3062d34ccfb18..464fc62e1fb20a7d176130edc8d205ec097c9349 100644 (file)
@@ -63,6 +63,7 @@ int create_unlink_tmp(const char *dir)
 {
        char *fname;
        int fd;
+       mode_t mask;
 
        if (!dir) {
                dir = tmpdir();
@@ -73,7 +74,9 @@ int create_unlink_tmp(const char *dir)
                errno = ENOMEM;
                return -1;
        }
+       mask = umask(S_IRWXO | S_IRWXG);
        fd = mkstemp(fname);
+       umask(mask);
        if (fd == -1) {
                TALLOC_FREE(fname);
                return -1;
index 494162466d05ae05f9dc57ae03fa887f6f6805bf..a2cb106d73c9ad335852262604aea0805cd23ef6 100644 (file)
@@ -63,6 +63,7 @@ static NTSTATUS convert_file_from_ucs2(TALLOC_CTX *mem_ctx,
        NTSTATUS status;
        size_t n = 0;
        size_t converted_size;
+       mode_t mask;
 
        if (!filename_out) {
                return NT_STATUS_INVALID_PARAMETER;
@@ -81,7 +82,9 @@ static NTSTATUS convert_file_from_ucs2(TALLOC_CTX *mem_ctx,
                goto out;
        }
 
+       mask = umask(S_IRWXO | S_IRWXG);
        tmp_fd = mkstemp(tmp_name);
+       umask(mask);
        if (tmp_fd == -1) {
                status = NT_STATUS_ACCESS_DENIED;
                goto out;
index 8038021d83cd74b7571088c26afe77435546c491..e21d867c55c7bb361897c7c049642cc696294812 100644 (file)
@@ -1361,6 +1361,7 @@ static int cmd_more(void)
        const char *pager;
        int fd;
        int rc = 0;
+       mode_t mask;
 
        rname = talloc_strdup(ctx, client_get_cur_dir());
        if (!rname) {
@@ -1371,7 +1372,9 @@ static int cmd_more(void)
        if (!lname) {
                return 1;
        }
+       mask = umask(S_IRWXO | S_IRWXG);
        fd = mkstemp(lname);
+       umask(mask);
        if (fd == -1) {
                d_printf("failed to create temporary file for more\n");
                return 1;
index 0ecdc0d68379d6cdd6dda9448eb664d6aa31a6e0..15a0c886e4779a81432f5edc0dfa1b79d22762f0 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include "includes.h"
+#include "system/filesys.h"
 
 /* need to move this from here!! need some sleep ... */
 struct current_user current_user;
@@ -31,6 +32,7 @@ static int setup_out_fd(void)
        int fd;
        TALLOC_CTX *ctx = talloc_stackframe();
        char *path = NULL;
+       mode_t mask;
 
        path = talloc_asprintf(ctx,
                                "%s/smb.XXXXXX",
@@ -42,7 +44,9 @@ static int setup_out_fd(void)
        }
 
        /* now create the file */
+       mask = umask(S_IRWXO | S_IRWXG);
        fd = mkstemp(path);
+       umask(mask);
 
        if (fd == -1) {
                DEBUG(0,("setup_out_fd: Failed to create file %s. (%s)\n",
index 50a409c1af58e30d451e9011724b224cfe55d125..96d194dc3119a68dc0152d0a7097f66cf2b8f342 100644 (file)
@@ -833,6 +833,7 @@ bool create_local_private_krb5_conf_for_domain(const char *realm,
        char *realm_upper = NULL;
        bool result = false;
        char *aes_enctypes = NULL;
+       mode_t mask;
 
        if (!lp_create_krb5_conf()) {
                return false;
@@ -906,7 +907,9 @@ bool create_local_private_krb5_conf_for_domain(const char *realm,
 
        flen = strlen(file_contents);
 
+       mask = umask(S_IRWXO | S_IRWXG);
        fd = mkstemp(tmpname);
+       umask(mask);
        if (fd == -1) {
                DEBUG(0,("create_local_private_krb5_conf_for_domain: smb_mkstemp failed,"
                        " for file %s. Errno %s\n",
index c492b9fda514ef28406cc554fcd6a1f7bc4e7792..2ea9c823283e596ad5b201be8180583da657d13e 100644 (file)
@@ -24,6 +24,7 @@
 */
 
 #include "includes.h"
+#include "system/filesys.h"
 #include "libnet/libnet_samsync.h"
 #include "transfer_file.h"
 #include "passdb.h"
@@ -929,6 +930,8 @@ static NTSTATUS ldif_init_context(TALLOC_CTX *mem_ctx,
        const char *add_template = "/tmp/add.ldif.XXXXXX";
        const char *mod_template = "/tmp/mod.ldif.XXXXXX";
        const char *builtin_sid = "S-1-5-32";
+       mode_t mask;
+       int fd;
 
        r = talloc_zero(mem_ctx, struct samsync_ldif_context);
        NT_STATUS_HAVE_NO_MEMORY(r);
@@ -980,14 +983,37 @@ static NTSTATUS ldif_init_context(TALLOC_CTX *mem_ctx,
                goto done;
        }
 
+       mask = umask(S_IRWXO | S_IRWXG);
+       fd = mkstemp(r->add_name);
+       umask(mask);
+       if (fd < 0) {
+               DEBUG(1, ("Could not create %s\n", r->add_name));
+               status = NT_STATUS_UNSUCCESSFUL;
+               goto done;
+       }
+
        /* Open the add and mod ldif files */
-       if (!(r->add_file = fdopen(mkstemp(r->add_name),"w"))) {
+       r->add_file = fdopen(fd, "w");
+       if (r->add_file == NULL) {
                DEBUG(1, ("Could not open %s\n", r->add_name));
+               close(fd);
                status = NT_STATUS_UNSUCCESSFUL;
                goto done;
        }
-       if (!(r->mod_file = fdopen(mkstemp(r->module_name),"w"))) {
+
+       mask = umask(S_IRWXO | S_IRWXG);
+       fd = mkstemp(r->module_name);
+       umask(mask);
+       if (fd < 0) {
+               DEBUG(1, ("Could not create %s\n", r->module_name));
+               status = NT_STATUS_UNSUCCESSFUL;
+               goto done;
+       }
+
+       r->mod_file = fdopen(fd, "w");
+       if (r->mod_file == NULL) {
                DEBUG(1, ("Could not open %s\n", r->module_name));
+               close(fd);
                status = NT_STATUS_UNSUCCESSFUL;
                goto done;
        }
index c394118303aeea06cd9dac92ea482dce204d845f..43f75e5c4382a4cba2a42968403d9a99b4675b7d 100644 (file)
@@ -2709,6 +2709,7 @@ static WERROR print_job_spool_file(int snum, uint32_t jobid,
        SMB_STRUCT_STAT st;
        const char *path;
        int len;
+       mode_t mask;
 
        /* if this file is within the printer path, it means that smbd
         * is spooling it and will pass us control when it is finished.
@@ -2746,7 +2747,9 @@ static WERROR print_job_spool_file(int snum, uint32_t jobid,
        slprintf(pjob->filename, sizeof(pjob->filename)-1,
                 "%s/%sXXXXXX", lp_pathname(talloc_tos(), snum),
                 PRINT_SPOOL_PREFIX);
+       mask = umask(S_IRWXO | S_IRWXG);
        pjob->fd = mkstemp(pjob->filename);
+       umask(mask);
 
        if (pjob->fd == -1) {
                werr = map_werror_from_unix(errno);
index acf4c0d19afc26cb0fd16b8241cf6d537aac42b2..5fab7d54efe046bfbcab65a5634d2adbf0ea2bcb 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include "includes.h"
+#include "system/filesys.h"
 #include "printing.h"
 #include "rpc_client/rpc_client.h"
 #include "../librpc/gen_ndr/ndr_spoolss_c.h"
@@ -68,6 +69,7 @@ NTSTATUS print_spool_open(files_struct *fsp,
        struct spoolss_DocumentInfo1 *info1;
        int fd = -1;
        WERROR werr;
+       mode_t mask;
 
        tmp_ctx = talloc_new(fsp);
        if (!tmp_ctx) {
@@ -127,7 +129,9 @@ NTSTATUS print_spool_open(files_struct *fsp,
                goto done;
        }
        errno = 0;
+       mask = umask(S_IRWXO | S_IRWXG);
        fd = mkstemp(pf->filename);
+       umask(mask);
        if (fd == -1) {
                if (errno == EACCES) {
                        /* Common setup error, force a report. */
index 59949e21aea16323dec3bdbefabb91017f7fd39c..5369f3185a39f71a58bd32faab7c0cfcf53cb3fe 100644 (file)
@@ -23,6 +23,7 @@
 
 
 #include "includes.h"
+#include "system/filesys.h"
 #include "smbd/smbd.h"
 #include "smbd/globals.h"
 #include "smbprofile.h"
@@ -50,6 +51,7 @@ static void msg_deliver(struct msg_state *state)
        ssize_t sz;
        fstring alpha_buf;
        char *s;
+       mode_t mask;
 
        if (! (*lp_msg_command(frame))) {
                DEBUG(1,("no messaging command specified\n"));
@@ -61,7 +63,9 @@ static void msg_deliver(struct msg_state *state)
        if (!name) {
                goto done;
        }
+       mask = umask(S_IRWXO | S_IRWXG);
        fd = mkstemp(name);
+       umask(mask);
 
        if (fd == -1) {
                DEBUG(1, ("can't open message file %s: %s\n", name,
index 6d753dd012eb1d0b9c82e600a8641f1983916baa..f8fed6de19891163ed70cc09b1c257d1f0267a4a 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 #include "includes.h"
+#include "system/filesys.h"
 
 #include "interact.h"
 
@@ -79,8 +80,12 @@ char* interact_edit(TALLOC_CTX* mem_ctx, const char* str) {
        char buf[128];
        char* ret = NULL;
        FILE* file;
+       mode_t mask;
+       int fd;
 
-       int fd = mkstemp(fname);
+       mask = umask(S_IRWXO | S_IRWXG);
+       fd = mkstemp(fname);
+       umask(mask);
        if (fd == -1) {
                DEBUG(0, ("failed to mkstemp %s: %s\n", fname,
                          strerror(errno)));
index 382fe2f250cfecbe1b854c32d12ec4479bf0d756..78d38daaf97b4fae4764773544dd8527f302a844 100644 (file)
@@ -642,6 +642,7 @@ static int net_usershare_add(struct net_context *c, int argc, const char **argv)
        uid_t myeuid = geteuid();
        bool guest_ok = false;
        int num_usershares;
+       mode_t mask;
 
        us_comment = "";
        arg_acl = "S-1-1-0:R";
@@ -895,7 +896,9 @@ static int net_usershare_add(struct net_context *c, int argc, const char **argv)
        }
 
        /* Create a temporary filename for this share. */
+       mask = umask(S_IRWXO | S_IRWXG);
        tmpfd = mkstemp(full_path_tmp);
+       umask(mask);
 
        if (tmpfd == -1) {
                d_fprintf(stderr,
index 66c21dfc547b4fec8f19ab1e7756c6654b94590f..cd7967ebc531f6fe215aa46071e0ca9d7837fc9d 100644 (file)
@@ -940,9 +940,12 @@ static int cmd_more(struct smbclient_context *ctx, const char **args)
        char *pager;
        int fd;
        int rc = 0;
+       mode_t mask;
 
        lname = talloc_asprintf(ctx, "%s/smbmore.XXXXXX",tmpdir());
+       mask = umask(S_IRWXO | S_IRWXG);
        fd = mkstemp(lname);
+       umask(mask);
        if (fd == -1) {
                d_printf("failed to create temporary file for more\n");
                return 1;