20ca104b9897669e127e4ec8675321b12f780cff
braney
  Tue Aug 18 11:19:44 2026 -0700
lib, hgTracks: encode JSON object keys and configure/search text, refs #38123

diff --git src/hg/lib/jsHelper.c src/hg/lib/jsHelper.c
index 2630ef49915..5c2631a3082 100644
--- src/hg/lib/jsHelper.c
+++ src/hg/lib/jsHelper.c
@@ -525,31 +525,33 @@
     nl = "";
     }
 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;
-                dyStringPrintf(dy,"%s%s\"%s\": ", indentBuf, tab, el->name);
+                // 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));
                 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)