]> granicus.if.org Git - graphviz/commitdiff
replace 'gvputs(… xml_url_string(…))' with 'xml_escape(…)'
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Mon, 4 Oct 2021 00:13:29 +0000 (17:13 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Fri, 8 Oct 2021 14:57:43 +0000 (07:57 -0700)
Similar to previous `xml_string` and `xml_string0` related changes, this avoids
dynamic allocations and makes the affected code thread safe.

Related to #1868.

plugin/core/gvrender_core_map.c
plugin/core/gvrender_core_svg.c

index 836bab70cbe2c70bc502f8833ace52cc97b0e9a9..e17a529b87ff9f244288843aef5f391b955c4b74 100644 (file)
 
 typedef enum { FORMAT_IMAP, FORMAT_ISMAP, FORMAT_CMAP, FORMAT_CMAPX, } format_type;
 
+// wrapper around `xml_escape` to set flags for URL escaping
+static void xml_url_puts(GVJ_t *job, const char *s) {
+  const xml_flags_t flags = {0};
+  (void)xml_escape(s, flags, (int(*)(void*, const char*))gvputs, job);
+}
+
 static void map_output_shape (GVJ_t *job, map_shape_t map_shape, pointf * AF, int nump,
                 char* url, char *tooltip, char *target, char *id)
 {
@@ -89,12 +95,12 @@ static void map_output_shape (GVJ_t *job, map_shape_t map_shape, pointf * AF, in
         }
         if (id && id[0]) {
             gvputs(job, " id=\"");
-           gvputs(job, xml_url_string(id));
+           xml_url_puts(job, id);
            gvputs(job, "\"");
        }
         if (url && url[0]) {
             gvputs(job, " href=\"");
-           gvputs(job, xml_url_string(url));
+           xml_url_puts(job, url);
            gvputs(job, "\"");
        }
         if (target && target[0]) {
index 1e94dd3032029a667cab7b5f7689ffd3b2febc8b..24f3a3959775cc7af6c8e224b4ac0ec422438f5d 100644 (file)
@@ -344,7 +344,8 @@ svg_begin_anchor(GVJ_t * job, char *href, char *tooltip, char *target,
                 "<a");
     if (href && href[0]) {
        GVPUTS(job, " xlink:href=\"");
-       gvputs(job, xml_url_string(href));
+       const xml_flags_t flags = {0};
+       xml_escape(href, flags, (int(*)(void*, const char*))gvputs, job);
        GVPUTS(job, "\"");
     }
     if (tooltip && tooltip[0]) {