This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH 06/17] Regex: Use re_malloc / re_free consistently.
- From: Paul Eggert <eggert at cs dot ucla dot edu>
- To: Arnold Robbins <arnold at skeeve dot com>, carlos at redhat dot com, libc-alpha at sourceware dot org
- Cc: Gnulib bugs <bug-gnulib at gnu dot org>
- Date: Tue, 19 Dec 2017 15:57:37 -0800
- Subject: Re: [PATCH 06/17] Regex: Use re_malloc / re_free consistently.
- Authentication-results: sourceware.org; auth=none
- References: <201712080916.vB89GxEG005501@skeeve.com>
On 12/08/2017 01:16 AM, Arnold Robbins wrote:
This patch changes several calls to malloc/free into re_malloc/re_free,
bringing consistency to the code.
Thanks, that patch makes sense, but it misses three opportunities to
bring consistency. regcomp.c has one call each to malloc and free, which
should be consistent too. Also, regexec.c has a call to realloc that
should be be changed to re_realloc. A minor formatting issue: one
newly-introduced re_malloc call doesn't need to appear on the next line.
(Possibly we should be adding consistency in the opposite way, by
removing the macros re_free, re_malloc, and re_realloc, and simply using
the underlying C functions. These macros are tricky since they are
function-like but (aside from re_free) cannot be implemented as
functions, and they don't buy much. But that'd be a bigger change.)
I installed the attached patch into Gnulib; it contains the originally
proposed patch 06/17 along with the abovementioned fixups. Something
like this should be easily installable into glibc.
>From ce5d72b85e472ab8c6322b5960b11608d80ad360 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Tue, 19 Dec 2017 15:53:47 -0800
Subject: [PATCH] regex: use re_malloc etc. consistently
Problem and original patch reported by Arnold Robbins in:
https://sourceware.org/ml/libc-alpha/2017-12/msg00241.html
* lib/regcomp.c (re_comp):
* lib/regexec.c (push_fail_stack, build_trtable, match_ctx_clean):
Use re_malloc/re_realloc/re_free instead of malloc/realloc/free.
---
ChangeLog | 9 +++++++++
lib/regcomp.c | 4 ++--
lib/regexec.c | 19 +++++++++----------
3 files changed, 20 insertions(+), 12 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 2c838329f..7d7b10aa2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2017-12-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ regex: use re_malloc etc. consistently
+ Problem and original patch reported by Arnold Robbins in:
+ https://sourceware.org/ml/libc-alpha/2017-12/msg00241.html
+ * lib/regcomp.c (re_comp):
+ * lib/regexec.c (push_fail_stack, build_trtable, match_ctx_clean):
+ Use re_malloc/re_realloc/re_free instead of malloc/realloc/free.
+
2017-12-15 Tim Rühsen <tim.ruehsen@gmx.de>
Paul Eggert <eggert@cs.ucla.edu>
diff --git a/lib/regcomp.c b/lib/regcomp.c
index 88539ad3e..b4bc37353 100644
--- a/lib/regcomp.c
+++ b/lib/regcomp.c
@@ -701,7 +701,7 @@ re_comp (const char *s)
if (re_comp_buf.fastmap == NULL)
{
- re_comp_buf.fastmap = (char *) malloc (SBC_MAX);
+ re_comp_buf.fastmap = re_malloc (char, SBC_MAX);
if (re_comp_buf.fastmap == NULL)
return (char *) gettext (__re_error_msgid
+ __re_error_msgid_idx[(int) REG_ESPACE]);
@@ -1197,7 +1197,7 @@ analyze (regex_t *preg)
break;
if (i == preg->re_nsub)
{
- free (dfa->subexp_map);
+ re_free (dfa->subexp_map);
dfa->subexp_map = NULL;
}
}
diff --git a/lib/regexec.c b/lib/regexec.c
index 262384cfc..5d7ba2a33 100644
--- a/lib/regexec.c
+++ b/lib/regexec.c
@@ -1334,8 +1334,8 @@ push_fail_stack (struct re_fail_stack_t *fs, Idx str_idx, Idx dest_node,
if (fs->num == fs->alloc)
{
struct re_fail_stack_ent_t *new_array;
- new_array = realloc (fs->stack, (sizeof (struct re_fail_stack_ent_t)
- * fs->alloc * 2));
+ new_array = re_realloc (fs->stack, struct re_fail_stack_ent_t,
+ fs->alloc * 2);
if (new_array == NULL)
return REG_ESPACE;
fs->alloc *= 2;
@@ -3319,7 +3319,7 @@ build_trtable (const re_dfa_t *dfa, re_dfastate_t *state)
if (BE (ndests <= 0, 0))
{
if (dests_node_malloced)
- free (dests_alloc);
+ re_free (dests_alloc);
/* Return false in case of an error, true otherwise. */
if (ndests == 0)
{
@@ -3349,18 +3349,17 @@ build_trtable (const re_dfa_t *dfa, re_dfastate_t *state)
alloca (ndests * 3 * sizeof (re_dfastate_t *));
else
{
- dest_states = (re_dfastate_t **)
- malloc (ndests * 3 * sizeof (re_dfastate_t *));
+ dest_states = re_malloc (re_dfastate_t *, ndests * 3);
if (BE (dest_states == NULL, 0))
{
out_free:
if (dest_states_malloced)
- free (dest_states);
+ re_free (dest_states);
re_node_set_free (&follows);
for (i = 0; i < ndests; ++i)
re_node_set_free (dests_node + i);
if (dests_node_malloced)
- free (dests_alloc);
+ re_free (dests_alloc);
return false;
}
dest_states_malloced = true;
@@ -3491,14 +3490,14 @@ out_free:
}
if (dest_states_malloced)
- free (dest_states);
+ re_free (dest_states);
re_node_set_free (&follows);
for (i = 0; i < ndests; ++i)
re_node_set_free (dests_node + i);
if (dests_node_malloced)
- free (dests_alloc);
+ re_free (dests_alloc);
return true;
}
@@ -4166,7 +4165,7 @@ match_ctx_clean (re_match_context_t *mctx)
re_free (top->path->array);
re_free (top->path);
}
- free (top);
+ re_free (top);
}
mctx->nsub_tops = 0;
--
2.14.3