diff --git a/libguile/ChangeLog b/libguile/ChangeLog index 85578f834..4974246d9 100644 --- a/libguile/ChangeLog +++ b/libguile/ChangeLog @@ -1,3 +1,10 @@ +2003-05-14 Han-Wen Nienhuys + + * gc-malloc.c (scm_gc_register_collectable_memory): avoid + wrap-around for scm_mtrigger + (scm_gc_register_collectable_memory): abort on overflowing + scm_mallocated(). + 2003-05-13 Kevin Ryde * numbers.c (xmpz_cmp_d): New macro, handling infs if gmp doesn't. diff --git a/libguile/gc-malloc.c b/libguile/gc-malloc.c index 7f14f1635..dd8e683e0 100644 --- a/libguile/gc-malloc.c +++ b/libguile/gc-malloc.c @@ -180,6 +180,11 @@ scm_strdup (const char *str) void scm_gc_register_collectable_memory (void *mem, size_t size, const char *what) { + if (ULONG_MAX - size < scm_mallocated) + { + scm_memory_error ("Overflow of scm_mallocated: too much memory in use."); + } + scm_mallocated += size; /* @@ -230,7 +235,12 @@ scm_gc_register_collectable_memory (void *mem, size_t size, const char *what) float no_overflow_trigger = scm_mallocated * 110.0; no_overflow_trigger /= (float) (100.0 - scm_i_minyield_malloc); - scm_mtrigger = (unsigned long) no_overflow_trigger; + + + if (no_overflow_trigger >= (float) ULONG_MAX) + scm_mtrigger = ULONG_MAX; + else + scm_mtrigger = (unsigned long) no_overflow_trigger; #ifdef DEBUGINFO fprintf (stderr, "Mtrigger sweep: ineffective. New trigger %d\n", @@ -268,7 +278,6 @@ scm_gc_malloc (size_t size, const char *what) again in scm_gc_register_collectable_memory. We don't really want the second GC since it will not find new garbage. - Note: this is a theoretical peeve. In reality, malloc() never returns NULL. Usually, memory is overcommitted, and when you try to write it the program is killed with signal 11. --hwn