ntdll: Fix handle/module confusion in Unix module loading.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2020-09-30 15:37:34 +02:00
parent a8ddba3576
commit 0167e195e9
1 changed files with 8 additions and 7 deletions

View File

@ -138,7 +138,7 @@ struct builtin_module
struct file_id id; struct file_id id;
void *handle; void *handle;
void *module; void *module;
void *unix_module; void *unix_handle;
}; };
static struct list builtin_modules = LIST_INIT( builtin_modules ); static struct list builtin_modules = LIST_INIT( builtin_modules );
@ -149,7 +149,7 @@ static NTSTATUS add_builtin_module( void *module, void *handle, const struct sta
if (!(builtin = malloc( sizeof(*builtin) ))) return STATUS_NO_MEMORY; if (!(builtin = malloc( sizeof(*builtin) ))) return STATUS_NO_MEMORY;
builtin->handle = handle; builtin->handle = handle;
builtin->module = module; builtin->module = module;
builtin->unix_module = NULL; builtin->unix_handle = NULL;
if (st) if (st)
{ {
builtin->id.dev = st->st_dev; builtin->id.dev = st->st_dev;
@ -1015,23 +1015,24 @@ static NTSTATUS dlopen_unix_dll( void *module, const char *name, void **unix_ent
{ {
if (builtin->module == module) if (builtin->module == module)
{ {
if (builtin->unix_module == unix_module) /* already loaded */ if (builtin->unix_handle == handle) /* already loaded */
{ {
*unix_entry = entry;
status = STATUS_SUCCESS; status = STATUS_SUCCESS;
goto done; goto done;
} }
if (builtin->unix_module) if (builtin->unix_handle)
{ {
ERR( "module %p already has a Unix module that's not %s\n", module, debugstr_a(name) ); ERR( "module %p already has a Unix module that's not %s\n", module, debugstr_a(name) );
goto done; goto done;
} }
if ((status = map_so_dll( nt, unix_module ))) goto done; if ((status = map_so_dll( nt, unix_module ))) goto done;
if ((status = fixup_ntdll_imports( name, unix_module ))) goto done; if ((status = fixup_ntdll_imports( name, unix_module ))) goto done;
builtin->unix_module = handle; builtin->unix_handle = handle;
*unix_entry = entry; *unix_entry = entry;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
else if (builtin->unix_module == unix_module) else if (builtin->unix_handle == handle)
{ {
ERR( "%s already loaded for module %p\n", debugstr_a(name), module ); ERR( "%s already loaded for module %p\n", debugstr_a(name), module );
goto done; goto done;
@ -1339,7 +1340,7 @@ static NTSTATUS CDECL unload_builtin_dll( void *module )
if (builtin->module != module) continue; if (builtin->module != module) continue;
list_remove( &builtin->entry ); list_remove( &builtin->entry );
if (builtin->handle) dlclose( builtin->handle ); if (builtin->handle) dlclose( builtin->handle );
if (builtin->unix_module) dlclose( builtin->unix_module ); if (builtin->unix_handle) dlclose( builtin->unix_handle );
free( builtin ); free( builtin );
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }