Avoid a non-writable-by-the-user file when copying xattrs.
[rsync/rsync.git] / util.c
diff --git a/util.c b/util.c
index 6019fcc..9d5f180 100644 (file)
--- a/util.c
+++ b/util.c
@@ -32,7 +32,6 @@ extern int relative_paths;
 extern int preserve_xattrs;
 extern char *module_dir;
 extern unsigned int module_dirlen;
-extern mode_t orig_umask;
 extern char *partial_dir;
 extern filter_rule_list daemon_filter_list;
 
@@ -178,20 +177,6 @@ int set_modtime(const char *fname, time_t modtime, uint32 mod_nsec, mode_t mode)
        }
 }
 
-/* This creates a new directory with default permissions.  Since there
- * might be some directory-default permissions affecting this, we can't
- * force the permissions directly using the original umask and mkdir(). */
-int mkdir_defmode(char *fname)
-{
-       int ret;
-
-       umask(orig_umask);
-       ret = do_mkdir(fname, ACCESSPERMS);
-       umask(0);
-
-       return ret;
-}
-
 /* Create any necessary directories in fname.  Any missing directories are
  * created with default permissions.  Returns < 0 on error, or the number
  * of directories created. */
@@ -216,8 +201,6 @@ int make_path(char *fname, int flags)
        } else
                end = fname + strlen(fname);
 
-       umask(orig_umask); /* NOTE: don't return before setting this back to 0! */
-
        /* Try to find an existing dir, starting from the deepest dir. */
        for (p = end; ; ) {
                if (do_mkdir(fname, ACCESSPERMS) == 0) {
@@ -258,8 +241,6 @@ int make_path(char *fname, int flags)
                        ret++;
        }
 
-       umask(0);
-
        if (flags & MKP_DROP_NAME)
                *end = '/';
 
@@ -348,6 +329,11 @@ int copy_file(const char *source, const char *dest, int ofd, mode_t mode)
                        return -1;
                }
 
+#ifdef SUPPORT_XATTRS
+               if (preserve_xattrs)
+                       mode |= S_IWUSR;
+#endif
+               mode &= INITACCESSPERMS;
                if ((ofd = do_open(dest, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, mode)) < 0) {
                        int save_errno = errno;
                        rsyserr(FERROR_XFER, save_errno, "open %s", full_fname(dest));
@@ -542,38 +528,6 @@ void kill_all(int sig)
        }
 }
 
-/* Parse a user name or (optionally) a number into a uid */
-int user_to_uid(const char *name, uid_t *uid_p, BOOL num_ok)
-{
-       struct passwd *pass;
-       if (!name || !*name)
-               return 0;
-       if (num_ok && name[strspn(name, "0123456789")] == '\0') {
-               *uid_p = atol(name);
-               return 1;
-       }
-       if (!(pass = getpwnam(name)))
-               return 0;
-       *uid_p = pass->pw_uid;
-       return 1;
-}
-
-/* Parse a group name or (optionally) a number into a gid */
-int group_to_gid(const char *name, gid_t *gid_p, BOOL num_ok)
-{
-       struct group *grp;
-       if (!name || !*name)
-               return 0;
-       if (num_ok && name[strspn(name, "0123456789")] == '\0') {
-               *gid_p = atol(name);
-               return 1;
-       }
-       if (!(grp = getgrnam(name)))
-               return 0;
-       *gid_p = grp->gr_gid;
-       return 1;
-}
-
 /** Lock a byte range in a open file */
 int lock_range(int fd, int offset, int len)
 {
@@ -1467,11 +1421,11 @@ const char *find_filename_suffix(const char *fn, int fn_len, int *len_ptr)
 
 #define UNIT (1 << 16)
 
-uint32 fuzzy_distance(const char *s1, int len1, const char *s2, int len2)
+uint32 fuzzy_distance(const char *s1, unsigned len1, const char *s2, unsigned len2)
 {
        uint32 a[MAXPATHLEN], diag, above, left, diag_inc, above_inc, left_inc;
        int32 cost;
-       int i1, i2;
+       unsigned i1, i2;
 
        if (!len1 || !len2) {
                if (!len1) {