b88e4615c7ce7ea3f0d05c84365509670493840c
braney
  Tue Aug 18 14:49:17 2026 -0700
lib, hgc, hgTracks: small output-encoding cleanups, refs #38123

diff --git src/hg/lib/jsHelper.c src/hg/lib/jsHelper.c
index 5c2631a3082..6b3b5076c08 100644
--- src/hg/lib/jsHelper.c
+++ src/hg/lib/jsHelper.c
@@ -527,31 +527,33 @@
 char *indentBuf = makeIndentBuf(indentLevel);
 switch (ele->type)
     {
     case jsonObject:
         {
         dyStringPrintf(dy,"{%s",nl);
         if(hashNumEntries(ele->val.jeHash))
             {
             struct hashEl *el, *list = hashElListHash(ele->val.jeHash);
             slSort(&list, hashElCmp);
             for (el = list; el != NULL; el = el->next)
                 {
                 struct jsonElement *val = el->val;
                 // the key is not always a literal: an assembly hub's genome name ends up here,
                 // so it is encoded the same way a string value is
-                dyStringPrintf(dy,"%s%s\"%s\": ", indentBuf, tab, jsonStringEscape(el->name));
+                char *escapedName = jsonStringEscape(el->name);
+                dyStringPrintf(dy,"%s%s\"%s\": ", indentBuf, tab, escapedName);
+                freeMem(escapedName);
                 jsonDyStringPrintRecurse(dy, val, indentLevel);
                 dyStringPrintf(dy,"%s%s", el->next == NULL ? "" : ",",nl);
                 }
             hashElFreeList(&list);
             }
         dyStringPrintf(dy,"%s}", indentBuf);
         break;
         }
     case jsonList:
         {
         struct slRef *el;
         dyStringPrintf(dy,"[%s",nl);
         if(ele->val.jeList)
             {
             for (el = ele->val.jeList; el != NULL; el = el->next)