Fix bug #6161 - smbclient corrupts source path in tar mode
authorJeremy Allison <jra@samba.org>
Fri, 6 Mar 2009 01:19:18 +0000 (17:19 -0800)
committerJeremy Allison <jra@samba.org>
Fri, 6 Mar 2009 01:19:18 +0000 (17:19 -0800)
This was my fault. I broke the smbclient tar argument processing
in creating the string for chdir when removing pstrings.
Jeremy.

source3/client/clitar.c

index 18edf037e26613eced1e46783dd730e638dd02e7..c9f3e87c4df2bd120f27afc878e0b9e7f2e5d66b 100644 (file)
@@ -1513,6 +1513,7 @@ int process_tar(void)
 
                                        if (strrchr_m(cliplist[i], '\\')) {
                                                char *p;
 
                                        if (strrchr_m(cliplist[i], '\\')) {
                                                char *p;
+                                               char saved_char;
                                                char *saved_dir = talloc_strdup(ctx,
                                                                        client_get_cur_dir());
                                                if (!saved_dir) {
                                                char *saved_dir = talloc_strdup(ctx,
                                                                        client_get_cur_dir());
                                                if (!saved_dir) {
@@ -1531,13 +1532,28 @@ int process_tar(void)
                                                if (!tarmac) {
                                                        return 1;
                                                }
                                                if (!tarmac) {
                                                        return 1;
                                                }
+                                               /*
+                                                * Strip off the last \\xxx
+                                                * xxx element of tarmac to set
+                                                * it as current directory.
+                                                */
                                                p = strrchr_m(tarmac, '\\');
                                                if (!p) {
                                                        return 1;
                                                }
                                                p = strrchr_m(tarmac, '\\');
                                                if (!p) {
                                                        return 1;
                                                }
+                                               saved_char = p[1];
                                                p[1] = '\0';
                                                p[1] = '\0';
+
                                                client_set_cur_dir(tarmac);
 
                                                client_set_cur_dir(tarmac);
 
+                                               /*
+                                                * Restore the character we
+                                                * just replaced to
+                                                * put the pathname
+                                                * back as it was.
+                                                */
+                                               p[1] = saved_char;
+
                                                DEBUG(5, ("process_tar, do_list with tarmac: %s\n", tarmac));
                                                do_list(tarmac,attribute,do_tar, False, True);
 
                                                DEBUG(5, ("process_tar, do_list with tarmac: %s\n", tarmac));
                                                do_list(tarmac,attribute,do_tar, False, True);