535457b618d5a08927870d96f16fa900cc4a91ab
braney
  Wed Aug 19 18:08:44 2026 -0700
gtexTracks: match the guard on the description abbreviation to the bytes it writes, no redmine

diff --git src/hg/hgTracks/gtexTracks.c src/hg/hgTracks/gtexTracks.c
index 4acd36797e7..a0dd2a0c30e 100644
--- src/hg/hgTracks/gtexTracks.c
+++ src/hg/hgTracks/gtexTracks.c
@@ -494,31 +494,32 @@
     geneInfo->geneModel = hashFindVal(modelHash, geneBed->geneId); // sometimes this is missing, hash returns NULL. do we check?
     // NOTE: Consider loading all gene descriptions to save queries
     char query[256];
     sqlSafef(query, sizeof(query),
             "select kgXref.description from kgXref where geneSymbol='%s'", geneBed->name);
     char *knownDatabase = hdbDefaultKnownDb(database);
     struct sqlConnection *conn = hAllocConn(knownDatabase);
     char *desc = sqlQuickString(conn, query);
     hFreeConn(&conn);
     if (desc)
         {
         // hg38 known genes has extra detail about source; strip it
         char *fromDetail = strstrNoCase(desc, "(from");
         if (fromDetail)
             *fromDetail = 0;
-        if (strlen(desc) > MAX_DESC)
+        // the "..." plus its terminating null needs MAX_DESC+4 bytes of buffer
+        if (strlen(desc) > MAX_DESC + 4)
             strcpy(desc+MAX_DESC, "...");
         // also strip 'homo sapiens' prefix
         #define SPECIES_PREFIX  "Homo sapiens "
         if (startsWith(SPECIES_PREFIX, desc))
             desc += strlen(SPECIES_PREFIX);
         geneInfo->description = desc;
         }
     else
         geneInfo->description = geneInfo->geneBed->name;
 
     slAddHead(&list, geneInfo);
     geneBed = geneBed->next;
     geneInfo->geneBed->next = NULL;
 
     if (extras->isComparison && (tg->visibility == tvFull || tg->visibility == tvPack))