Subject: bug#17290: closed (bug#17290: [PATCH] grep: fix for clarify-memory-allocation)

From: [email-masked] (GNU bug Tracking System)
Date: Sat, 19 Apr 2014 01:04:03 +0000

Your bug report

#17290: [PATCH] grep: fix for clarify-memory-allocation

which was filed against the grep package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
17290: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=17290
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: bug#17290: [PATCH] grep: fix for clarify-memory-allocation
From: Norihiro Tanaka <[email-masked]>
To: Paul Eggert <[email-masked]>
Cc: [email-masked]
Date: Sat, 19 Apr 2014 10:03:47 +0900
List-Id: <debbugs-submit.debbugs.gnu.org>

Paul Eggert wrote.
> Perhaps you're using an out-of-date version of gnulib?  That was
> Jim's problem in <http://bugs.gnu.org/17136#19>. 
Sorry, I also neglected to update gnulib.

Subject: [PATCH] grep: fix for clarify-memory-allocation
From: Norihiro Tanaka <[email-masked]>
To: [email-masked]
Date: Fri, 18 Apr 2014 23:02:51 +0900
List-Id: <debbugs-submit.debbugs.gnu.org>

After clarify-memory-allocation, fail in the regression tests and occur
the two warnings in compilation.  Fix them.

Norihiro
From 7982fbc2bae3e23047680efb7f77c1aa548ce970 Mon Sep 17 00:00:00 2001
From: Norihiro Tanaka <[email-masked]>
Date: Fri, 18 Apr 2014 22:44:02 +0900
Subject: [PATCH] grep: fix for clarify-memory-allocation

* src/dfa.c (typedef token): Change ptrdiff_t into size_t.
(typedef state_num): Change ptrdiff_t into size_t.
(struct mb_char_classes): Change ptrdiff_t into size_t.
(dfa_charclass_index): Fix new size to maybe_realloc().
(parse_bracket_exp): Fix new sizes to maybe_realloc().
(addtok): Cast negative integer to size_t.
(insert): Fix new size to maybe_realloc().
(state_index): Fix new size to maybe_realloc().
(match_mb_charset): Cast negative integer to size_t.
src/dfa.h (dfastate): Change ptrdiff_t into size_t.
---
 src/dfa.c | 25 ++++++++++++++-----------
 src/dfa.h |  2 +-
 2 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/src/dfa.c b/src/dfa.c
index eeca257..a355790 100644
--- a/src/dfa.c
+++ b/src/dfa.c
@@ -158,7 +158,7 @@ to_uchar (char ch)
    are operators and others are terminal symbols.  Most (but not all) of these
    codes are returned by the lexical analyzer.  */
 
-typedef ptrdiff_t token;
+typedef size_t token;
 
 /* Predefined token values.  */
 enum
@@ -295,13 +295,13 @@ typedef struct
 
 /* States are indexed by state_num values.  These are normally
    nonnegative but -1 is used as a special value.  */
