X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=libmudflap%2Fmf-hooks1.c;h=bef22687f195e162176690dc3025cddb5632958c;hp=0700d9a9335fc3f9c192b7c721d6a715ffe95a50;hb=acf503a40b378589b5a392d17c79ec407f46c7bf;hpb=b1df5b265b5f4dc8779eb09c5417cc6c9179c9ae diff --git a/libmudflap/mf-hooks1.c b/libmudflap/mf-hooks1.c index 0700d9a9335..bef22687f19 100644 --- a/libmudflap/mf-hooks1.c +++ b/libmudflap/mf-hooks1.c @@ -108,7 +108,9 @@ WRAPPER(void *, malloc, size_t c) size_with_crumple_zones = CLAMPADD(c,CLAMPADD(__mf_opts.crumple_zone, __mf_opts.crumple_zone)); + BEGIN_MALLOC_PROTECT (); result = (char *) CALL_REAL (malloc, size_with_crumple_zones); + END_MALLOC_PROTECT (); if (LIKELY(result)) { @@ -145,7 +147,9 @@ WRAPPER(void *, calloc, size_t c, size_t n) CLAMPADD((c * n), /* XXX: CLAMPMUL */ CLAMPADD(__mf_opts.crumple_zone, __mf_opts.crumple_zone)); + BEGIN_MALLOC_PROTECT (); result = (char *) CALL_REAL (malloc, size_with_crumple_zones); + END_MALLOC_PROTECT (); if (LIKELY(result)) memset (result, 0, size_with_crumple_zones); @@ -187,7 +191,9 @@ WRAPPER(void *, realloc, void *buf, size_t c) size_with_crumple_zones = CLAMPADD(c, CLAMPADD(__mf_opts.crumple_zone, __mf_opts.crumple_zone)); + BEGIN_MALLOC_PROTECT (); result = (char *) CALL_REAL (realloc, base, size_with_crumple_zones); + END_MALLOC_PROTECT (); /* Ensure heap wiping doesn't occur during this peculiar unregister/reregister pair. */ @@ -272,7 +278,9 @@ WRAPPER(void, free, void *buf) (void *) freeme, __mf_opts.crumple_zone); } + BEGIN_MALLOC_PROTECT (); CALL_REAL (free, freeme); + END_MALLOC_PROTECT (); } } else @@ -287,11 +295,17 @@ WRAPPER(void, free, void *buf) (void *) buf, __mf_opts.crumple_zone); } + BEGIN_MALLOC_PROTECT (); CALL_REAL (free, base); + END_MALLOC_PROTECT (); } } +/* We can only wrap mmap if the target supports it. Likewise for munmap. + We assume we have both if we have mmap. */ +#ifdef HAVE_MMAP + #if PIC /* A special bootstrap variant. */ void * @@ -382,6 +396,7 @@ WRAPPER(int , munmap, void *start, size_t length) } return result; } +#endif /* HAVE_MMAP */ /* This wrapper is a little different, as it's called indirectly from @@ -420,8 +435,10 @@ __mf_wrap_alloca_indirect (size_t c) { struct alloca_tracking *next = alloca_history->next; __mf_unregister (alloca_history->ptr, 0, __MF_TYPE_HEAP); + BEGIN_MALLOC_PROTECT (); CALL_REAL (free, alloca_history->ptr); CALL_REAL (free, alloca_history); + END_MALLOC_PROTECT (); alloca_history = next; } @@ -429,14 +446,20 @@ __mf_wrap_alloca_indirect (size_t c) result = NULL; if (LIKELY (c > 0)) /* alloca(0) causes no allocation. */ { + BEGIN_MALLOC_PROTECT (); track = (struct alloca_tracking *) CALL_REAL (malloc, sizeof (struct alloca_tracking)); + END_MALLOC_PROTECT (); if (LIKELY (track != NULL)) { + BEGIN_MALLOC_PROTECT (); result = CALL_REAL (malloc, c); + END_MALLOC_PROTECT (); if (UNLIKELY (result == NULL)) { + BEGIN_MALLOC_PROTECT (); CALL_REAL (free, track); + END_MALLOC_PROTECT (); /* Too bad. XXX: What about errno? */ } else