about summary refs log tree commit diff
diff options
context:
space:
mode:
authorClint Adams <clint@users.sourceforge.net>2000-09-19 15:26:08 +0000
committerClint Adams <clint@users.sourceforge.net>2000-09-19 15:26:08 +0000
commit3ce3caeec63d4afa4014ca9fdc27d2d096265f14 (patch)
tree8eea6b04319b8345c67509e6f7a176fe4a4cab17
parent2909b28776f4d3c8e585215e57756d7ec788b7a7 (diff)
downloadzsh-3ce3caeec63d4afa4014ca9fdc27d2d096265f14.tar.gz
zsh-3ce3caeec63d4afa4014ca9fdc27d2d096265f14.tar.xz
zsh-3ce3caeec63d4afa4014ca9fdc27d2d096265f14.zip
12845: dynamically allocate pbuf in domove()
-rw-r--r--ChangeLog4
-rw-r--r--Src/Modules/files.c18
2 files changed, 17 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 6728f6e17..f6a5df759 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2000-09-19  Clint Adams  <schizo@debian.org>
+
+	* 12845: Src/Modules/files.c: dynamically allocate pbuf in domove().
+
 2000-09-18  Andrej Borsenkow <Andrej.Borsenkow@mow.siemens.ru>
 
 	* 12835: Doc/Zsh/compwid.yo: Alphabetize list of special parameters
diff --git a/Src/Modules/files.c b/Src/Modules/files.c
index e789661b0..6d962efd1 100644
--- a/Src/Modules/files.c
+++ b/Src/Modules/files.c
@@ -255,14 +255,15 @@ static int
 domove(char *nam, MoveFunc move, char *p, char *q, int flags)
 {
     struct stat st;
-    char *qbuf;
-    char pbuf[PATH_MAX + 1];
-    strcpy(pbuf, unmeta(p));
+    char *pbuf, *qbuf;
+
+    pbuf = ztrdup(unmeta(p));
     qbuf = unmeta(q);
     if(flags & MV_NODIRS) {
 	errno = EISDIR;
 	if(lstat(pbuf, &st) || S_ISDIR(st.st_mode)) {
 	    zwarnnam(nam, "%s: %e", p, errno);
+	    zsfree(pbuf);
 	    return 1;
 	}
     }
@@ -270,6 +271,7 @@ domove(char *nam, MoveFunc move, char *p, char *q, int flags)
 	int doit = flags & MV_FORCE;
 	if(S_ISDIR(st.st_mode)) {
 	    zwarnnam(nam, "%s: cannot overwrite directory", q, 0);
+	    zsfree(pbuf);
 	    return 1;
 	} else if(flags & MV_INTER) {
 	    nicezputs(nam, stderr);
@@ -277,8 +279,10 @@ domove(char *nam, MoveFunc move, char *p, char *q, int flags)
 	    nicezputs(q, stderr);
 	    fputs("'? ", stderr);
 	    fflush(stderr);
-	    if(!ask())
+	    if(!ask()) {
+		zsfree(pbuf);
 		return 0;
+	    }
 	    doit = 1;
 	} else if((flags & MV_ASKNW) &&
 		!S_ISLNK(st.st_mode) &&
@@ -289,8 +293,10 @@ domove(char *nam, MoveFunc move, char *p, char *q, int flags)
 	    fprintf(stderr, "', overriding mode %04o? ",
 		mode_to_octal(st.st_mode));
 	    fflush(stderr);
-	    if(!ask())
+	    if(!ask()) {
+		zsfree(pbuf);
 		return 0;
+	    }
 	    doit = 1;
 	}
 	if(doit && !(flags & MV_ATOMIC))
@@ -298,8 +304,10 @@ domove(char *nam, MoveFunc move, char *p, char *q, int flags)
     }
     if(move(pbuf, qbuf)) {
 	zwarnnam(nam, "%s: %e", p, errno);
+	zsfree(pbuf);
 	return 1;
     }
+    zsfree(pbuf);
     return 0;
 }