* malloc/arena.c (ptmalloc_init): Recognize MALLOC_PERTURB_ and call

mallopt appropriately.
	* malloc/malloc.h: Define M_PERTURB.
	* malloc/malloc.c (perturb_byte): New variable.
	(alloc_perturb, free_perturb): New macros.
	(_int_malloc): Before returning, overwrite the memory if this is
	requested.
	(_int_free): Overwrite freed memory if requested.
	(mALLOPt): Handle M_PERTURB.
	* test-skeleton.c: Add call to mallopt with M_PERTURB command.
This commit is contained in:
Ulrich Drepper 2005-03-08 00:50:21 +00:00
parent a5a33449fb
commit 854278dff8
4 changed files with 72 additions and 16 deletions

View File

@ -1,5 +1,16 @@
2005-03-07 Ulrich Drepper <drepper@redhat.com> 2005-03-07 Ulrich Drepper <drepper@redhat.com>
* malloc/arena.c (ptmalloc_init): Recognize MALLOC_PERTURB_ and call
mallopt appropriately.
* malloc/malloc.h: Define M_PERTURB.
* malloc/malloc.c (perturb_byte): New variable.
(alloc_perturb, free_perturb): New macros.
(_int_malloc): Before returning, overwrite the memory if this is
requested.
(_int_free): Overwrite freed memory if requested.
(mALLOPt): Handle M_PERTURB.
* test-skeleton.c: Add call to mallopt with M_PERTURB command.
* elf/dl-close.c (_dl_close): Decrement l_opencount before * elf/dl-close.c (_dl_close): Decrement l_opencount before
printing debug message. printing debug message.
* elf/dl-open.c (dl_open_worker): Always print the new opencount * elf/dl-open.c (dl_open_worker): Always print the new opencount

View File

