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<br>\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 */