From: Jeff Dike __wrap_free is now careful about freeing to the same allocator that allocated the buffer. Signed-off-by: Paolo 'Blaisorblade' Giarrusso Signed-off-by: Jeff Dike Signed-off-by: Andrew Morton --- 25-akpm/arch/um/kernel/main.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-) diff -puN arch/um/kernel/main.c~uml-free-wrapper-fixes arch/um/kernel/main.c --- 25/arch/um/kernel/main.c~uml-free-wrapper-fixes 2004-09-23 00:07:53.617046320 -0700 +++ 25-akpm/arch/um/kernel/main.c 2004-09-23 00:07:53.621045712 -0700 @@ -220,14 +220,19 @@ void __wrap_free(void *ptr) * If kmalloc is not yet possible, then the kernel memory regions * may not be set up yet, and the variables not initialized. So, * free is called. + * + * CAN_KMALLOC is checked because it would be bad to free a buffer + * with kmalloc/vmalloc after they have been turned off during + * shutdown. */ - if(CAN_KMALLOC()){ - if((addr >= uml_physmem) && (addr <= high_physmem)) + + if((addr >= uml_physmem) && (addr < high_physmem)){ + if(CAN_KMALLOC()) kfree(ptr); - else if((addr >= start_vm) && (addr <= end_vm)) + } + else if((addr >= start_vm) && (addr < end_vm)){ + if(CAN_KMALLOC()) vfree(ptr); - else - __real_free(ptr); } else __real_free(ptr); } _