The branch, master has been updated
       via  6df5d81 Fix a few issues with make_path().
      from  0e3152f Change owner+group before setting xattrs to avoid xattr 
loss. Fixes bug 10163.

;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6df5d81ce2a0df0c83aae0a0f31e9703a50b271e
Author: Wayne Davison <way...@samba.org>
Date:   Mon Dec 23 10:27:24 2013 -0800

    Fix a few issues with make_path().
    
    The make_path() utility function was not returning the right status
    when --dry-run was used, so I added some stat() checking that only
    happens for -n.  I also noticed that the function was not handling
    the case where the whole path needed to be created, so I fixed that.
    Fixes bug 10209.

-----------------------------------------------------------------------

Summary of changes:
 util.c |   22 ++++++++++++++++++----
 1 files changed, 18 insertions(+), 4 deletions(-)


Changeset truncated at 500 lines:

diff --git a/util.c b/util.c
index c943ce0..aeb5217 100644
--- a/util.c
+++ b/util.c
@@ -25,6 +25,7 @@
 #include "itypes.h"
 #include "inums.h"
 
+extern int dry_run;
 extern int module_id;
 extern int protect_args;
 extern int modify_window;
@@ -197,7 +198,15 @@ int make_path(char *fname, int flags)
 
        /* Try to find an existing dir, starting from the deepest dir. */
        for (p = end; ; ) {
-               if (do_mkdir(fname, ACCESSPERMS) == 0) {
+               if (dry_run) {
+                       STRUCT_STAT st;
+                       if (do_stat(fname, &st) == 0) {
+                               if (S_ISDIR(st.st_mode))
+                                       errno = EEXIST;
+                               else
+                                       errno = ENOTDIR;
+                       }
+               } else if (do_mkdir(fname, ACCESSPERMS) == 0) {
                        ret++;
                        break;
                }
@@ -208,12 +217,14 @@ int make_path(char *fname, int flags)
                }
                while (1) {
                        if (p == fname) {
-                               ret = -ret - 1;
+                               /* We got a relative path that doesn't exist, 
so assume that '.'
+                                * is there and just break out and create the 
whole thing. */
+                               p = NULL;
                                goto double_break;
                        }
                        if (*--p == '/') {
                                if (p == fname) {
-                                       ret = -ret - 1; /* impossible... */
+                                       /* We reached the "/" dir, which we 
assume is there. */
                                        goto double_break;
                                }
                                *p = '\0';
@@ -225,7 +236,10 @@ int make_path(char *fname, int flags)
 
        /* Make all the dirs that we didn't find on the way here. */
        while (p != end) {
-               *p = '/';
+               if (p)
+                       *p = '/';
+               else
+                       p = fname;
                p += strlen(p);
                if (ret < 0) /* Skip mkdir on error, but keep restoring the 
path. */
                        continue;


-- 
The rsync repository.
_______________________________________________
rsync-cvs mailing list
rsync-cvs@lists.samba.org
https://lists.samba.org/mailman/listinfo/rsync-cvs

Reply via email to