65d2977c726c1639d4a463f8178e43c08704f173
jcasper
  Fri Feb 21 15:33:35 2025 -0800
hgConvert should errAbort when it can't find a chain file instead of crashing, refs #35271

diff --git src/hg/hgConvert/hgConvert.c src/hg/hgConvert/hgConvert.c
index 0e3c59fddfd..4bf139d49ad 100644
--- src/hg/hgConvert/hgConvert.c
+++ src/hg/hgConvert/hgConvert.c
@@ -267,40 +267,47 @@
     next = chain->next;
     chainSubsetOnT(chain, start, end, &subChain, &chainToFree);
     if (subChain != NULL)
 	slAddHead(&chainList, subChain);
     if (chainToFree != NULL)
         chainFree(&chain);
     }
 slSort(&chainList, chainCmpScore);
 return chainList;
 }
 
 static void doConvert(char *fromPos)
 /* Actually do the conversion */
 {
 struct dbDb *fromDb = hDbDb(trackHubSkipHubName(database)), *toDb = hDbDb(cartString(cart, HGLFT_TODB_VAR));
+if (!fromDb || !toDb)
+    errAbort("Early error - unable to find matching database records in dbDb - please contact support");
+
+cartWebStart(cart, database, "%s %s %s to %s %s", fromDb->organism, fromDb->description,
+	fromPos, toDb->organism, toDb->description);
+
 char *fileName = liftOverChainFile(fromDb->name, toDb->name);
+if (isEmpty(fileName))
+    errAbort("Unable to find a chain file from %s to %s - please contact support", fromDb->name, toDb->name);
+
 fileName = hReplaceGbdbMustDownload(fileName);
 char *chrom;
 int start, end;
 int origSize;
 struct chain *chainList, *chain;
 struct dyString *visDy = NULL;
 
-cartWebStart(cart, database, "%s %s %s to %s %s", fromDb->organism, fromDb->description,
-	fromPos, toDb->organism, toDb->description);
 if (!hgParseChromRange(database, fromPos, &chrom, &start, &end))
     errAbort("position %s is not in chrom:start-end format", fromPos);
 origSize = end - start;
 
 boolean doQuickLift = cartUsualBoolean(cart, "doQuickLift", FALSE);
 cartRemove(cart, "doQuickLift");
 
 unsigned quickChain = 0;
 unsigned quickHub = 0;
 
 if (doQuickLift)
     {
     quickChain = quickLiftGetChain(fromDb->name, toDb->name);
 
     if (quickChain == 0)