git: 9front

Download patch

ref: 04ab6576311a1189b4dfeb2a38553b6440657f4d
parent: 58b17cf7f1708c585daabac3c890f02326e3fc93
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Tue Jun 7 20:44:39 EDT 2011

cp: fix filpath length limitation

--- a/sys/src/cmd/cp.c
+++ b/sys/src/cmd/cp.c
@@ -78,9 +78,10 @@
 copy(char *from, char *to, int todir)
 {
 	Dir *dirb, dirt;
-	char name[256];
+	char *name;
 	int fdf, fdt, mode;
 
+	name = nil;
 	if(todir){
 		char *s, *elem;
 		elem=s=from;
@@ -87,42 +88,38 @@
 		while(*s++)
 			if(s[-1]=='/')
 				elem=s;
-		sprint(name, "%s/%s", to, elem);
-		to=name;
+		name = smprint("%s/%s", to, elem);
+		to = name;
 	}
 
+	fdf = fdt = -1;
 	if((dirb=dirstat(from))==nil){
 		fprint(2,"cp: can't stat %s: %r\n", from);
 		failed = 1;
-		return;
+		goto out;
 	}
 	mode = dirb->mode;
 	if(mode&DMDIR){
 		fprint(2, "cp: %s is a directory\n", from);
-		free(dirb);
 		failed = 1;
-		return;
+		goto out;
 	}
 	if(samefile(dirb, from, to)){
-		free(dirb);
 		failed = 1;
-		return;
+		goto out;
 	}
 	mode &= 0777;
 	fdf=open(from, OREAD);
 	if(fdf<0){
 		fprint(2, "cp: can't open %s: %r\n", from);
-		free(dirb);
 		failed = 1;
-		return;
+		goto out;
 	}
 	fdt=create(to, OWRITE, mode);
 	if(fdt<0){
 		fprint(2, "cp: can't create %s: %r\n", to);
-		close(fdf);
-		free(dirb);
 		failed = 1;
-		return;
+		goto out;
 	}
 	if(copy1(fdf, fdt, from, to)==0 && (xflag || gflag || uflag)){
 		nulldir(&dirt);
@@ -137,9 +134,13 @@
 		if(dirfwstat(fdt, &dirt) < 0)
 			fprint(2, "cp: warning: can't wstat %s: %r\n", to);
 	}			
+out:
 	free(dirb);
-	close(fdf);
-	close(fdt);
+	if(fdf >= 0)
+		close(fdf);
+	if(fdt >= 0)
+		close(fdt);
+	free(name);
 }
 
 int
--