bug-gnu-utils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: gawk long lines bug?


From: Paul Eggert
Subject: Re: gawk long lines bug?
Date: Sun, 17 Feb 2002 23:05:18 -0800 (PST)

> From: Aharon Robbins <address@hidden>
> Date: Sun, 17 Feb 2002 15:09:18 +0200
> 
> The problem is that the regex routines return -2 indicating that they
> couldn't allocate enough memory to handle the long string

That -2 doesn't mean that they couldn't allocate enough memory; it
means that they merely went over a heuristic limit designed to prevent
them from allocating too much memory on the C stack.  This heuristic
doesn't apply to gawk, since it compiles with REGEX_MALLOC.

This is clearly a bug in regex.c, but there's an easy workaround:
raise that heuristic limit to be as high as possible.  That way, you
won't run into this silly limit until much later.

The following patch causes 'gawk' to work correctly on that test case,
without any error.

2002-02-17  Paul Eggert  <address@hidden>

        * re.c (resetup): Try to avoid silly limitation of regex.c by
        setting re_max_failures to the largest reasonable value.

===================================================================
RCS file: re.c,v
retrieving revision 3.1.0.1
retrieving revision 3.1.0.2
diff -pu -r3.1.0.1 -r3.1.0.2
--- re.c        2002/02/18 05:45:27     3.1.0.1
+++ re.c        2002/02/18 06:58:40     3.1.0.2
@@ -245,6 +245,18 @@ re_update(NODE *t)
 void
 resetup()
 {
+       /*
+        * Set RE_MAX_FAILURES to the largest reasonable value,
+        * to avoid spurious "not enough memory" messages.
+        * The '80' is computed as follows:
+        * regex.c's MAX_FAILURE_ITEMS is at most 20.
+        * regex.c computes 2 * MAX_FAILURE_ITEMS, giving us 40.
+        * re_max_failures is signed, not unsigned, for another factor of 2,
+        * giving us 80.
+        */
+       extern int re_max_failures;
+       re_max_failures = ((unsigned) -1) / 80;
+
        if (do_posix)
                syn = RE_SYNTAX_POSIX_AWK;      /* strict POSIX re's */
        else if (do_traditional)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]