shithub: front

Download patch

ref: ddaadd65b44ee8f745965d8f3ecdb565f48850fb
parent: 9d552b68e411d081431abb7f100f48435104829a
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon Dec 9 08:57:39 EST 2024

libdisk: cleanname() paths for setname()/mkpath(), avoid utfrrune()

--- a/sys/src/libdisk/proto.c
+++ b/sys/src/libdisk/proto.c
@@ -229,8 +229,8 @@
 static void
 setname(Mkaux *mkaux, Name *name, File *f)
 {
-	char *s1, *s2, *ss;
-	int l;
+	char *s1, *s2;
+	int n;
 	
 	s1 = mkaux->root;
 	s2 = "";
@@ -242,18 +242,14 @@
 			s2 = f->old;
 	}else
 		s2 = f->new;
-
-	l = strlen(s1);
-	ss = (*s1 && *s2 && *s2 != '/' && s1[l-1] != '/') ? "/" : "";
-	l += strlen(ss);
-	l += strlen(s2);
-	l++;
-	if(name->n < l+SLOP/2) {
+	n = strlen(s1) + strlen(s2) + 2;
+	if(name->n < n+SLOP/2) {
 		free(name->s);
-		name->s = emalloc(mkaux, l+SLOP);
-		name->n = l+SLOP;
+		name->s = emalloc(mkaux, n+SLOP);
+		name->n = n+SLOP;
 	}
-	snprint(name->s, name->n, "%s%s%s", s1, ss, s2);
+	snprint(name->s, name->n, "%s/%s", s1, s2);
+	cleanname(name->s);
 }
 
 
@@ -311,10 +307,8 @@
 
 	n = strlen(prefix) + strlen(elem) + 2;
 	p = emalloc(mkaux, n);
-	strcpy(p, prefix);
-	strcat(p, "/");
-	strcat(p, elem);
-	return p;
+	snprint(p, n, "%s/%s", prefix, elem);
+	return cleanname(p);
 }
 
 static int
@@ -552,8 +546,11 @@
 
 	f = emalloc(mkaux, sizeof *f);
 	f->new = mkpath(mkaux, old->new, elem);
+	if((s = strrchr(f->new, '/')) != nil)
+		f->elem = s+1;
+	else
+		f->elem = f->new;
 	free(elem);
-	f->elem = utfrrune(f->new, L'/') + 1;
 
 	if((p = getmode(mkaux, p, &f->mode)) == nil){
 		freefile(f);
--