mesa: Eliminate multiple va_list usage.
authorJosé Fonseca <jfonseca@vmware.com>
Sat, 24 Apr 2010 19:31:30 +0000 (20:31 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 24 Apr 2010 19:31:30 +0000 (20:31 +0100)
va_list is a mutable iterator. When passed to a function it will likely
point to somewhere else.

This fixes segmentation fault in glean vertProg1 on Ubuntu 9.10.

src/mesa/shader/program_parse.tab.c
src/mesa/shader/program_parse.y

index e5ef25ec38a5acb5e7e5ee1eb4190105c83c8e8d..99c4b2baa5f0e3d4152edc5be59784c20bb799e2 100644 (file)
@@ -5557,7 +5557,6 @@ make_error_string(const char *fmt, ...)
    char *str;
    va_list args;
 
-   va_start(args, fmt);
 
    /* Call vsnprintf once to determine how large the final string is.  Call it
     * again to do the actual formatting.  from the vsnprintf manual page:
@@ -5566,15 +5565,17 @@ make_error_string(const char *fmt, ...)
     *    characters printed  (not including the trailing '\0' used to end
     *    output to strings).
     */
+   va_start(args, fmt);
    length = 1 + vsnprintf(NULL, 0, fmt, args);
+   va_end(args);
 
    str = malloc(length);
    if (str) {
+      va_start(args, fmt);
       vsnprintf(str, length, fmt, args);
+      va_end(args);
    }
 
-   va_end(args);
-
    return str;
 }
 
index 299e2477e485795cd93303ec7aff9140b1c6ad36..06c2db7a07e4d4b69b99960731588ca68caa7c09 100644 (file)
@@ -2596,7 +2596,6 @@ make_error_string(const char *fmt, ...)
    char *str;
    va_list args;
 
-   va_start(args, fmt);
 
    /* Call vsnprintf once to determine how large the final string is.  Call it
     * again to do the actual formatting.  from the vsnprintf manual page:
@@ -2605,15 +2604,17 @@ make_error_string(const char *fmt, ...)
     *    characters printed  (not including the trailing '\0' used to end
     *    output to strings).
     */
+   va_start(args, fmt);
    length = 1 + vsnprintf(NULL, 0, fmt, args);
+   va_end(args);
 
    str = malloc(length);
    if (str) {
+      va_start(args, fmt);
       vsnprintf(str, length, fmt, args);
+      va_end(args);
    }
 
-   va_end(args);
-
    return str;
 }