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