@ -2359,6 +2359,14 @@ void weak_variable (*__after_morecore_hook) (void) = NULL;
static int check_action = DEFAULT_CHECK_ACTION; static int check_action = DEFAULT_CHECK_ACTION;
/* ------------------ Testing support ----------------------------------*/
static int perturb_byte;
#define alloc_perturb(p, n) memset (p, (perturb_byte ^ 0xff) & 0xff, n)
#define free_perturb(p, n) memset (p, perturb_byte & 0xff, n)
/* ------------------- Support for multiple arenas -------------------- */ /* ------------------- Support for multiple arenas -------------------- */
#include "arena.c" #include "arena.c"
@ -3859,7 +3867,10 @@ _int_malloc(mstate av, size_t bytes)
chunk2mem (victim)); chunk2mem (victim));
*fb = victim->fd; *fb = victim->fd;
check_remalloced_chunk(av, victim, nb); check_remalloced_chunk(av, victim, nb);
return chunk2mem(victim); void *p = chunk2mem(victim);
if (__builtin_expect (perturb_byte, 0))
alloc_perturb (p, bytes);
return p;
} }
} }
@ -3887,7 +3898,10 @@ _int_malloc(mstate av, size_t bytes)
if (av != &main_arena) if (av != &main_arena)
victim->size |= NON_MAIN_ARENA; victim->size |= NON_MAIN_ARENA;
check_malloced_chunk(av, victim, nb); check_malloced_chunk(av, victim, nb);
return chunk2mem(victim); void *p = chunk2mem(victim);
if (__builtin_expect (perturb_byte, 0))
alloc_perturb (p, bytes);
return p;
} }
} }
} }
@ -3958,7 +3972,10 @@ _int_malloc(mstate av, size_t bytes)
set_foot(remainder, remainder_size); set_foot(remainder, remainder_size);
check_malloced_chunk(av, victim, nb); check_malloced_chunk(av, victim, nb);
return chunk2mem(victim); void *p = chunk2mem(victim);
if (__builtin_expect (perturb_byte, 0))
alloc_perturb (p, bytes);
return p;
} }
/* remove from unsorted list */ /* remove from unsorted list */
@ -3972,7 +3989,10 @@ _int_malloc(mstate av, size_t bytes)
if (av != &main_arena) if (av != &main_arena)
victim->size |= NON_MAIN_ARENA; victim->size |= NON_MAIN_ARENA;
check_malloced_chunk(av, victim, nb); check_malloced_chunk(av, victim, nb);
return chunk2mem(victim); void *p = chunk2mem(victim);
if (__builtin_expect (perturb_byte, 0))
alloc_perturb (p, bytes);
return p;
} }
/* place chunk in bin */ /* place chunk in bin */
@ -4041,8 +4061,6 @@ _int_malloc(mstate av, size_t bytes)
set_inuse_bit_at_offset(victim, size); set_inuse_bit_at_offset(victim, size);
if (av != &main_arena) if (av != &main_arena)
victim->size |= NON_MAIN_ARENA; victim->size |= NON_MAIN_ARENA;
check_malloced_chunk(av, victim, nb);
return chunk2mem(victim);
} }
/* Split */ /* Split */
else { else {
@ -4053,9 +4071,12 @@ _int_malloc(mstate av, size_t bytes)
(av != &main_arena ? NON_MAIN_ARENA : 0)); (av != &main_arena ? NON_MAIN_ARENA : 0));
set_head(remainder, remainder_size | PREV_INUSE); set_head(remainder, remainder_size | PREV_INUSE);
set_foot(remainder, remainder_size); set_foot(remainder, remainder_size);
check_malloced_chunk(av, victim, nb);
return chunk2mem(victim);
} }
check_malloced_chunk(av, victim, nb);
void *p = chunk2mem(victim);
if (__builtin_expect (perturb_byte, 0))
alloc_perturb (p, bytes);
return p;
} }
} }
@ -4124,8 +4145,6 @@ _int_malloc(mstate av, size_t bytes)
set_inuse_bit_at_offset(victim, size); set_inuse_bit_at_offset(victim, size);
if (av != &main_arena) if (av != &main_arena)
victim->size |= NON_MAIN_ARENA; victim->size |= NON_MAIN_ARENA;
check_malloced_chunk(av, victim, nb);
return chunk2mem(victim);
} }
/* Split */ /* Split */
@ -4142,9 +4161,12 @@ _int_malloc(mstate av, size_t bytes)
(av != &main_arena ? NON_MAIN_ARENA : 0)); (av != &main_arena ? NON_MAIN_ARENA : 0));
set_head(remainder, remainder_size | PREV_INUSE); set_head(remainder, remainder_size | PREV_INUSE);
set_foot(remainder, remainder_size); set_foot(remainder, remainder_size);
check_malloced_chunk(av, victim, nb);
return chunk2mem(victim);
} }
check_malloced_chunk(av, victim, nb);
void *p = chunk2mem(victim);
if (__builtin_expect (perturb_byte, 0))
alloc_perturb (p, bytes);
return p;
} }
} }
@ -4176,7 +4198,10 @@ _int_malloc(mstate av, size_t bytes)
set_head(remainder, remainder_size | PREV_INUSE); set_head(remainder, remainder_size | PREV_INUSE);
check_malloced_chunk(av, victim, nb); check_malloced_chunk(av, victim, nb);
return chunk2mem(victim); void *p = chunk2mem(victim);
if (__builtin_expect (perturb_byte, 0))
alloc_perturb (p, bytes);
return p;
} }
/* /*
@ -4194,8 +4219,12 @@ _int_malloc(mstate av, size_t bytes)
/* /*
Otherwise, relay to handle system-dependent cases Otherwise, relay to handle system-dependent cases
*/ */
else else {
return sYSMALLOc(nb, av); void *p = sYSMALLOc(nb, av);
if (__builtin_expect (perturb_byte, 0))
alloc_perturb (p, bytes);
return p;
}
} }
} }
@ -4269,6 +4298,10 @@ _int_free(mstate av, Void_t* mem)
errstr = "double free or corruption (fasttop)"; errstr = "double free or corruption (fasttop)";
goto errout; goto errout;
} }
if (__builtin_expect (perturb_byte, 0))
free_perturb (mem, size - SIZE_SZ);
p->fd = *fb; p->fd = *fb;
*fb = p; *fb = p;
} }
@ -4310,6 +4343,9 @@ _int_free(mstate av, Void_t* mem)
goto errout; goto errout;
} }
if (__builtin_expect (perturb_byte, 0))
free_perturb (mem, size - SIZE_SZ);
/* consolidate backward */ /* consolidate backward */
if (!prev_inuse(p)) { if (!prev_inuse(p)) {
prevsize = p->prev_size; prevsize = p->prev_size;
@ -5361,6 +5397,10 @@ int mALLOPt(param_number, value) int param_number; int value;
case M_CHECK_ACTION: case M_CHECK_ACTION:
check_action = value; check_action = value;
break; break;
case M_PERTURB:
perturb_byte = value;
break;
} }
(void)mutex_unlock(&av->mutex); (void)mutex_unlock(&av->mutex);
return res; return res;

View File

@ -122,6 +122,7 @@ extern struct mallinfo mallinfo __MALLOC_P ((void));
#define M_MMAP_THRESHOLD -3 #define M_MMAP_THRESHOLD -3
#define M_MMAP_MAX -4 #define M_MMAP_MAX -4
#define M_CHECK_ACTION -5 #define M_CHECK_ACTION -5
#define M_PERTURB -6
/* General SVID/XPG interface to tunable parameters. */ /* General SVID/XPG interface to tunable parameters. */
extern int mallopt __MALLOC_P ((int __param, int __val)); extern int mallopt __MALLOC_P ((int __param, int __val));

View File

@ -1,5 +1,5 @@
/* Skeleton for test programs. /* Skeleton for test programs.
Copyright (C) 1998,2000,2001,2002,2003,2004 Free Software Foundation, Inc. Copyright (C) 1998,2000-2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -20,6 +20,7 @@
#include <errno.h> #include <errno.h>
#include <getopt.h> #include <getopt.h>
#include <malloc.h>
#include <search.h> #include <search.h>
#include <signal.h> #include <signal.h>
#include <stdio.h> #include <stdio.h>
@ -196,6 +197,9 @@ main (int argc, char *argv[])
unsigned int timeoutfactor = 1; unsigned int timeoutfactor = 1;
pid_t termpid; pid_t termpid;
/* Make uses of freed and uninitialized memory known. */
mallopt (M_PERTURB, 42);
#ifdef STDOUT_UNBUFFERED #ifdef STDOUT_UNBUFFERED
setbuf (stdout, NULL); setbuf (stdout, NULL);
#endif #endif