bin/102299: grep(1) malloc abuse?
Devon H. O'Dell
devon.odell at coyotepoint.com
Wed Sep 13 14:20:28 PDT 2006
The following reply was made to PR bin/102299; it has been noted by GNATS.
From: "Devon H. O'Dell" <devon.odell at coyotepoint.com>
To: bug-followup at FreeBSD.org, matthias.andree at gmx.de,
Thomas Quinot <thomas at FreeBSD.ORG>,
tjr at FreeBSD.org
Cc:
Subject: Re: bin/102299: grep(1) malloc abuse?
Date: Wed, 13 Sep 2006 17:12:26 -0400
This is a multi-part message in MIME format.
--------------050600010302050802000303
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Turns out the problem is in libgnuregex. The attached patch solves the
problem. I followed the instructions from FREEBSD-upgrade, removing the
release tag, and the current vendor branch does not fix this issue.
Attached is a patch that fixes the issue for me and doesn't seem to
cause any regressions whatsoever.
Patch also available at http://databits.net/~dho/regex_internal.patch
I'm not sure whether submitting this patch to the vendor is terribly
useful, since this is part of glibc in Linux and their malloc doesn't
have this behavior.
Kind regards,
Devon H. O'Dell
--------------050600010302050802000303
Content-Type: text/plain;
name="regex_internal.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="regex_internal.patch"
--- gnu/lib/libregex/regex_internal.c.old Wed Sep 13 16:23:37 2006
+++ gnu/lib/libregex/regex_internal.c Wed Sep 13 16:22:55 2006
@@ -1501,9 +1501,17 @@
int i;
newstate->hash = hash;
- err = re_node_set_alloc (&newstate->non_eps_nodes, newstate->nodes.nelem);
- if (BE (err != REG_NOERROR, 0))
- return REG_ESPACE;
+
+ /*
+ * Allocating with a length of 0 has undefined behavior, and we recover from
+ * this error later on in the function. So don't do it.
+ */
+ if (newstate->nodes.nelem != 0) {
+ err = re_node_set_alloc (&newstate->non_eps_nodes, newstate->nodes.nelem);
+ if (BE (err != REG_NOERROR, 0))
+ return REG_ESPACE;
+ }
+
for (i = 0; i < newstate->nodes.nelem; i++)
{
int elem = newstate->nodes.elems[i];
--------------050600010302050802000303--
More information about the freebsd-bugs
mailing list