e81403a315a24af601884b8a19e89bcecc92f267
galt
  Sat Dec 8 20:04:28 2018 -0800
Fixing hFindSplitTable and its use. Standard size, give real string size so no undetected overflows. Test result and abort if not found. Avoids SQL errors that otherwise will popup. Handles uninitialzed stack better for the output name. refs #22596.

diff --git src/hg/hgc/retroClick.c src/hg/hgc/retroClick.c
index 024e359..a711d85 100644
--- src/hg/hgc/retroClick.c
+++ src/hg/hgc/retroClick.c
@@ -250,35 +250,36 @@
         }
     sqlFreeResult(&sr);
     }
 else
     printf("<TR><TH>table %s not found </TR>", orthoTable);
 printf("</TBODY></TABLE>\n");
 }
 
 static struct psl *loadPslRangeT(char *table, char *qName, char *tName, int tStart, int tEnd)
 /* Load a list of psls given qName tName tStart tEnd */
 {
 struct sqlResult *sr = NULL;
 char **row;
 struct psl *psl = NULL, *pslList = NULL;
 boolean hasBin;
-char splitTable[64];
+char splitTable[HDB_MAX_TABLE_STRING];
 char query[256];
 struct sqlConnection *conn = hAllocConn(database);
 
-hFindSplitTable(database, seqName, table, splitTable, &hasBin);
+if (!hFindSplitTable(database, seqName, table, splitTable, sizeof splitTable, &hasBin))
+    errAbort("track %s not found", table);
 sqlSafef(query, sizeof(query), "select * from %s where qName = '%s' and tName = '%s' and tEnd > %d and tStart < %d", splitTable, qName, tName, tStart, tEnd);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     psl = pslLoad(row+hasBin);
     slAddHead(&pslList, psl);
     }
 sqlFreeResult(&sr);
 slReverse(&pslList);
 hFreeConn(&conn);
 return pslList;
 }
 
 /* get overlap with psl and set the number of overlapping blocks to numBlocks */
 int getOverlap(struct psl *psl, int start, int end, int *numBlocks)
@@ -755,41 +756,42 @@
       "from %s g, %s c "
       "where g.acc=\"%s\" and g.cds=c.id",
       gbCdnaInfoTable, cdsTable, mi->gbAcc);
 
 sr = sqlMustGetResult(conn, query);
 row = sqlNextRow(sr);
 if ((row == NULL) || !genbankCdsParse(row[0], &cds))
     ZeroVar(&cds);  /* can't get or parse cds */
 sqlFreeResult(&sr);
 return cds;
 }
 
 static struct psl *loadAlign(struct sqlConnection *conn, struct mappingInfo *mi, int start)
 /* load a psl that must exist */
 {
-char rootTable[256], table[256], query[256];
+char rootTable[256], table[HDB_MAX_TABLE_STRING], query[256];
 boolean hasBin;
 struct sqlResult *sr;
 char **row;
 struct psl *psl;
 
 if (mi->suffix == NULL)
     safef(rootTable, sizeof(rootTable), "%s%sAli", mi->tblPre, mi->geneSet);
 else
     safef(rootTable, sizeof(rootTable), "%s%sAli%s", mi->tblPre, mi->geneSet,mi->suffix);
-hFindSplitTable(database, seqName, rootTable, table, &hasBin);
+if (!hFindSplitTable(database, seqName, rootTable, table, sizeof table, &hasBin))
+    errAbort("track %s not found", rootTable);
 
 sqlSafef(query, sizeof(query), "select * from %s where qName = '%s' and tStart = %d",
       table, mi->pg->name, start);
 sr = sqlMustGetResult(conn, query);
 row = sqlNextRow(sr);
 psl = pslLoad(row+hasBin);
 sqlFreeResult(&sr);
 return psl;
 }
 
 void retroShowCdnaAli(char *mappedId)
 /* Show alignment for accession, mostly ripped off from htcCdnaAli */
 {
 char *track = cartString(cart, "aliTable");
 struct trackDb *tdb = hashMustFindVal(trackHash, track);