summaryrefslogtreecommitdiff
path: root/sys/src/cmd/mothra
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-10-08 19:58:55 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-10-08 19:58:55 +0200
commitbc18faccde776934bb314549feb8e5ba91fda053 (patch)
treea7dff7b6f2d9a4d4052bd9163ef2eef55180b256 /sys/src/cmd/mothra
parent1c1bef69aae8a6d6758a18abc14f45c674487ece (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.c14
-rw-r--r--sys/src/cmd/mothra/libpanel/mem.c10
-rw-r--r--sys/src/cmd/mothra/libpanel/pldefs.h1
-rw-r--r--sys/src/cmd/mothra/libpanel/rtext.c3
-rw-r--r--sys/src/cmd/mothra/libpanel/snarf.c6
-rw-r--r--sys/src/cmd/mothra/libpanel/textwin.c13
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));