From b87256cd1db21a59484248a193b6ad12ca2853ca Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 6 Apr 2020 22:44:00 +0200 Subject: [PATCH] libwine: Make the dlopen() wrapper functions obsolete. Signed-off-by: Alexandre Julliard --- include/wine/library.h | 3 - libs/port/stubs.c | 22 ---- libs/wine/loader.c | 269 ++++++++++++++++++++++------------------- libs/wine/wine.map | 6 +- 4 files changed, 145 insertions(+), 155 deletions(-) diff --git a/include/wine/library.h b/include/wine/library.h index f338c4da190..060a1861058 100644 --- a/include/wine/library.h +++ b/include/wine/library.h @@ -55,9 +55,6 @@ extern void wine_exec_wine_binary( const char *name, char **argv, const char *en typedef void (*load_dll_callback_t)( void *, const char * ); -extern void *wine_dlopen( const char *filename, int flag, char *error, size_t errorsize ); -extern void *wine_dlsym( void *handle, const char *symbol, char *error, size_t errorsize ); -extern int wine_dlclose( void *handle, char *error, size_t errorsize ); extern void wine_dll_set_callback( load_dll_callback_t load ); extern const char *wine_dll_enum_load_path( unsigned int index ); diff --git a/libs/port/stubs.c b/libs/port/stubs.c index 4d105357da9..1a2de3204b6 100644 --- a/libs/port/stubs.c +++ b/libs/port/stubs.c @@ -56,26 +56,4 @@ const char *wine_dll_enum_load_path( unsigned int index ) return NULL; } -void *wine_dlopen( const char *filename, int flag, char *error, size_t errorsize ) -{ - if (error) - { - static const char msg[] = "no dlopen support on Windows"; - size_t len = min( errorsize, sizeof(msg) ); - memcpy( error, msg, len ); - error[len - 1] = 0; - } - return NULL; -} - -void *wine_dlsym( void *handle, const char *symbol, char *error, size_t errorsize ) -{ - return NULL; -} - -int wine_dlclose( void *handle, char *error, size_t errorsize ) -{ - return 0; -} - #endif /* _WIN32 */ diff --git a/libs/wine/loader.c b/libs/wine/loader.c index 53e33c496a9..b8d32be783c 100644 --- a/libs/wine/loader.c +++ b/libs/wine/loader.c @@ -508,6 +508,128 @@ const char *wine_dll_enum_load_path( unsigned int index ) #ifdef __ASM_OBSOLETE +/* + * These functions provide wrappers around dlopen() and associated + * functions. They work around a bug in glibc 2.1.x where calling + * a dl*() function after a previous dl*() function has failed + * without a dlerror() call between the two will cause a crash. + * They all take a pointer to a buffer that + * will receive the error description (from dlerror()). This + * parameter may be NULL if the error description is not required. + */ + +#ifndef RTLD_FIRST +#define RTLD_FIRST 0 +#endif + +/*********************************************************************** + * wine_dlopen + */ +void *wine_dlopen_obsolete( const char *filename, int flag, char *error, size_t errorsize ) +{ + void *ret; + const char *s; + +#ifdef __APPLE__ + /* the Mac OS loader pretends to be able to load PE files, so avoid them here */ + unsigned char magic[2]; + int fd = open( filename, O_RDONLY ); + if (fd != -1) + { + if (pread( fd, magic, 2, 0 ) == 2 && magic[0] == 'M' && magic[1] == 'Z') + { + if (error && errorsize) + { + static const char msg[] = "MZ format"; + size_t len = min( errorsize, sizeof(msg) ); + memcpy( error, msg, len ); + error[len - 1] = 0; + } + close( fd ); + return NULL; + } + close( fd ); + } +#endif + dlerror(); dlerror(); +#ifdef __sun + if (strchr( filename, ':' )) + { + char path[PATH_MAX]; + /* Solaris' brain damaged dlopen() treats ':' as a path separator */ + realpath( filename, path ); + ret = dlopen( path, flag | RTLD_FIRST ); + } + else +#endif + ret = dlopen( filename, flag | RTLD_FIRST ); + s = dlerror(); + if (error && errorsize) + { + if (s) + { + size_t len = strlen(s); + if (len >= errorsize) len = errorsize - 1; + memcpy( error, s, len ); + error[len] = 0; + } + else error[0] = 0; + } + dlerror(); + return ret; +} + +/*********************************************************************** + * wine_dlsym + */ +void *wine_dlsym_obsolete( void *handle, const char *symbol, char *error, size_t errorsize ) +{ + void *ret; + const char *s; + dlerror(); dlerror(); + ret = dlsym( handle, symbol ); + s = dlerror(); + if (error && errorsize) + { + if (s) + { + size_t len = strlen(s); + if (len >= errorsize) len = errorsize - 1; + memcpy( error, s, len ); + error[len] = 0; + } + else error[0] = 0; + } + dlerror(); + return ret; +} + +/*********************************************************************** + * wine_dlclose + */ +int wine_dlclose_obsolete( void *handle, char *error, size_t errorsize ) +{ + int ret; + const char *s; + dlerror(); dlerror(); + ret = dlclose( handle ); + s = dlerror(); + if (error && errorsize) + { + if (s) + { + size_t len = strlen(s); + if (len >= errorsize) len = errorsize - 1; + memcpy( error, s, len ); + error[len] = 0; + } + else error[0] = 0; + } + dlerror(); + return ret; +} + + /* check if the library is the correct architecture */ /* only returns false for a valid library of the wrong arch */ static int check_library_arch( int fd ) @@ -570,7 +692,7 @@ static void *dlopen_dll( const char *name, char *error, int errorsize, *exists = 0; for (path = first_dll_path( name, 0, &context ); path; path = next_dll_path( &context )) { - if (!test_only && (ret = wine_dlopen( path, RTLD_NOW, error, errorsize ))) break; + if (!test_only && (ret = wine_dlopen_obsolete( path, RTLD_NOW, error, errorsize ))) break; if ((*exists = file_exists( path ))) break; /* exists but cannot be loaded, return the error */ } free_dll_path( &context ); @@ -616,7 +738,7 @@ void *wine_dll_load_obsolete( const char *filename, char *error, int errorsize, void wine_dll_unload_obsolete( void *handle ) { if (handle != (void *)1) - wine_dlclose( handle, NULL, 0 ); + wine_dlclose_obsolete( handle, NULL, 0 ); } @@ -664,6 +786,9 @@ int wine_dll_get_owner_obsolete( const char *name, char *buffer, int size, int * return ret; } +__ASM_OBSOLETE(wine_dlopen); +__ASM_OBSOLETE(wine_dlsym); +__ASM_OBSOLETE(wine_dlclose); __ASM_OBSOLETE(wine_dll_get_owner); __ASM_OBSOLETE(wine_dll_load); __ASM_OBSOLETE(wine_dll_load_main_exe); @@ -983,7 +1108,7 @@ void wine_init( int argc, char *argv[], char *error, int error_size ) for (path = first_dll_path( "ntdll.dll", 0, &context ); path; path = next_dll_path( &context )) { - if ((ntdll = wine_dlopen( path, RTLD_NOW, error, error_size ))) + if ((ntdll = dlopen( path, RTLD_NOW ))) { /* if we didn't use the default dll dir, remove it from the search path */ if (default_dlldir[0] && context.index < nb_dll_paths + 2) nb_dll_paths--; @@ -992,133 +1117,23 @@ void wine_init( int argc, char *argv[], char *error, int error_size ) } free_dll_path( &context ); - if (!ntdll) return; - if (!(init_func = wine_dlsym( ntdll, "__wine_process_init", error, error_size ))) return; + if (!ntdll || !(init_func = dlsym( ntdll, "__wine_process_init" ))) + { + if (error && error_size) + { + const char *s = dlerror(); + if (s) + { + size_t len = min( strlen(s), error_size - 1 ); + memcpy( error, s, len ); + error[len] = 0; + } + else error[0] = 0; + } + } #ifdef __APPLE__ apple_main_thread( init_func ); #else init_func(); #endif } - - -/* - * These functions provide wrappers around dlopen() and associated - * functions. They work around a bug in glibc 2.1.x where calling - * a dl*() function after a previous dl*() function has failed - * without a dlerror() call between the two will cause a crash. - * They all take a pointer to a buffer that - * will receive the error description (from dlerror()). This - * parameter may be NULL if the error description is not required. - */ - -#ifndef RTLD_FIRST -#define RTLD_FIRST 0 -#endif - -/*********************************************************************** - * wine_dlopen - */ -void *wine_dlopen( const char *filename, int flag, char *error, size_t errorsize ) -{ - void *ret; - const char *s; - -#ifdef __APPLE__ - /* the Mac OS loader pretends to be able to load PE files, so avoid them here */ - unsigned char magic[2]; - int fd = open( filename, O_RDONLY ); - if (fd != -1) - { - if (pread( fd, magic, 2, 0 ) == 2 && magic[0] == 'M' && magic[1] == 'Z') - { - if (error && errorsize) - { - static const char msg[] = "MZ format"; - size_t len = min( errorsize, sizeof(msg) ); - memcpy( error, msg, len ); - error[len - 1] = 0; - } - close( fd ); - return NULL; - } - close( fd ); - } -#endif - dlerror(); dlerror(); -#ifdef __sun - if (strchr( filename, ':' )) - { - char path[PATH_MAX]; - /* Solaris' brain damaged dlopen() treats ':' as a path separator */ - realpath( filename, path ); - ret = dlopen( path, flag | RTLD_FIRST ); - } - else -#endif - ret = dlopen( filename, flag | RTLD_FIRST ); - s = dlerror(); - if (error && errorsize) - { - if (s) - { - size_t len = strlen(s); - if (len >= errorsize) len = errorsize - 1; - memcpy( error, s, len ); - error[len] = 0; - } - else error[0] = 0; - } - dlerror(); - return ret; -} - -/*********************************************************************** - * wine_dlsym - */ -void *wine_dlsym( void *handle, const char *symbol, char *error, size_t errorsize ) -{ - void *ret; - const char *s; - dlerror(); dlerror(); - ret = dlsym( handle, symbol ); - s = dlerror(); - if (error && errorsize) - { - if (s) - { - size_t len = strlen(s); - if (len >= errorsize) len = errorsize - 1; - memcpy( error, s, len ); - error[len] = 0; - } - else error[0] = 0; - } - dlerror(); - return ret; -} - -/*********************************************************************** - * wine_dlclose - */ -int wine_dlclose( void *handle, char *error, size_t errorsize ) -{ - int ret; - const char *s; - dlerror(); dlerror(); - ret = dlclose( handle ); - s = dlerror(); - if (error && errorsize) - { - if (s) - { - size_t len = strlen(s); - if (len >= errorsize) len = errorsize - 1; - memcpy( error, s, len ); - error[len] = 0; - } - else error[0] = 0; - } - dlerror(); - return ret; -} diff --git a/libs/wine/wine.map b/libs/wine/wine.map index 7ea849b908e..4d48eb5f60a 100644 --- a/libs/wine/wine.map +++ b/libs/wine/wine.map @@ -9,11 +9,8 @@ WINE_1.0 wine_anon_mmap; wine_casemap_lower; wine_casemap_upper; - wine_dlclose; wine_dll_enum_load_path; wine_dll_set_callback; - wine_dlopen; - wine_dlsym; wine_exec_wine_binary; wine_get_build_dir; wine_get_build_id; @@ -88,10 +85,13 @@ WINE_1.0 wine_dbg_sprintf; wine_dbgstr_an; wine_dbgstr_wn; + wine_dlclose; wine_dll_get_owner; wine_dll_load; wine_dll_load_main_exe; wine_dll_unload; + wine_dlopen; + wine_dlsym; wine_fold_string; wine_get_cs; wine_get_ds;