b388a136dae20cfd65849c2412c3d011ce9b5f12
braney
Tue Aug 18 11:21:42 2026 -0700
hgHubConnect: encode assembly names in the genome list, refs #38123
diff --git src/hg/hgHubConnect/hgHubConnect.c src/hg/hgHubConnect/hgHubConnect.c
index 45270e54649..fb7adbfe078 100644
--- src/hg/hgHubConnect/hgHubConnect.c
+++ src/hg/hgHubConnect/hgHubConnect.c
@@ -127,72 +127,76 @@
#define GENLISTWIDTH 40
static void printGenomeList(char *hubUrl, struct slName *genomes, int row, boolean withLink, boolean withPaste)
/* print supported assembly names from sl list */
{
struct dyString *dyLongHtml = dyStringNew(1024);
struct dyString *dyShortHtml = dyStringNew(1024);
char *linkHtml = "";
// create two strings: one shortened to GENLISTWIDTH characters
// and another one with all genomes
int charCount = 0;
struct slName *genome = genomes;
for(; genome; genome = genome->next)
{
+ // an assembly hub's genome name comes from the hub, so encode it: escName for the query
+ // string, escTrimmed for the text and title attributes
+ char *escName = cgiEncode(genome->name);
char *trimmedName = trackHubSkipHubName(genome->name);
+ char *escTrimmed = htmlEncode(trimmedName);
char *shortName = cloneString(trimmedName);
// If even the first element is too long, truncate its short name.
if (genome==genomes && strlen(trimmedName) > GENLISTWIDTH)
shortName[GENLISTWIDTH] = 0;
// append to dyShortHtml if necessary
if (charCount == 0 || (charCount+strlen(trimmedName)<=GENLISTWIDTH))
{
if (withLink)
{
if (hubConnectIsCurated(genome->name)) {
- dyStringPrintf(dyShortHtml,"%s" , genome->name, hubUrl, genome->name, shortName);
+ dyStringPrintf(dyShortHtml,"%s" , escTrimmed, hubUrl, escName, htmlEncode(shortName));
} else {
- dyStringPrintf(dyShortHtml,"%s" , genome->name, hubUrl, genome->name, shortName);
+ dyStringPrintf(dyShortHtml,"%s" , escTrimmed, hubUrl, escName, htmlEncode(shortName));
}
// https://hgdownload-test.gi.ucsc.edu/hubs/GCA/009/914/755/GCA_009914755.4/hub.txt
if (withPaste)
dyStringPrintf(dyShortHtml, linkHtml, hubUrl);
}
else
- dyStringPrintf(dyShortHtml,"%s" , shortName);
+ dyStringPrintf(dyShortHtml,"%s" , htmlEncode(shortName));
dyStringPrintf(dyShortHtml,", ");
}
freeMem(shortName);
charCount += strlen(trimmedName);
// always append to dyLongHtml
if (withLink)
{
if (hubConnectIsCurated(genome->name)) {
- dyStringPrintf(dyLongHtml,"%s" , genome->name, hubUrl, genome->name, trimmedName);
+ dyStringPrintf(dyLongHtml,"%s" , escTrimmed, hubUrl, escName, escTrimmed);
} else {
- dyStringPrintf(dyLongHtml,"%s" , genome->name, hubUrl, genome->name, trimmedName);
+ dyStringPrintf(dyLongHtml,"%s" , escTrimmed, hubUrl, escName, escTrimmed);
}
if (withPaste)
dyStringPrintf(dyLongHtml, linkHtml, hubUrl);
}
else
- dyStringPrintf(dyLongHtml,"%s" , trimmedName);
+ dyStringPrintf(dyLongHtml,"%s" , escTrimmed);
if (genome->next)
{
dyStringPrintf(dyLongHtml,", ");
}
}
char *longHtml = dyStringCannibalize(&dyLongHtml);
char *shortHtml = dyStringCannibalize(&dyShortHtml);
shortHtml = removeLastComma(shortHtml);
if (charCount < GENLISTWIDTH)
ourPrintCell(shortHtml);
else