diff options
author | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2017-01-26 14:29:00 -0500 |
---|---|---|
committer | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2017-01-26 14:29:00 -0500 |
commit | baa3d88037962e5a0cd97ad048bb63f8efe2d789 (patch) | |
tree | e90617c2aea4d1d428b852aacb12f73212fa6f11 /node.c | |
parent | a405df4fd26c1a1428fb3eb9d749c42295256634 (diff) | |
download | egawk-baa3d88037962e5a0cd97ad048bb63f8efe2d789.tar.gz egawk-baa3d88037962e5a0cd97ad048bb63f8efe2d789.tar.bz2 egawk-baa3d88037962e5a0cd97ad048bb63f8efe2d789.zip |
Add some paranoid checks to make sure stptr was malloced before freeing it.
Diffstat (limited to 'node.c')
-rw-r--r-- | node.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -248,7 +248,7 @@ r_format_val(const char *format, int index, NODE *s) } s->flags = oflags; s->stlen = r->stlen; - if ((s->flags & STRCUR) != 0) + if ((s->flags & (MALLOC|STRCUR)) == (MALLOC|STRCUR)) efree(s->stptr); s->stptr = r->stptr; freenode(r); /* Do not unref(r)! We want to keep s->stptr == r->stpr. */ @@ -273,7 +273,7 @@ r_format_val(const char *format, int index, NODE *s) s->flags |= STRING; } } - if ((s->flags & STRCUR) != 0) + if ((s->flags & (MALLOC|STRCUR)) == (MALLOC|STRCUR)) efree(s->stptr); emalloc(s->stptr, char *, s->stlen + 1, "format_val"); memcpy(s->stptr, sp, s->stlen + 1); @@ -844,6 +844,7 @@ wstr2str(NODE *n) } *cp = '\0'; + /* N.B. caller just created n with make_string, so this free is safe */ efree(n->stptr); n->stptr = newval; n->stlen = cp - newval; |