Jeff Dike wrote:
> The libc free wrapper wasn't correctly detecting buffers obtained with
> malloc().  This is now done by seeing if the page was reserved.  This is
> the case for memory which is left aside for libc and isn't given to
> the page allocator.  If we free a pointer in a reserved page, it is
> given to free() rather than kfree().

I want to get rid of PG_reserved eventually. Is it possible to use PG_arch_1
for this?

> 
> Signed-off-by: Jeff Dike <[EMAIL PROTECTED]>
> --
>  arch/um/include/user.h   |    1 +
>  arch/um/kernel/um_arch.c |    7 +++++++
>  arch/um/os-Linux/main.c  |    6 +++++-
>  3 files changed, 13 insertions(+), 1 deletion(-)
> 
> Index: linux-2.6.21-mm/arch/um/include/user.h
> ===================================================================
> --- linux-2.6.21-mm.orig/arch/um/include/user.h       2007-04-26 
> 17:33:01.000000000 -0400
> +++ linux-2.6.21-mm/arch/um/include/user.h    2007-04-27 14:21:35.000000000 
> -0400
> @@ -27,5 +27,6 @@ extern int in_aton(char *str);
>  extern int open_gdb_chan(void);
>  extern size_t strlcpy(char *, const char *, size_t);
>  extern size_t strlcat(char *, const char *, size_t);
> +extern int reserved_address(void *addr);
>  
>  #endif
> Index: linux-2.6.21-mm/arch/um/kernel/um_arch.c
> ===================================================================
> --- linux-2.6.21-mm.orig/arch/um/kernel/um_arch.c     2007-04-26 
> 17:41:21.000000000 -0400
> +++ linux-2.6.21-mm/arch/um/kernel/um_arch.c  2007-04-27 14:30:36.000000000 
> -0400
> @@ -500,6 +500,13 @@ void __init check_bugs(void)
>       os_check_bugs();
>  }
>  
> +int reserved_address(void *addr)
> +{
> +     struct page *page = virt_to_page(addr);
> +
> +     return(PageReserved(page));
> +}
> +
>  void apply_alternatives(struct alt_instr *start, struct alt_instr *end)
>  {
>  }
> Index: linux-2.6.21-mm/arch/um/os-Linux/main.c
> ===================================================================
> --- linux-2.6.21-mm.orig/arch/um/os-Linux/main.c      2007-04-26 
> 17:41:10.000000000 -0400
> +++ linux-2.6.21-mm/arch/um/os-Linux/main.c   2007-04-27 14:30:31.000000000 
> -0400
> @@ -266,6 +266,8 @@ void __wrap_free(void *ptr)
>       /* We need to know how the allocation happened, so it can be correctly
>        * freed.  This is done by seeing what region of memory the pointer is
>        * in -
> +      *      in a reserved page - free, assume the pointer was
> +      *          acquired with malloc, since it couldn't have been kmalloced.
>        *      physical memory - kmalloc/kfree
>        *      kernel virtual memory - vmalloc/vfree
>        *      anywhere else - malloc/free
> @@ -281,7 +283,9 @@ void __wrap_free(void *ptr)
>        * there is a possibility for memory leaks.
>        */
>  
> -     if((addr >= uml_physmem) && (addr < high_physmem)){
> +     if(kmalloc_ok && reserved_address(ptr))
> +             __real_free(ptr);
> +     else if((addr >= uml_physmem) && (addr < high_physmem)){
>               if(CAN_KMALLOC())
>                       kfree(ptr);
>       }
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 


-- 
SUSE Labs, Novell Inc.

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
User-mode-linux-devel mailing list
User-mode-linux-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel

Reply via email to