commit 9fa80b9

Devine Lu Linvega  ·  2026-06-13 16:03:02 +0000 UTC
parent fe0e46b
Added len to pathfile to try and catch an overflow error
1 files changed,  +12, -9
+12, -9
 1@@ -655,17 +655,19 @@ typedef struct {
 2 
 3 static UxnFile ufs[2];
 4 
 5-static void
 6-make_pathfile(char *pathbuf, const char *filepath, const char *basename)
 7+static unsigned int
 8+make_pathfile(char *pathbuf, unsigned int len, const char *filepath, const char *basename)
 9 {
10 	char c = '/';
11-	while(*filepath)
12+	char *end = pathbuf + len - 1;
13+	while(*filepath && pathbuf < end)
14 		c = *filepath++, *pathbuf = c, pathbuf++;
15-	if(c != '/')
16+	if(c != '/' && pathbuf < end)
17 		*pathbuf = '/', pathbuf++;
18-	while(*basename)
19+	while(*basename && pathbuf < end)
20 		*pathbuf = *basename++, pathbuf++;
21 	*pathbuf = 0;
22+	return *filepath || *basename;
23 }
24 
25 static inline unsigned int
26@@ -710,7 +712,8 @@ put_statfile(Uint8 *dest, const char *filepath, const char *basename)
27 	struct stat st;
28 	Uint8 *anchor = dest;
29 	char pathbuf[0x200];
30-	make_pathfile(pathbuf, filepath, basename);
31+	if(make_pathfile(pathbuf, sizeof pathbuf, filepath, basename))
32+		return 0;
33 	err = stat(pathbuf, &st);
34 	dir = !err && S_ISDIR(st.st_mode);
35 	dest += put_stat(dest, 4, st.st_size, err, dir, 1);
36@@ -754,9 +757,9 @@ static unsigned int
37 file_write_dir(const char *p)
38 {
39 	char buf[0x200];
40-	char *s = buf;
41+	char *s = buf, *end = buf + sizeof buf - 1;
42 	unsigned int ok = 1;
43-	while(*p && ok) {
44+	while(*p && ok && s < end) {
45 		*s++ = *p;
46 		if(*p++ == '/') {
47 			s[-1] = '\0';
48@@ -764,7 +767,7 @@ file_write_dir(const char *p)
49 			s[-1] = '/';
50 		}
51 	}
52-	return ok;
53+	return ok && !*p;
54 }
55 
56 static void