e08ae97dc288749c2454fd98a10dc79f06e27cb5 max Tue Aug 11 06:16:20 2026 -0700 hgBlat/hgc: fixes from the v502 code review of the BLAT results pages, refs #37893 #4 blatOldTracks now falls back to "keep" (with a warning) on any value other than keep/hide/delete, instead of dropping into the destructive delete branch, so a typo in hg.conf can never silently discard a user's earlier BLAT tracks. #5 htmlEncode() (js/utils.js) now also escapes " and ', which the browser's text->markup conversion leaves alone. Every hgBlat caller puts the result in a double-quoted attribute, so an unescaped quote in the cart position string could break out of the attribute; the shared helper now honors its documented contract. #6 The non-BLAT alignment title no longer starts with a stray space. #7 open_memstream() is checked for NULL: on that failure the alignment renders straight to stdout instead of writing to a NULL FILE and calling fclose(NULL). The section reorder keys on the literal "
Genome sequence %s is also known as: %s.
\n", chrom, aliasStr); /* The shared library returns the number of alignment blocks it actually shows. The DNA path merges * blocks separated by gaps <= 8 bases, so this can be fewer than psl->blockCount; use it (not * psl->blockCount) so the sidebar's "Block N" links match the #1..#N anchors that were emitted. */ int blockCount; /* Capture the shared library's alignment HTML so we can reorder its sections for this page. The * library emits them as Query (#cDNA), Genome (#genomic), then Side-by-side (#ali), with the * per-block anchors living inside the Genome section. We want Query, Side-by-side, Genome so the * long per-block list sits at the bottom of both the page and the sidebar. Reorder here, on the * server, rather than in JS, so the page does not reflow after it loads. */ char *alnHtml = NULL; size_t alnLen = 0; FILE *alnF = open_memstream(&alnHtml, &alnLen); +if (alnF == NULL) + { + /* open_memstream failed (out of memory): render straight to stdout, skipping the section + * reorder, rather than passing a NULL FILE to the renderer and then calling fclose(NULL). */ + if (qType == gftRna || qType == gftDna) + blockCount = showPartialDnaAlignment(psl, oSeq, stdout, cdsS, cdsE, FALSE); + else + blockCount = showGfAlignment(psl, oSeq, stdout, qType, qStart, qEnd, qName); + } +else + { if (qType == gftRna || qType == gftDna) blockCount = showPartialDnaAlignment(psl, oSeq, alnF, cdsS, cdsE, FALSE); else blockCount = showGfAlignment(psl, oSeq, alnF, qType, qStart, qEnd, qName); fclose(alnF); char *pGenome = (alnHtml != NULL) ? stringIn("