c13d7b1af23d1e1a6f015953536e2d74a467fb16 braney Wed Apr 22 17:25:40 2026 -0700 hgc bigBed click: skip intervals that fail to quickLift remap instead of errAborting with an out-of-bounds read. The errAbort message printed fields[3] on a stack-allocated fields[bedSize+seq1Seq2Fields]; for a bigBed3 (e.g. GIAB problematicRegions) that's one past the end, producing garbled binary text in the warning dialog. More importantly, for bedSize==3 there is no name filter before the remap, so every interval in the window was remapped and any single failure aborted the whole page. Match the hgTracks behavior (bigBedTrack.c: continue on NULL) so unmappable items are silently dropped and the clicked item still renders. refs #36335 diff --git src/hg/hgc/bigBedClick.c src/hg/hgc/bigBedClick.c index fbdc6fd038d..97023a9a923 100644 --- src/hg/hgc/bigBedClick.c +++ src/hg/hgc/bigBedClick.c @@ -487,31 +487,31 @@ extraFieldCount = restCount - restBedFields; extraFieldPairs = getExtraFields(tdb, extraFields, extraFieldCount); } } int bbFieldCount = bigBedIntervalToRow(bb, chrom, startBuf, endBuf, fields, bedSize+seq1Seq2Fields); if (bbFieldCount != bedSize+seq1Seq2Fields) { errAbort("Disagreement between trackDb field count (%d) and %s fieldCount (%d)", bedSize, fileName, bbFieldCount); } struct bed *bed = NULL; if (quickLiftFile) { if ((bed = quickLiftIntervalsToBed(bbi, chainHash, bb)) == NULL) - errAbort("can't port %s",fields[3]); + continue; } else { bed = bedLoadN(fields, bedSize); } if ((bed == NULL) || (bedSize >= 6 && scoreFilter && bed->score < minScore)) continue; if (!(bed->chromStart == start && bed->chromEnd == end)) continue; // if there are extra fields, load them up because we may want to use them in URL: itemForUrl = getIdInUrl(tdb, item); printCustomUrlWithFields(tdb, bed->name, bed->name, item == itemForUrl, extraFieldPairs); if (itemForUrl) printIframe(tdb, itemForUrl);