rpms/gawk/devel gawk-3.1.5-freewstr.patch, NONE, 1.1 gawk.spec, 1.43, 1.44
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Thu Jan 11 08:30:45 UTC 2007
Author: kzak
Update of /cvs/dist/rpms/gawk/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv3506
Modified Files:
gawk.spec
Added Files:
gawk-3.1.5-freewstr.patch
Log Message:
* Thu Jan 11 2007 Karel Zak <kzak at redhat.com> 3.1.5-12
- fix #222080 double free or corruption
- Resolves: rhbz#222080
gawk-3.1.5-freewstr.patch:
awk.h | 3 ++
builtin.c | 7 +++---
eval.c | 8 -------
node.c | 64 ++++++++++++++++++++++++++++++--------------------------------
4 files changed, 39 insertions(+), 43 deletions(-)
--- NEW FILE gawk-3.1.5-freewstr.patch ---
--- gawk-3.1.5/builtin.c.freewstr 2005-07-26 20:07:43.000000000 +0200
+++ gawk-3.1.5/builtin.c 2007-01-08 13:29:45.000000000 +0100
@@ -2089,9 +2089,9 @@
}
free(buf);
- if (wc_indices != NULL)
- free(wc_indices);
}
+ if (wc_indices != NULL)
+ free(wc_indices);
} else { /* match failed */
rstart = 0;
rlength = -1;
@@ -2462,6 +2462,8 @@
free(t->stptr);
t->stptr = buf;
t->stlen = textlen;
+ free_wstr(t);
+ t->flags &= ~(NUMCUR|NUMBER);
free_temp(s);
if (matches > 0 && lhs) {
@@ -2471,7 +2473,6 @@
}
if (after_assign != NULL)
(*after_assign)();
- t->flags &= ~(NUMCUR|NUMBER);
}
if (mb_indices != NULL)
free(mb_indices);
--- gawk-3.1.5/awk.h.freewstr 2005-07-26 20:07:43.000000000 +0200
+++ gawk-3.1.5/awk.h 2007-01-08 12:31:26.000000000 +0100
@@ -1166,6 +1166,9 @@
#define force_wstring(n) str2wstr(n, NULL)
extern const wchar_t *wstrstr P((const wchar_t *haystack, size_t hs_len, const wchar_t *needle, size_t needle_len));
extern const wchar_t *wcasestrstr P((const wchar_t *haystack, size_t hs_len, const wchar_t *needle, size_t needle_len));
+extern void free_wstr P((NODE *n));
+#else
+#define free_wstr(NODE) /* empty */
#endif
/* re.c */
extern Regexp *make_regexp P((const char *s, size_t len, int ignorecase, int dfa));
--- gawk-3.1.5/node.c.freewstr 2007-01-08 12:31:26.000000000 +0100
+++ gawk-3.1.5/node.c 2007-01-08 12:41:48.000000000 +0100
@@ -218,15 +218,7 @@
no_malloc:
s->stref = 1;
s->flags |= STRCUR;
-#if defined MBS_SUPPORT
- if ((s->flags & WSTRCUR) != 0) {
- assert(s->wstptr != NULL);
- free(s->wstptr);
- s->wstptr = NULL;
- s->wstlen = 0;
- s->flags &= ~WSTRCUR;
- }
-#endif
+ free_wstr(s);
return s;
}
@@ -289,8 +281,14 @@
*r = *n;
r->flags &= ~(PERM|TEMP|FIELD);
r->flags |= MALLOC;
-#if defined MBS_SUPPORT
+#ifdef MBS_SUPPORT
+ /*
+ * DON'T call free_wstr(r) here!
+ * r->wstptr still points at n->wstptr's value, and we
+ * don't want to free it!
+ */
r->wstptr = NULL;
+ r->wstlen = 0;
#endif /* defined MBS_SUPPORT */
if (n->type == Node_val && (n->flags & STRCUR) != 0) {
r->stref = 1;
@@ -346,11 +344,7 @@
r->stref = 1;
r->stptr = NULL;
r->stlen = 0;
-#if defined MBS_SUPPORT
- r->wstptr = NULL;
- r->wstlen = 0;
- r->flags &= ~WSTRCUR;
-#endif /* MBS_SUPPORT */
+ free_wstr(r);
#endif /* GAWKDEBUG */
return r;
}
@@ -365,10 +359,11 @@
getnode(r);
r->type = Node_val;
r->flags = (STRING|STRCUR|MALLOC);
-#if defined MBS_SUPPORT
+#ifdef MBS_SUPPORT
r->wstptr = NULL;
r->wstlen = 0;
-#endif
+#endif /* defined MBS_SUPPORT */
+
if (flags & ALREADY_MALLOCED)
r->stptr = s;
else {
@@ -512,20 +507,13 @@
return;
}
free(tmp->stptr);
-#if defined MBS_SUPPORT
- if (tmp->wstptr != NULL) {
- assert((tmp->flags & WSTRCUR) != 0);
- free(tmp->wstptr);
- }
- tmp->flags &= ~WSTRCUR;
- tmp->wstptr = NULL;
- tmp->wstlen = 0;
-#endif
+ free_wstr(tmp);
}
freenode(tmp);
return;
}
if ((tmp->flags & FIELD) != 0) {
+ free_wstr(tmp);
freenode(tmp);
return;
}
@@ -708,11 +696,8 @@
fall through and recompute to fill in the array */
}
- if (n->wstptr != NULL) {
- free(n->wstptr);
- n->wstptr = NULL;
- n->wstlen = 0;
- }
+ if (n->wstptr != NULL)
+ free_wstr(n);
/*
* After consideration and consultation, this
@@ -777,6 +762,20 @@
return n;
}
+/* free_wstr --- release the wide string part of a node */
+
+void
+free_wstr(NODE *n)
+{
+ if ((n->flags & WSTRCUR) != 0) {
+ assert(n->wstptr != NULL);
+ free(n->wstptr);
+ n->wstptr = NULL;
+ n->wstlen = 0;
+ n->flags &= ~WSTRCUR;
+ }
+}
+
#if 0
static void
dump_wstr(FILE *fp, const wchar_t *str, size_t len)
@@ -839,11 +838,10 @@
h = towlower(*start);
n = towlower(needle[j]);
if (h != n)
- goto out;
+ continue;
}
return haystack + i;
}
-out: ;
}
return NULL;
--- gawk-3.1.5/eval.c.freewstr 2007-01-08 12:31:26.000000000 +0100
+++ gawk-3.1.5/eval.c 2007-01-08 12:31:26.000000000 +0100
@@ -1176,13 +1176,7 @@
memcpy(l->stptr + l->stlen, r->stptr, r->stlen);
l->stlen += r->stlen;
l->stptr[l->stlen] = '\0';
-#if defined MBS_SUPPORT
- if (r->wstptr != NULL)
- free(r->wstptr);
- r->wstptr = NULL;
- r->wstlen = 0;
- r->flags &= ~WSTRCUR;
-#endif /* MBS_SUPPORT */
+ free_wstr(l);
} else {
char *nval;
size_t nlen = l->stlen + r->stlen + 2;
Index: gawk.spec
===================================================================
RCS file: /cvs/dist/rpms/gawk/devel/gawk.spec,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -r1.43 -r1.44
--- gawk.spec 19 Jul 2006 21:52:37 -0000 1.43
+++ gawk.spec 11 Jan 2007 08:30:43 -0000 1.44
@@ -1,7 +1,7 @@
Summary: The GNU version of the awk text processing utility.
Name: gawk
Version: 3.1.5
-Release: 11
+Release: 12%{dist}
License: GPL
Group: Applications/Text
Source0: ftp://ftp.gnu.org/gnu/gawk/gawk-%{version}.tar.bz2
@@ -29,6 +29,8 @@
Patch9: gawk-3.1.5-numflags.patch
# IPv6 support
Patch10: gawk-3.1.5-ipv6.patch
+# 222080: double free or corruption
+Patch11: gawk-3.1.5-freewstr.patch
%description
The gawk packages contains the GNU version of awk, a text processing
@@ -50,6 +52,7 @@
%patch8 -p1 -b .syntaxerror
%patch9 -p1 -b .numflag
%patch10 -p1 -b .ipv6
+%patch11 -p1 -b .freewstr
%build
%configure
@@ -98,6 +101,9 @@
%{_datadir}/awk
%changelog
+* Thu Jan 11 2007 Karel Zak <kzak at redhat.com> 3.1.5-12
+- fix #222080 double free or corruption
+
* Wed Jul 19 2006 Karel Zak <kzak at redhat.com> 3.1.5-11
- spec file cleanup
More information about the fedora-cvs-commits
mailing list