]> granicus.if.org Git - flex/commitdiff
scanner: fix regcomp's error reporting, double malloc.
authorExplorer09 <explorer09@gmail.com>
Fri, 3 Feb 2017 12:53:24 +0000 (20:53 +0800)
committerWill Estes <westes575@gmail.com>
Mon, 6 Feb 2017 16:37:18 +0000 (11:37 -0500)
Fix unneeded double malloc - let regerror(). Write its message after
our "regcomp for (regex) failed: " string.

Also, errbuf cannot be free()'d because of flexfatal containing a
longjmp.

src/regex.c

index 2eacaccc8d47ffe0f3c1382e8643474169af9eab..38e658bdf2318996e3623c07f73df27ced58976c 100644 (file)
@@ -54,21 +54,17 @@ void flex_regcomp(regex_t *preg, const char *regex, int cflags)
        memset (preg, 0, sizeof (regex_t));
 
        if ((err = regcomp (preg, regex, cflags)) != 0) {
-        const size_t errbuf_sz = 200;
-        char *errbuf, *rxerr;
+               const size_t errbuf_sz = 200;
+               char *errbuf;
+               int n;
 
                errbuf = malloc(errbuf_sz * sizeof(char));
                if (!errbuf)
                        flexfatal(_("Unable to allocate buffer to report regcomp"));
-               rxerr = malloc(errbuf_sz * sizeof(char));
-               if (!rxerr)
-                       flexfatal(_("Unable to allocate buffer for regerror"));
-               regerror (err, preg, rxerr, errbuf_sz);
-               snprintf (errbuf, errbuf_sz, "regcomp for \"%s\" failed: %s", regex, rxerr);
-
-               flexfatal (errbuf);
-        free(errbuf);
-        free(rxerr);
+               n = snprintf(errbuf, errbuf_sz, "regcomp for \"%s\" failed: ", regex);
+               regerror(err, preg, errbuf+n, errbuf_sz-(size_t)n);
+
+               flexfatal (errbuf); /* never returns - no need to free(errbuf) */
        }
 }