From c65d179354fd3fd6f9719531f3414cf1c9c5280a Mon Sep 17 00:00:00 2001 From: Neven Sajko Date: Tue, 31 Dec 2019 21:32:42 +0000 Subject: mk: fix out of bounds access A loop is added for each structure field instead of accessing the other fields through the first one in one loop. Updates #313 Change-Id: I0e27e15feacb77391bc1decee7cf720d64d14586 --- src/cmd/mk/archive.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'src/cmd/mk') diff --git a/src/cmd/mk/archive.c b/src/cmd/mk/archive.c index 01288908..6869bacf 100644 --- a/src/cmd/mk/archive.c +++ b/src/cmd/mk/archive.c @@ -1,6 +1,6 @@ #include "mk.h" #define ARMAG "!\n" -#define SARMAG 8 +#define SARMAG (sizeof(ARMAG) - sizeof("")) #define ARFMAG "`\n" #define SARNAME 16 @@ -102,7 +102,7 @@ atouch(char *name) LSEEK(fd, SARMAG, 0); while(read(fd, (char *)&h, sizeof(h)) == sizeof(h)){ for(i = SARNAME-1; i > 0 && h.name[i] == ' '; i--) - ; + ; h.name[i+1]=0; if(strcmp(member, h.name) == 0){ t = SARNAME-sizeof(h); /* ughgghh */ @@ -118,6 +118,18 @@ atouch(char *name) close(fd); } +static int +allspaces(char *a, int n) +{ + int i; + for (i = 0; i < n; i++) { + if (a[i] != ' ') { + return 0; + } + } + return 1; +} + static void atimes(char *ar) { @@ -151,11 +163,13 @@ atimes(char *ar) if(readn(fd, name, namelen) != namelen) break; name[namelen] = 0; - }else if(memcmp(h.name, "// ", 2) == 0){ /* GNU */ + }else if(memcmp(h.name, "// ", 3) == 0){ /* GNU */ /* date, uid, gid, mode all ' ' */ - for(i=2; i<16+12+6+6+8; i++) - if(h.name[i] != ' ') - goto skip; + if(!allspaces(&h.name[3], sizeof(h.name) - 3) || + !allspaces(h.date, sizeof(h.date)) || !allspaces(h.uid, sizeof(h.uid)) || + !allspaces(h.gid, sizeof(h.gid)) || !allspaces(h.mode, sizeof(h.mode))){ + goto skip; + } t = atol(h.size); if(t&01) t++; @@ -189,7 +203,7 @@ atimes(char *ar) }else{ strncpy(name, h.name, sizeof(h.name)); for(i = sizeof(h.name)-1; i > 0 && name[i] == ' '; i--) - ; + ; if(name[i] == '/') /* system V bug */ i--; name[i+1]=0; -- cgit v1.2.3 From 2738cc3cfc053a5922aee655405c0ab620beae0f Mon Sep 17 00:00:00 2001 From: Dan Cross Date: Wed, 8 Jan 2020 01:36:49 +0000 Subject: mk: plan9 style. In general, no space after `if` etc, and no braces for a single statement inside of a loop or conditional. Signed-off-by: Dan Cross --- src/cmd/mk/archive.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src/cmd/mk') diff --git a/src/cmd/mk/archive.c b/src/cmd/mk/archive.c index 6869bacf..026641bd 100644 --- a/src/cmd/mk/archive.c +++ b/src/cmd/mk/archive.c @@ -122,11 +122,11 @@ static int allspaces(char *a, int n) { int i; - for (i = 0; i < n; i++) { - if (a[i] != ' ') { + + for(i=0; i Date: Fri, 10 Jan 2020 14:44:21 +0000 Subject: Trivial changes: whitespace and modes. Remote whitespace at the ends of lines. Remove blank lines from the ends of files. Change modes on source files so that they are not executable. Signed-off-by: Dan Cross --- src/cmd/mk/env.c | 2 +- src/cmd/mk/rule.c | 2 +- src/cmd/mk/run.c | 2 +- src/cmd/mk/sh.c | 1 - src/cmd/mk/sys.h | 1 - src/cmd/mk/unix.c | 6 +++--- src/cmd/mk/varsub.c | 8 ++++---- src/cmd/mk/word.c | 2 +- 8 files changed, 11 insertions(+), 13 deletions(-) (limited to 'src/cmd/mk') diff --git a/src/cmd/mk/env.c b/src/cmd/mk/env.c index 11df34e3..d7c6481d 100644 --- a/src/cmd/mk/env.c +++ b/src/cmd/mk/env.c @@ -142,7 +142,7 @@ buildenv(Job *j, int slot) for(i = 0; *p; i++, p++){ if((j->r->attr®EXP) && j->match[i]) envupd(*p, newword(j->match[i])); - else + else envupd(*p, newword("")); } return envy; diff --git a/src/cmd/mk/rule.c b/src/cmd/mk/rule.c index 30728197..537d2d75 100644 --- a/src/cmd/mk/rule.c +++ b/src/cmd/mk/rule.c @@ -76,7 +76,7 @@ dumpr(char *s, Rule *r) { if(r == nil) return; - Bprint(&bout, "%s: start=%ld shelltype=%s shellcmd=%s\n", + Bprint(&bout, "%s: start=%ld shelltype=%s shellcmd=%s\n", s, r, r->shellt->name, wtos(r->shellcmd, ' ')); for(; r; r = r->next){ Bprint(&bout, "\tRule %ld: %s[%d] attr=%x next=%ld chain=%ld alltarget='%s'", diff --git a/src/cmd/mk/run.c b/src/cmd/mk/run.c index dd225c0d..6f60cede 100644 --- a/src/cmd/mk/run.c +++ b/src/cmd/mk/run.c @@ -29,7 +29,7 @@ run(Job *j) for(jj = jobs; jj->next; jj = jj->next) ; jj->next = j; - } else + } else jobs = j; j->next = 0; /* this code also in waitup after parse redirect */ diff --git a/src/cmd/mk/sh.c b/src/cmd/mk/sh.c index e2566514..d8f205c8 100644 --- a/src/cmd/mk/sh.c +++ b/src/cmd/mk/sh.c @@ -203,4 +203,3 @@ Shell shshell = { shcopyq, shmatchname }; - diff --git a/src/cmd/mk/sys.h b/src/cmd/mk/sys.h index 03a9d058..f520b066 100644 --- a/src/cmd/mk/sys.h +++ b/src/cmd/mk/sys.h @@ -2,4 +2,3 @@ #include #include #include - diff --git a/src/cmd/mk/unix.c b/src/cmd/mk/unix.c index c63d3cef..37f05b71 100644 --- a/src/cmd/mk/unix.c +++ b/src/cmd/mk/unix.c @@ -23,7 +23,7 @@ readenv(void) Word *w; for(p = environ; *p; p++){ -/* rsc 5/5/2004 -- This misparses fn#cd={whatever} +/* rsc 5/5/2004 -- This misparses fn#cd={whatever} s = shname(*p); if(*s == '=') { *s = 0; @@ -111,7 +111,7 @@ shargv(Word *cmd, int extra, char ***pargv) n = 0; for(w=cmd; w; w=w->next) n++; - + argv = Malloc((n+extra+1)*sizeof(argv[0])); i = 0; for(w=cmd; w; w=w->next) @@ -119,7 +119,7 @@ shargv(Word *cmd, int extra, char ***pargv) argv[n] = 0; *pargv = argv; return n; -} +} int execsh(char *args, char *cmd, Bufblock *buf, Envy *e, Shell *sh, Word *shellcmd) diff --git a/src/cmd/mk/varsub.c b/src/cmd/mk/varsub.c index f858a92a..b6c0ab0f 100644 --- a/src/cmd/mk/varsub.c +++ b/src/cmd/mk/varsub.c @@ -61,7 +61,7 @@ varmatch(char *name) { Word *w; Symtab *sym; - + sym = symlook(name, S_VAR, 0); if(sym){ /* check for at least one non-NULL value */ @@ -107,7 +107,7 @@ expandvar(char **s) } *end = 0; *s = end+1; - + sym = symlook(buf->start, S_VAR, 0); if(sym == 0 || sym->u.ptr == 0) w = newword(buf->start); @@ -173,7 +173,7 @@ subsub(Word *v, char *s, char *end) while(w->next) w = w->next; } - if(PERCENT(*cp) && nmid > 0){ + if(PERCENT(*cp) && nmid > 0){ if(w){ bufcpy(buf, w->s, strlen(w->s)); bufcpy(buf, enda, nmid); @@ -205,7 +205,7 @@ subsub(Word *v, char *s, char *end) } if(w == 0) h = w = newword(v->s); - + if(head == 0) head = h; else diff --git a/src/cmd/mk/word.c b/src/cmd/mk/word.c index f94c4fd7..e1e52a1c 100644 --- a/src/cmd/mk/word.c +++ b/src/cmd/mk/word.c @@ -29,7 +29,7 @@ stow(char *s) head = w = new; while(w->next) w = w->next; - + } if (!head) head = newword(""); -- cgit v1.2.3 From fafa622a5bdf71adfbb4334541c3b65f29c89ca9 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sun, 12 Jan 2020 15:05:40 -0500 Subject: all: fix or silence various gcc warnings As usual, gcc finds some real problems but also reports a ton of noise. Fix the problems and quiet the noise. --- src/cmd/mk/archive.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/cmd/mk') diff --git a/src/cmd/mk/archive.c b/src/cmd/mk/archive.c index 026641bd..5b0c1d00 100644 --- a/src/cmd/mk/archive.c +++ b/src/cmd/mk/archive.c @@ -202,7 +202,7 @@ atimes(char *ar) name[namelen] = 0; namelen = 0; }else{ - strncpy(name, h.name, sizeof(h.name)); + memmove(name, h.name, sizeof(h.name)); for(i = sizeof(h.name)-1; i > 0 && name[i] == ' '; i--) ; if(name[i] == '/') /* system V bug */ -- cgit v1.2.3 From 6c17f630901eec2a4b54b70748d7fbc9b47eecd8 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 13 Jan 2020 19:20:34 -0500 Subject: mk: treat X= as empty list in rc shell This brings mk's behavior when using rc in line with Plan 9's. The existing code is for Unix environment data structures but also was assuming Unix shell semantics where empty and missing variables are mostly equivalent. The Plan 9 code (/sys/src/cmd/mk/plan9.c in the distribution) explicitly removes /env/name (creating an empty list) when the value is missing or an empty string. Fixes #255. --- src/cmd/mk/unix.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'src/cmd/mk') diff --git a/src/cmd/mk/unix.c b/src/cmd/mk/unix.c index 37f05b71..66bdb1ff 100644 --- a/src/cmd/mk/unix.c +++ b/src/cmd/mk/unix.c @@ -53,20 +53,26 @@ readenv(void) void exportenv(Envy *e, Shell *sh) { - int i; + int w, n; char **p; + Envy *e1; static char buf[16384]; - p = 0; - for(i = 0; e->name; e++, i++) { - p = (char**) Realloc(p, (i+2)*sizeof(char*)); + n = 0; + for(e1 = e; e1->name; e1++) + n++; + p = Malloc((n+1)*sizeof(char*)); + w = 0; + for(; e->name; e++) { + if(sh == &rcshell && (e->values == 0 || e->values->s == 0 || e->values->s[0] == 0)) + continue; /* do not write empty string for empty list */ if(e->values) snprint(buf, sizeof buf, "%s=%s", e->name, wtos(e->values, sh->iws)); else snprint(buf, sizeof buf, "%s=", e->name); - p[i] = strdup(buf); + p[w++] = strdup(buf); } - p[i] = 0; + p[w] = 0; environ = p; } -- cgit v1.2.3 From 26cae02da740b05da97868b517c58b05f0e37e07 Mon Sep 17 00:00:00 2001 From: Neven Sajko Date: Tue, 14 Jan 2020 04:05:03 +0100 Subject: mk: fix hash function (#315) Avoid signed integer overflow using ulong instead of long h. --- src/cmd/mk/symtab.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'src/cmd/mk') diff --git a/src/cmd/mk/symtab.c b/src/cmd/mk/symtab.c index 17674c43..2bb28ba8 100644 --- a/src/cmd/mk/symtab.c +++ b/src/cmd/mk/symtab.c @@ -1,7 +1,7 @@ #include "mk.h" #define NHASH 4099 -#define HASHMUL 79L /* this is a good value */ +#define HASHMUL 79UL /* this is a good value */ static Symtab *hash[NHASH]; void @@ -21,14 +21,12 @@ syminit(void) Symtab * symlook(char *sym, int space, void *install) { - long h; + ulong h; char *p; Symtab *s; for(p = sym, h = space; *p; h += *p++) h *= HASHMUL; - if(h < 0) - h = ~h; h %= NHASH; for(s = hash[h]; s; s = s->next) if((s->space == space) && (strcmp(s->name, sym) == 0)) @@ -47,7 +45,7 @@ symlook(char *sym, int space, void *install) void symdel(char *sym, int space) { - long h; + ulong h; char *p; Symtab *s, *ls; @@ -55,8 +53,6 @@ symdel(char *sym, int space) for(p = sym, h = space; *p; h += *p++) h *= HASHMUL; - if(h < 0) - h = ~h; h %= NHASH; for(s = hash[h], ls = 0; s; ls = s, s = s->next) if((s->space == space) && (strcmp(s->name, sym) == 0)){ -- cgit v1.2.3