0542bdef848a41fe04a2e043adaaed8eabbaa748 galt Fri Dec 12 11:37:02 2025 -0800 freeMem was crashing for settings values, cannot do that for settings returned from trackDbCache. refs #34544, #36835, #36834 diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c index 4a967f0f4bd..be52da845d8 100644 --- src/hg/lib/trackHub.c +++ src/hg/lib/trackHub.c @@ -891,63 +891,64 @@ if (val == NULL) errAbort("Missing required '%s' setting in hub %s genome %s track %s", setting, hub->url, genome->name, tdb->track); return val; } static void forbidSetting(struct trackHub *hub, struct trackHubGenome *genome, struct trackDb *tdb, char *setting) /* Abort if forbidden setting found. */ { if (trackDbSetting(tdb, setting)) errAbort("Forbidden setting '%s' in hub %s genome %s track %s", setting, hub->url, genome->name, tdb->track); } -static void expandOneUrl(struct hash *settingsHash, char *hubUrl, char *variable) +static void expandOneUrl(struct hash *settingsHash, char *hubUrl, char *variable, boolean canFree) { struct hashEl *hel = hashLookup(settingsHash, variable); if (hel != NULL) { char *oldVal = hel->val; hel->val = trackHubRelativeUrl(hubUrl, oldVal); char *newPath = (char *) hel->val; if (hasProtocol(hubUrl) && !hasProtocol(newPath)) { // allow local url with udc.localDir path prefix char *prefix = cfgOption("udc.localDir"); if (!(prefix && startsWith(prefix, newPath))) { errAbort("setting %s local URL %s not allowed with non-local host URL %s", variable, newPath, hubUrl); } } + if (canFree) freeMem(oldVal); } } static void expandBigDataUrl(struct trackHub *hub, struct trackHubGenome *genome, - struct trackDb *tdb) + struct trackDb *tdb, boolean canFree) /* Expand bigDataUrls so that no longer relative to genome->trackDbFile */ { struct hashEl *hel; struct hashCookie cookie = hashFirst(tdb->settingsHash); while ((hel = hashNext(&cookie)) != NULL) { char *name = hel->name; if (trackSettingIsFile(name)) - expandOneUrl(tdb->settingsHash, genome->trackDbFile, name); + expandOneUrl(tdb->settingsHash, genome->trackDbFile, name, canFree); } } struct trackHubGenome *trackHubFindGenome(struct trackHub *hub, char *genomeName) /* Return trackHubGenome of given name associated with hub. Return NULL if no * such genome. Check genomeName without hub prefix to see if this hub * is attached to an assembly hub.*/ { struct trackHubGenome *ret = hashFindVal(hub->genomeHash, genomeName); if (ret == NULL) ret = hashFindVal(hub->genomeHash, hubConnectSkipHubPrefix(genomeName)); return ret; } @@ -1138,31 +1139,31 @@ char *tabMetaName = hashFindVal(genome->settingsHash, "metaTab"); char *absTabName = NULL; if (tabMetaName) absTabName = trackHubRelativeUrl(hub->url, tabMetaName); char *tagStormName = hashFindVal(genome->settingsHash, "metaDb"); char *absStormName = NULL; if (tagStormName) absStormName = trackHubRelativeUrl(hub->url, tagStormName); /* Make bigDataUrls more absolute rather than relative to genome.ra dir */ struct trackDb *tdb; for (tdb = tdbList; tdb != NULL; tdb = tdb->next) { - expandBigDataUrl(hub, genome, tdb); + expandBigDataUrl(hub, genome, tdb, TRUE); if (absStormName) hashReplace(tdb->settingsHash, "metaDb", absStormName); if (absTabName) hashReplace(tdb->settingsHash, "metaTab", absTabName); } validateTracks(hub, genome, tdbList); trackDbAddTableField(tdbList); if (!isEmpty(hub->name)) trackHubAddNamePrefix(hub->name, tdbList); if ((genome->twoBitPath != NULL) && (*foundFirstGenome == FALSE)) *foundFirstGenome = TRUE; else if ((genome->groups != NULL) && hubsCanAddGroups()) @@ -1935,31 +1936,31 @@ { // we have to open the trackDb file to get the udc cache to check for an update struct udcFile *checkCache = udcFileMayOpen(hubGenome->trackDbFile, NULL); if (checkCache != NULL) { time_t time = udcUpdateTime(checkCache); udcFileClose(&checkCache); struct trackDb *cacheTdb = trackDbHubCache(hubGenome->trackDbFile, time); if (cacheTdb != NULL) { struct trackDb *tdb; for (tdb = cacheTdb; tdb != NULL; tdb = tdb->next) { // disallow local bigDataUrl with non-local hub. - expandBigDataUrl(hubGenome->trackHub, hubGenome, tdb); + expandBigDataUrl(hubGenome->trackHub, hubGenome, tdb, FALSE); } return cacheTdb; } } memCheckPoint(); // we want to know how much memory is used to build the tdbList } struct dyString *incFiles = newDyString(4096); boolean foundFirstGenome = FALSE; tdbList = trackHubTracksForGenome(hubGenome->trackHub, hubGenome, incFiles, &foundFirstGenome); tdbList = trackDbLinkUpGenerations(tdbList); tdbList = trackDbPolishAfterLinkup(tdbList, hubGenome->name); trackDbPrioritizeContainerItems(tdbList); trackHubPolishTrackNames(hubGenome->trackHub, tdbList);