diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-10-08 19:58:55 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-10-08 19:58:55 +0200 |
commit | bc18faccde776934bb314549feb8e5ba91fda053 (patch) | |
tree | a7dff7b6f2d9a4d4052bd9163ef2eef55180b256 /sys/src/cmd/mothra | |
parent | 1c1bef69aae8a6d6758a18abc14f45c674487ece (diff) |
libpanel: fix memory corruption bug in plinitentry(), add pl_erealloc()
Diffstat (limited to 'sys/src/cmd/mothra')
-rw-r--r-- | sys/src/cmd/mothra/libpanel/entry.c | 14 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/mem.c | 10 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/pldefs.h | 1 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/rtext.c | 3 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/snarf.c | 6 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/textwin.c | 13 |
6 files changed, 21 insertions, 26 deletions
diff --git a/sys/src/cmd/mothra/libpanel/entry.c b/sys/src/cmd/mothra/libpanel/entry.c index 6c0f953d4..b50046306 100644 --- a/sys/src/cmd/mothra/libpanel/entry.c +++ b/sys/src/cmd/mothra/libpanel/entry.c @@ -34,8 +34,7 @@ void pl_pasteentry(Panel *p, char *s){ ep=p->data; n=ep->entp-ep->entry; m=strlen(s); - if((e=realloc(ep->entry,n+m+SLACK))==0) - return; + e=pl_erealloc(ep->entry,n+m+SLACK); ep->entry=e; e+=n; strncpy(e, s, m); @@ -131,11 +130,7 @@ void pl_typeentry(Panel *p, Rune c){ ep->entp+=runetochar(ep->entp, &c); if(ep->entp>ep->eent){ n=ep->entp-ep->entry; - ep->entry=realloc(ep->entry, n+100+SLACK); - if(ep->entry==0){ - fprint(2, "can't realloc in pl_typeentry\n"); - exits("no mem"); - } + ep->entry=pl_erealloc(ep->entry, n+100+SLACK); ep->entp=ep->entry+n; ep->eent=ep->entp+100; } @@ -155,7 +150,7 @@ void pl_freeentry(Panel *p){ Entry *ep; ep = p->data; free(ep->entry); - ep->entry = ep->eent = 0; + ep->entry = ep->eent = ep->entp = 0; } void plinitentry(Panel *v, int flags, int wid, char *str, void (*hit)(Panel *, char *)){ int elen; @@ -174,8 +169,7 @@ void plinitentry(Panel *v, int flags, int wid, char *str, void (*hit)(Panel *, c v->paste=pl_pasteentry; elen=100; if(str) elen+=strlen(str); - if(ep->entry==nil) - ep->entry=pl_emalloc(elen+SLACK); + ep->entry=pl_erealloc(ep->entry, elen+SLACK); ep->eent=ep->entry+elen; strecpy(ep->entry, ep->eent, str ? str : ""); ep->entp=ep->entry+strlen(ep->entry); diff --git a/sys/src/cmd/mothra/libpanel/mem.c b/sys/src/cmd/mothra/libpanel/mem.c index 91b08cd1f..2733510dc 100644 --- a/sys/src/cmd/mothra/libpanel/mem.c +++ b/sys/src/cmd/mothra/libpanel/mem.c @@ -14,6 +14,16 @@ void *pl_emalloc(int n){ setmalloctag(v, getcallerpc(&n)); return v; } +void *pl_erealloc(void *v, int n) +{ + v=realloc(v, n); + if(v==0){ + fprint(2, "Can't realloc!\n"); + exits("no mem"); + } + setrealloctag(v, getcallerpc(&v)); + return v; +} void pl_unexpected(Panel *g, char *rou){ fprint(2, "%s called unexpectedly (%s %lux)\n", rou, g->kind, (ulong)g); abort(); diff --git a/sys/src/cmd/mothra/libpanel/pldefs.h b/sys/src/cmd/mothra/libpanel/pldefs.h index 52a7d6814..8e96f1a4d 100644 --- a/sys/src/cmd/mothra/libpanel/pldefs.h +++ b/sys/src/cmd/mothra/libpanel/pldefs.h @@ -45,6 +45,7 @@ enum{ }; Panel *pl_newpanel(Panel *, int); /* make a new Panel, given parent & data size */ void *pl_emalloc(int); /* allocate some space, exit on error */ +void *pl_erealloc(void*,int); /* reallocate some space, exit on error */ void pl_print(Panel *); /* print a Panel tree */ Panel *pl_ptinpanel(Point, Panel *); /* highest-priority subpanel containing point */ /* diff --git a/sys/src/cmd/mothra/libpanel/rtext.c b/sys/src/cmd/mothra/libpanel/rtext.c index 00790bb01..a18be62f5 100644 --- a/sys/src/cmd/mothra/libpanel/rtext.c +++ b/sys/src/cmd/mothra/libpanel/rtext.c @@ -302,8 +302,7 @@ char *plrtsnarftext(Rtext *w){ n = strlen(w->text)+64; if(p+n >= e){ n = (p+n+64)-b; - if((t = realloc(b, n))==0) - break; + t = pl_erealloc(b, n); p = t+(p-b); e = t+n; b = t; diff --git a/sys/src/cmd/mothra/libpanel/snarf.c b/sys/src/cmd/mothra/libpanel/snarf.c index 4eb56f67f..b11cb36f7 100644 --- a/sys/src/cmd/mothra/libpanel/snarf.c +++ b/sys/src/cmd/mothra/libpanel/snarf.c @@ -17,16 +17,14 @@ void plputsnarf(char *s){ } char *plgetsnarf(void){ int fd, n, r; - char *s, *x; + char *s; if((fd=open("/dev/snarf", OREAD))<0) return nil; n=0; s=nil; for(;;){ - if((x=realloc(s, n+1024))==0) - break; - s=x; + s=pl_erealloc(s, n+1024); if((r = read(fd, s+n, 1024)) <= 0) break; n += r; diff --git a/sys/src/cmd/mothra/libpanel/textwin.c b/sys/src/cmd/mothra/libpanel/textwin.c index 94479f0c8..94ec29812 100644 --- a/sys/src/cmd/mothra/libpanel/textwin.c +++ b/sys/src/cmd/mothra/libpanel/textwin.c @@ -66,11 +66,7 @@ void tw_storeloc(Textwin *t, int l, Point p){ int nloc; if(l>=t->eloc-t->loc){ nloc=l+SLACK; - t->loc=realloc(t->loc, nloc*sizeof(Point)); - if(t->loc==0){ - fprint(2, "No mem in tw_storeloc\n"); - exits("no mem"); - } + t->loc=pl_erealloc(t->loc, nloc*sizeof(Point)); t->eloc=t->loc+nloc; } t->loc[l]=p; @@ -390,16 +386,13 @@ void tw_relocate(Textwin *t, int first, int last, Point dst){ */ void twreplace(Textwin *t, int r0, int r1, Rune *ins, int nins){ int olen, nlen, tlen, dtop; - Rune *ntext; olen=t->etext-t->text; nlen=olen+nins-(r1-r0); tlen=t->eslack-t->text; if(nlen>tlen){ tlen=nlen+SLACK; - if((ntext=realloc(t->text, tlen*sizeof(Rune)))==0) - return; - t->text=ntext; - t->eslack=ntext+tlen; + t->text=pl_erealloc(t->text, tlen*sizeof(Rune)); + t->eslack=t->text+tlen; } if(olen!=nlen) memmove(t->text+r0+nins, t->text+r1, (olen-r1)*sizeof(Rune)); |