648f90bb5f2bbbf365a7005a69fdfa82c37057e0
galt
  Fri Dec 12 14:57:29 2025 -0800
Revert "freeMem was crashing for settings values, cannot do that for settings returned from trackDbCache. refs #34544, #36835, #36834"

This reverts commit 0542bdef848a41fe04a2e043adaaed8eabbaa748.

Brian asked me to revert his for now.

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index be52da845d8..4a967f0f4bd 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -891,64 +891,63 @@
 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, boolean canFree)
+static void expandOneUrl(struct hash *settingsHash, char *hubUrl, char *variable)
 {
 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, boolean canFree)
+	struct trackDb *tdb)
 /* 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, canFree);
+	expandOneUrl(tdb->settingsHash, genome->trackDbFile, name);
     }
 }
 
 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;
 }
 
@@ -1139,31 +1138,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, TRUE);
+    expandBigDataUrl(hub, genome, tdb);
     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())
@@ -1936,31 +1935,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, FALSE);
+		    expandBigDataUrl(hubGenome->trackHub, hubGenome, tdb);
 		    }
                 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);