Commit c79cf02f authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Make sure to not unmap anything from reserved areas

when using NtFreeVirtualMemory with the MEM_SYSTEM flag.
parent bb63a325
...@@ -1386,7 +1386,8 @@ NTSTATUS WINAPI NtFreeVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T *si ...@@ -1386,7 +1386,8 @@ NTSTATUS WINAPI NtFreeVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T *si
{ {
/* return the values that the caller should use to unmap the area */ /* return the values that the caller should use to unmap the area */
*addr_ptr = view->base; *addr_ptr = view->base;
*size_ptr = view->size; if (!wine_mmap_is_in_reserved_area( view->base, view->size )) *size_ptr = view->size;
else *size_ptr = 0; /* make sure we don't munmap anything from a reserved area */
view->flags |= VFLAG_SYSTEM; view->flags |= VFLAG_SYSTEM;
delete_view( view ); delete_view( view );
} }
......
...@@ -190,8 +190,8 @@ static void cleanup_thread( void *ptr ) ...@@ -190,8 +190,8 @@ static void cleanup_thread( void *ptr )
/* copy the info structure since it is on the stack we will free */ /* copy the info structure since it is on the stack we will free */
struct wine_pthread_thread_info info = *(struct wine_pthread_thread_info *)ptr; struct wine_pthread_thread_info info = *(struct wine_pthread_thread_info *)ptr;
wine_ldt_free_fs( info.teb_sel ); wine_ldt_free_fs( info.teb_sel );
munmap( info.stack_base, info.stack_size ); if (info.stack_size) munmap( info.stack_base, info.stack_size );
munmap( info.teb_base, info.teb_size ); if (info.teb_size) munmap( info.teb_base, info.teb_size );
#ifdef HAVE__LWP_CREATE #ifdef HAVE__LWP_CREATE
_lwp_exit(); _lwp_exit();
#endif #endif
......
...@@ -159,7 +159,7 @@ static void *get_current_teb(void) ...@@ -159,7 +159,7 @@ static void *get_current_teb(void)
static void DECLSPEC_NORETURN exit_thread( struct wine_pthread_thread_info *info ) static void DECLSPEC_NORETURN exit_thread( struct wine_pthread_thread_info *info )
{ {
wine_ldt_free_fs( info->teb_sel ); wine_ldt_free_fs( info->teb_sel );
munmap( info->teb_base, info->teb_size ); if (info->teb_size) munmap( info->teb_base, info->teb_size );
pthread_exit( (void *)info->exit_status ); pthread_exit( (void *)info->exit_status );
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment