]> granicus.if.org Git - graphviz/commitdiff
common fullColor: use an agxbuf instead of a static buffer
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 28 Jan 2023 16:36:48 +0000 (08:36 -0800)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Mon, 30 Jan 2023 15:43:10 +0000 (07:43 -0800)
This improves safety by removing an `sprintf` usage as well as removing a long
lived static buffer that can prove problematic for tools like Valgrind and
Address Sanitizer.

Gitlab: #1950

lib/common/colxlate.c

index 59132ef52967e4a7376dba9c9b9a9b6f3dc16e75..d4a967f2197044694459830685e2d3c1a9d50b68 100644 (file)
@@ -159,18 +159,9 @@ char *canontoken(char *str)
 /* fullColor:
  * Return "/prefix/str"
  */
-static char* fullColor (char* prefix, char* str)
-{
-    static char *fulls;
-    static size_t allocated;
-    size_t len = strlen(prefix) + strlen(str) + 3;
-
-    if (len >= allocated) {
-       allocated = len + 10;
-       fulls = grealloc(fulls, allocated);
-    }
-    sprintf (fulls, "/%s/%s", prefix, str);
-    return fulls;
+static char *fullColor(agxbuf *xb, char *prefix, char *str) {
+  agxbprint(xb, "/%s/%s", prefix, str);
+  return agxbuse(xb);
 }
 
 /* resolveColor:
@@ -218,13 +209,14 @@ static char* resolveColor (char* str)
     if (!strcmp(str, "black")) return str;
     if (!strcmp(str, "white")) return str;
     if (!strcmp(str, "lightgrey")) return str;
+    agxbuf xb = {0};
     if (*str == '/') {   /* if begins with '/' */
        c2 = str+1;
         if ((ss = strchr(c2, '/'))) {  /* if has second '/' */
            if (*c2 == '/') {    /* if second '/' is second character */
                    /* Do not compare against final '/' */
                if (ISNONDFLT(colorscheme))
-                   s = fullColor (colorscheme, c2+1);
+                   s = fullColor(&xb, colorscheme, c2+1);
                else
                    s = c2+1;
            }
@@ -233,9 +225,11 @@ static char* resolveColor (char* str)
        }
        else s = c2;
     }
-    else if (ISNONDFLT(colorscheme)) s = fullColor (colorscheme, str);
+    else if (ISNONDFLT(colorscheme)) s = fullColor(&xb, colorscheme, str);
     else s = str;
-    return canontoken(s);
+    s = canontoken(s);
+    agxbfree(&xb);
+    return s;
 }
 
 int colorxlate(char *str, gvcolor_t * color, color_type_t target_type)