ntdll: Make sure to not unmap anything from reserved areas
when using NtFreeVirtualMemory with the MEM_SYSTEM flag.
This commit is contained in:
parent
bb63a325d7
commit
c79cf02fae
|
@ -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 )
|
||||||
/* 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)
|
||||||
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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue