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)