267d50f1ab8b8d44f78368830f8c7658e5b73e2d tdreszer Mon Jan 28 15:08:53 2013 -0800 Targeted change to fetchCodons() to avoid seg fault when calculated sequence length is less than or equal to zero. diff --git src/hg/lib/pgSnp.c src/hg/lib/pgSnp.c index e777f12..0ebfeaf 100644 --- src/hg/lib/pgSnp.c +++ src/hg/lib/pgSnp.c @@ -272,46 +272,52 @@ rv->cdEnd = rv->cdStart + 3; /* end of first codon */ rv->regStart = cPos; rv->regEnd = cPos + (chrEnd - chrStart); //printf("TESTING d = %d cdSt = %d cdEnd = %d reg %d - %d frame=%d\n", d, rv->cdStart, rv->cdEnd, rv->regStart, rv->regEnd, frame); /* more than 1 codon? */ while (rv->regEnd > rv->cdEnd) rv->cdEnd += 3; struct dyString *seq = newDyString(1024); /* check prev exon, chrom order not cds order */ if (rv->cdStart < codStart && posStrand) { int st = rv->cdStart; int end = codStart - 1; cStart = gene->chromStart + gene->chromStarts[i-1] + gene->blockSizes[i-1] - (end - st); cEnd = gene->chromStart + gene->chromStarts[i-1] + gene->blockSizes[i-1]; + if (cStart < cEnd) + { struct dnaSeq *s = hDnaFromSeq(db, gene->chrom, cStart, cEnd, dnaUpper); dyStringPrintf(seq, "%s", s->dna); //freeDnaSeq(&s); } + } else if (!posStrand && rv->cdEnd >= (codStart + gene->blockSizes[i])) { int st = codStart + gene->blockSizes[i] - 1; int end = rv->cdEnd; cEnd = gene->chromStart + gene->chromStarts[i-1] + gene->blockSizes[i-1]; cStart = gene->chromStart + gene->chromStarts[i-1] + gene->blockSizes[i-1] - (end - st); -//error here? + if (cStart < cEnd) + { struct dnaSeq *s = hDnaFromSeq(db, gene->chrom, cStart, cEnd, dnaUpper); dyStringPrintf(seq, "%s", s->dna); + //error here? //printf("TESTING got seq=%s
\n", s->dna); //freeDnaSeq(&s); } + } /* get sequence needed from this exon */ int st = rv->cdStart; if (rv->cdStart < codStart) st = codStart - 1; int end = rv->cdEnd; if (rv->cdEnd > (codStart + gene->blockSizes[i] - 1)) end = codStart + gene->blockSizes[i] - 1; if (posStrand) { cStart = gene->chromStart + gene->chromStarts[i] + (st - codStart + 1); cEnd = gene->chromStart + gene->chromStarts[i] + (end - codStart + 1); } else { /* minus strand coding start == chromEnd */