6cb6aa446254d91c48fb8f750f7408e8b175e361
angie
  Fri Apr 6 10:05:33 2012 -0700
Bugfix for #6152: forgot a sizeof when calling needMoreMem for array. Hurray for valgrind!
diff --git src/hg/lib/annoGrateWig.c src/hg/lib/annoGrateWig.c
index b43840f..edee9b4 100644
--- src/hg/lib/annoGrateWig.c
+++ src/hg/lib/annoGrateWig.c
@@ -1,63 +1,66 @@
 /* annoGrateWig -- subclass of annoGrator for wiggle data */
 
 #include "annoGrateWig.h"
 #include "annoStreamWig.h"
 #include "sqlNum.h"
 #include "wiggle.h"
 
-static void tidyUp(struct annoRow *rowIn, struct annoRow **pOutList,
+static void tidyUp(const struct annoRow *rowIn, struct annoRow **pOutList,
 		   uint primaryStart, uint primaryEnd)
 /* This takes a wiggle chunk coming from a .wig/database row and makes it into
  * zero or more tidy little NAN-less annoRows.  Trim rowIn to the bounds of
  * primary, trim NANs from beginning and break into multiple rows where there
  * are NANs in the middle.  If the rowIn is contiguous with the row at the
  * head of outList, expand that row to include rowIn's data. */
 {
 uint start = max(rowIn->start, primaryStart);
 uint end = min(rowIn->end, primaryEnd);
 float *vector = rowIn->data;
+if (sameString(rowIn->chrom, "chr17_gl000206_random") && rowIn->start > 9000)
+    uglyf("woohoo.\n");
 while (end > start)
     {
     uint offset = start - rowIn->start;
     if (vector[offset] == NAN)
 	start++;
     else
 	{
 	// If there is a NAN before end, that's the end of this row:
 	uint thisEnd = start;
 	while (thisEnd < end && vector[thisEnd - rowIn->start] != NAN)
 	    thisEnd++;
 	struct annoRow *headRow = *pOutList;
 	if (headRow == NULL || rowIn->start > headRow->end)
 	    {
 	    // allocate a new row
 	    struct annoRow *rowOut = annoRowWigNew(rowIn->chrom, start, thisEnd, FALSE,
 						   vector + offset);
 	    slAddHead(pOutList, rowOut);
 	    }
 	else
 	    {
 	    // glom new data onto headRow
 	    assert(thisEnd > headRow->end);
 	    uint oldEnd = headRow->end;
 	    uint oldLen = oldEnd - headRow->start;
 	    uint newLen = thisEnd - headRow->start;
-	    headRow->data = needMoreMem(headRow->data, oldLen, newLen);
+	    headRow->data = needMoreMem(headRow->data, oldLen*sizeof(vector[0]),
+					newLen*sizeof(vector[0]));
 	    headRow->end = thisEnd;
 	    float *newData = (float *)rowIn->data + (oldEnd - rowIn->start);
-	    float *newSpace = (float *)headRow->data + (oldEnd - headRow->start);
+	    float *newSpace = (float *)headRow->data + oldLen;
 	    CopyArray(newData, newSpace, (thisEnd - oldEnd));
 	    }
 	start = thisEnd;
 	}
     }
 }
 
 static struct annoRow *agwdIntegrate(struct annoGrator *self, struct annoRow *primaryRow,
 				     boolean *retRJFilterFailed)
 /* Return wig annoRows that overlap primaryRow position, with NANs weeded out. */
 {
 struct annoRow *rowsIn = annoGratorIntegrate(self, primaryRow, retRJFilterFailed);
 if (retRJFilterFailed && *retRJFilterFailed)
     return NULL;
 struct annoRow *rowIn, *rowOutList = NULL;;