A bug-fix for die_on_unsafe_path() when the path doesn't exist.
[rsync/rsync.git] / util.c
diff --git a/util.c b/util.c
index 8dd1b1c..afff767 100644 (file)
--- a/util.c
+++ b/util.c
@@ -111,13 +111,13 @@ void print_child_argv(char **cmd)
 
 void out_of_memory(char *str)
 {
-       rprintf(FERROR, "ERROR: out of memory in %s\n", str);
+       rprintf(FERROR, "ERROR: out of memory in %s [%s]\n", str, who_am_i());
        exit_cleanup(RERR_MALLOC);
 }
 
 void overflow_exit(char *str)
 {
-       rprintf(FERROR, "ERROR: buffer overflow in %s\n", str);
+       rprintf(FERROR, "ERROR: buffer overflow in %s [%s]\n", str, who_am_i());
        exit_cleanup(RERR_MALLOC);
 }
 
@@ -922,7 +922,8 @@ void die_on_unsafe_path(char *path, int strip_filename)
                if ((p = strchr(p, '/')) != NULL)
                        *p = '\0';
                if (safe_stat(path, &st) < 0) {
-                       *p++ = '/';
+                       if (p)
+                               *p = '/';
                        goto done;
                }
                if (S_ISLNK(st.st_mode)) {
@@ -1021,7 +1022,7 @@ char *full_fname(const char *fn)
        if (*fn == '/')
                p1 = p2 = "";
        else {
-               p1 = curr_dir;
+               p1 = curr_dir + module_dirlen;
                for (p2 = p1; *p2 == '/'; p2++) {}
                if (*p2)
                        p2 = "/";
@@ -1030,17 +1031,11 @@ char *full_fname(const char *fn)
                m1 = " (in ";
                m2 = lp_name(module_id);
                m3 = ")";
-               if (p1 == curr_dir) {
-                       if (!lp_use_chroot(module_id)) {
-                               char *p = lp_path(module_id);
-                               if (*p != '/' || p[1])
-                                       p1 += strlen(p);
-                       }
-               }
        } else
                m1 = m2 = m3 = "";
 
-       asprintf(&result, "\"%s%s%s\"%s%s%s", p1, p2, fn, m1, m2, m3);
+       if (asprintf(&result, "\"%s%s%s\"%s%s%s", p1, p2, fn, m1, m2, m3) <= 0)
+               out_of_memory("full_fname");
 
        return result;
 }