diff --git a/CHANGES b/CHANGES index 3546ab6b90..e6e19d106c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +2850. [bug] If isc_heap_insert() failed due to memory shortage + the heap would have corrupted entries. + 2849. [bug] Don't treat errors from the xml2 library as fatal. [RT #20945] diff --git a/lib/isc/heap.c b/lib/isc/heap.c index 91d78c06d4..7f50eac524 100644 --- a/lib/isc/heap.c +++ b/lib/isc/heap.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: heap.c,v 1.37 2007/10/19 17:15:53 explorer Exp $ */ +/* $Id: heap.c,v 1.38 2010/02/04 23:22:05 jinmei Exp $ */ /*! \file * Heap implementation of priority queues adapted from the following: @@ -186,15 +186,17 @@ sink_down(isc_heap_t *heap, unsigned int i, void *elt) { isc_result_t isc_heap_insert(isc_heap_t *heap, void *elt) { - unsigned int i; + unsigned int new_last; REQUIRE(VALID_HEAP(heap)); - i = ++heap->last; - if (heap->last >= heap->size && !resize(heap)) + new_last = heap->last + 1; + RUNTIME_CHECK(new_last > 0); /* overflow check */ + if (new_last >= heap->size && !resize(heap)) return (ISC_R_NOMEMORY); + heap->last = new_last; - float_up(heap, i, elt); + float_up(heap, new_last, elt); return (ISC_R_SUCCESS); }