diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-11-22 12:44:15 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-11-22 12:44:15 +0100 |
commit | 9d471caaae56a734728c3b19755adfe26f6c4f4c (patch) | |
tree | 7bb6c6411d0474c72ec3ae041be122e53db44845 /sys/src/cmd/snap/take.c | |
parent | 33636932054f74c7a922a9713a9229d6d5fc7f38 (diff) |
snap: check for overflows, cleanup error handling
Diffstat (limited to 'sys/src/cmd/snap/take.c')
-rw-r--r-- | sys/src/cmd/snap/take.c | 39 |
1 files changed, 13 insertions, 26 deletions
diff --git a/sys/src/cmd/snap/take.c b/sys/src/cmd/snap/take.c index 3ef884fd8..64a454fbf 100644 --- a/sys/src/cmd/snap/take.c +++ b/sys/src/cmd/snap/take.c @@ -20,6 +20,7 @@ sumr(ulong sum, void *buf, int n) return sum; } +char zeros[Pagesize]; static ulong npage; static Page *pgtab[1<<10]; @@ -27,43 +28,27 @@ Page* datapage(char *p, long len) { Page *pg; - char *q, *ep; - long sum; - int iszero; + ulong sum; - if(len > Pagesize) { - fprint(2, "datapage cannot handle pages > %d\n", Pagesize); - exits("datapage"); - } + if(len > Pagesize) + sysfatal("datapage cannot handle pages > %d", Pagesize); sum = sumr(0, p, len) & (nelem(pgtab)-1); - if(sum == 0) { - iszero = 1; - for(q=p, ep=p+len; q<ep; q++) - if(*q != 0) { - iszero = 0; - break; - } - } else - iszero = 0; - - for(pg = pgtab[sum]; pg; pg=pg->link) + for(pg = pgtab[sum]; pg != nil; pg=pg->link) if(pg->len == len && memcmp(pg->data, p, len) == 0) - break; - if(pg) - return pg; + return pg; pg = emalloc(sizeof(*pg)+len); pg->data = (char*)&pg[1]; pg->type = 0; pg->len = len; memmove(pg->data, p, len); - pg->link = pgtab[sum]; - pgtab[sum] = pg; - if(iszero) { + if(sum == 0 && memcmp(zeros, p, len) == 0) { pg->type = 'z'; pg->written = 1; } + pg->link = pgtab[sum]; + pgtab[sum] = pg; ++npage; return pg; @@ -148,7 +133,7 @@ stackptr(Proc *proc, int fd) char *q; Fhdr f; Reglist *r; - long textoff; + vlong textoff; int i; Data *dreg; @@ -160,7 +145,9 @@ stackptr(Proc *proc, int fd) if(textoff == -1) return 0; - seek(fd, textoff, 0); + if(seek(fd, textoff, 0) < 0) + return 0; + if(crackhdr(fd, &f) == 0) return 0; |