-typedef ptrdiff_t state_num;
+typedef size_t state_num;
 
 /* A bracket operator.
    e.g., [a-c], [[:alpha:]], etc.  */
 struct mb_char_classes
 {
-  ptrdiff_t cset;
+  size_t cset;
   bool invert;
   wchar_t *chars;               /* Normal characters.  */
   size_t nchars;
@@ -643,7 +643,7 @@ dfa_charclass_index (struct dfa *d, charclass const s)
   for (i = 0; i < d->cindex; ++i)
     if (equal (s, d->charclasses[i]))
       return i;
-  d->charclasses = maybe_realloc (d->charclasses, d->cindex, &d->calloc,
+  d->charclasses = maybe_realloc (d->charclasses, d->cindex + 1, &d->calloc,
                                   sizeof *d->charclasses);
   ++d->cindex;
   copyset (s, d->charclasses[i]);
@@ -987,7 +987,7 @@ parse_bracket_exp (void)
   chars_al = ranges_al = ch_classes_al = equivs_al = coll_elems_al = 0;
   if (MB_CUR_MAX > 1)
     {
-      dfa->mbcsets = maybe_realloc (dfa->mbcsets, dfa->nmbcsets,
+      dfa->mbcsets = maybe_realloc (dfa->mbcsets, dfa->nmbcsets + 1,
                                     &dfa->mbcsets_alloc,
                                     sizeof *dfa->mbcsets);
 
@@ -1068,7 +1068,7 @@ parse_bracket_exp (void)
 
                       work_mbc->ch_classes
                         = maybe_realloc (work_mbc->ch_classes,
-                                         work_mbc->nch_classes, &ch_classes_al,
+                                         work_mbc->nch_classes + 1, &ch_classes_al,
                                          sizeof *work_mbc->ch_classes);
                       work_mbc->ch_classes[work_mbc->nch_classes++] = wt;
                     }
@@ -1132,6 +1132,9 @@ parse_bracket_exp (void)
 
                   if (case_fold && (iswalpha (wc) || iswalpha (wc2)))
                     {
+                      work_mbc->ranges
+                        = maybe_realloc (work_mbc->ranges, work_mbc->nranges + 1,
+                                         &ranges_al, sizeof *work_mbc->ranges);
                       work_mbc->ranges[work_mbc->nranges].beg = towupper (wc);
                       work_mbc->ranges[work_mbc->nranges++].end
                         = towupper (wc2);
@@ -1191,7 +1194,7 @@ parse_bracket_exp (void)
         }
       if (!setbit_wc (wc, ccl))
         {
-          work_mbc->chars = maybe_realloc (work_mbc->chars, work_mbc->nchars,
+          work_mbc->chars = maybe_realloc (work_mbc->chars, work_mbc->nchars + 1,
                                            &chars_al, sizeof *work_mbc->chars);
           work_mbc->chars[work_mbc->nchars++] = wc;
         }
@@ -1635,7 +1638,7 @@ addtok (token t)
         {
           /* Characters have been handled above, so it is possible
              that the mbcset is empty now.  Do nothing in that case.  */
-          if (work_mbc->cset != -1)
+          if (work_mbc->cset != (size_t) -1)
             {
               addtok (CSET + work_mbc->cset);
               if (need_or)
@@ -2004,7 +2007,7 @@ insert (position p, position_set * s)
       return;
     }
 
-  s->elems = maybe_realloc (s->elems, count, &s->alloc, sizeof *s->elems);
+  s->elems = maybe_realloc (s->elems, count + 1, &s->alloc, sizeof *s->elems);
   for (i = count; i > lo; i--)
     s->elems[i] = s->elems[i - 1];
   s->elems[lo] = p;
@@ -2084,7 +2087,7 @@ state_index (struct dfa *d, position_set const *s, int context)
     }
 
   /* We'll have to create a new state.  */
-  d->states = maybe_realloc (d->states, d->sindex, &d->salloc,
+  d->states = maybe_realloc (d->states, d->sindex + 1, &d->salloc,
                              sizeof *d->states);
   d->states[i].hash = hash;
   alloc_position_set (&d->states[i].elems, s->nelem);
@@ -2989,7 +2992,7 @@ match_mb_charset (struct dfa *d, state_num s, position pos,
   match = !work_mbc->invert;
 
   /* Match in range 0-255?  */
-  if (wc < NOTCHAR && work_mbc->cset != -1
+  if (wc < NOTCHAR && work_mbc->cset != (size_t) -1
       && tstbit (to_uchar (wc), d->charclasses[work_mbc->cset]))
     goto charset_matched;
 
diff --git a/src/dfa.h b/src/dfa.h
index db29a62..64ce627 100644
--- a/src/dfa.h
+++ b/src/dfa.h
@@ -96,7 +96,7 @@ extern void dfaanalyze (struct dfa *, int);
 
 /* Compute, for each possible character, the transitions out of a given
    state, storing them in an array of integers. */
-extern void dfastate (ptrdiff_t, struct dfa *, ptrdiff_t []);
+extern void dfastate (size_t, struct dfa *, size_t []);
 
 /* Error handling. */
 
-- 
1.9.2