ref: 2db3642b8d3b871c6f9d1f4e3204b2f44fc4b79f
parent: f09788364452d6921d555587196f5453e1259257
author: Ori Bernstein <ori@eigenstate.org>
date: Fri Dec 18 02:16:29 EST 2020
strndup: don't assume buffer is terminated Using strlen in strndup will walk past the first n bytes up to the terminator, which may not be present. This is not what we want. While we're here, do some cleanups.
--- a/sys/src/ape/lib/ap/gen/strndup.c
+++ b/sys/src/ape/lib/ap/gen/strndup.c
@@ -8,13 +8,11 @@
int n;
char *np;
- n = strlen(p)+1;
- if(n > max)
- n = max+1;
- np = malloc(n);
+ n = strnlen(p, max);
+ np = malloc(n+1);
if(!np)
- return nil;
- memmove(np, p, n);
- np[n-1] = 0;
+ return NULL;
+ memcpy(np, p, n);
+ np[n] = 0;
return np;
}