Fix a memory allocation error: allocate (n+1)*size, not n*(size+1).
[sgt/library] / bheap.c
diff --git a/bheap.c b/bheap.c
index e0157cd..fe32b94 100644 (file)
--- a/bheap.c
+++ b/bheap.c
@@ -1,5 +1,28 @@
 /*
  * Generic reusable binary-heap maintenance code.
+ * 
+ * This file is copyright 2005 Simon Tatham.
+ * 
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT.  IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
  */
 
 #include <stdlib.h>
@@ -71,7 +94,7 @@ bheap *bheap_new(int maxelts, int eltsize, int direction,
      * Allocate one extra element of space, to use for swapping
      * things.
      */
-    bh->elts = malloc(maxelts * (eltsize+1));
+    bh->elts = malloc((maxelts + 1) * eltsize);
     if (!bh->elts)
        return NULL;
 
@@ -341,6 +364,15 @@ int main(void)
 {
     coverage = checked_coverage = 0;
 
+    /* Regression test - this used to report access violations when run under
+     * valgrind. */
+    bh = bheap_new(2, sizeof(int), +1, intcmp, &intcmp_ctx);
+    add(2);
+    add(1);
+    rem(1);
+    rem(2);
+    bheap_free(bh);
+
     bh = bheap_new(MAX, sizeof(int), +1, intcmp, &intcmp_ctx);
 
     /*