diff options
| author | Pali Rohár <pali.rohar@gmail.com> | 2019-09-12 16:37:03 +0200 |
|---|---|---|
| committer | Pali Rohár <pali.rohar@gmail.com> | 2019-09-12 16:37:03 +0200 |
| commit | ab246dbf3a6682eb5f6544c0e6f384a72bbe7a98 (patch) | |
| tree | 4045f300ca61cb6cea655c4418f0ffdb3df406fa | |
| parent | 07ef52a5f199ae4fabeee9924c935d06f9e46aec (diff) | |
| download | dlfcn-win32-ab246dbf3a6682eb5f6544c0e6f384a72bbe7a98.tar.gz dlfcn-win32-ab246dbf3a6682eb5f6544c0e6f384a72bbe7a98.tar.bz2 dlfcn-win32-ab246dbf3a6682eb5f6544c0e6f384a72bbe7a98.zip | |
Add test which check that dlopen() can open same files as open()
This ensures that dlopen() expects filenames encoded in same codepage as
WinAPI's open() function.
| -rw-r--r-- | test.c | 93 |
1 files changed, 93 insertions, 0 deletions
| @@ -27,6 +27,10 @@ | |||
| 27 | #include <stdio.h> | 27 | #include <stdio.h> |
| 28 | #include <string.h> | 28 | #include <string.h> |
| 29 | #include <windows.h> | 29 | #include <windows.h> |
| 30 | #include <wchar.h> | ||
| 31 | #include <io.h> | ||
| 32 | #include <fcntl.h> | ||
| 33 | #include <direct.h> | ||
| 30 | #include "dlfcn.h" | 34 | #include "dlfcn.h" |
| 31 | 35 | ||
| 32 | /* If these dlclose's fails, we don't care as the handles are going to be | 36 | /* If these dlclose's fails, we don't care as the handles are going to be |
| @@ -81,11 +85,14 @@ int main() | |||
| 81 | size_t (*fwrite_local) ( const void *, size_t, size_t, FILE * ); | 85 | size_t (*fwrite_local) ( const void *, size_t, size_t, FILE * ); |
| 82 | size_t (*fputs_default) ( const char *, FILE * ); | 86 | size_t (*fputs_default) ( const char *, FILE * ); |
| 83 | int (*nonexistentfunction)( void ); | 87 | int (*nonexistentfunction)( void ); |
| 88 | int fd; | ||
| 84 | int ret; | 89 | int ret; |
| 85 | HMODULE library3; | 90 | HMODULE library3; |
| 86 | char toolongfile[32767]; | 91 | char toolongfile[32767]; |
| 87 | DWORD code; | 92 | DWORD code; |
| 88 | char nonlibraryfile[MAX_PATH]; | 93 | char nonlibraryfile[MAX_PATH]; |
| 94 | char bytename[sizeof("testdll2.dll")+4]; | ||
| 95 | WCHAR widename[sizeof("testdll2.dll")+1]; | ||
| 89 | DWORD length; | 96 | DWORD length; |
| 90 | HANDLE tempfile; | 97 | HANDLE tempfile; |
| 91 | DWORD dummy; | 98 | DWORD dummy; |
| @@ -210,6 +217,32 @@ int main() | |||
| 210 | else | 217 | else |
| 211 | printf( "SUCCESS\tCould not open file with too long file name via WINAPI: %lu\n", (unsigned long)code ); | 218 | printf( "SUCCESS\tCould not open file with too long file name via WINAPI: %lu\n", (unsigned long)code ); |
| 212 | 219 | ||
| 220 | fd = _open( "testdll2.dll", _O_RDONLY | _O_BINARY ); | ||
| 221 | if( fd < 0 ) | ||
| 222 | { | ||
| 223 | if( _chdir( "Debug" ) == 0 ) | ||
| 224 | { | ||
| 225 | fd = _open( "testdll2.dll", _O_RDONLY | _O_BINARY ); | ||
| 226 | if( fd < 0 ) | ||
| 227 | _chdir( ".." ); | ||
| 228 | } | ||
| 229 | } | ||
| 230 | if( fd < 0 ) | ||
| 231 | { | ||
| 232 | if( _chdir( "Release" ) == 0 ) | ||
| 233 | { | ||
| 234 | fd = _open( "testdll2.dll", _O_RDONLY | _O_BINARY ); | ||
| 235 | if( fd < 0 ) | ||
| 236 | _chdir( ".." ); | ||
| 237 | } | ||
| 238 | } | ||
| 239 | if( fd < 0 ) | ||
| 240 | { | ||
| 241 | printf( "ERROR\tCould not open library2 file: %s\n", strerror( errno ) ); | ||
| 242 | RETURN_ERROR; | ||
| 243 | } | ||
| 244 | _close( fd ); | ||
| 245 | |||
| 213 | library2 = dlopen( "testdll2.dll", RTLD_GLOBAL ); | 246 | library2 = dlopen( "testdll2.dll", RTLD_GLOBAL ); |
| 214 | if( !library2 ) | 247 | if( !library2 ) |
| 215 | { | 248 | { |
| @@ -220,6 +253,66 @@ int main() | |||
| 220 | else | 253 | else |
| 221 | printf( "SUCCESS\tOpened library2 globally: %p\n", library2 ); | 254 | printf( "SUCCESS\tOpened library2 globally: %p\n", library2 ); |
| 222 | 255 | ||
| 256 | widename[0] = 0xE1; /* wide non-ASCII character mappable to most ANSI codepages */ | ||
| 257 | wcscpy( widename+1, L"testdll2.dll" ); | ||
| 258 | if( !CopyFileW( L"testdll2.dll", widename, FALSE )) | ||
| 259 | { | ||
| 260 | printf( "ERROR\tCould not copy file testdll2.dll: %lu\n", (unsigned long)GetLastError( ) ); | ||
| 261 | RETURN_ERROR; | ||
| 262 | } | ||
| 263 | else | ||
| 264 | printf( "SUCCESS\tCopied testdll2.dll to wide name %ls\n", widename ); | ||
| 265 | |||
| 266 | ret = WideCharToMultiByte( CP_ACP, 0, widename, -1, bytename, sizeof( bytename ), NULL, NULL ); | ||
| 267 | /* if we cannot convert widename to current codepage (used by _open() function), skip this test */ | ||
| 268 | if( ret > 0 ) | ||
| 269 | { | ||
| 270 | bytename[ret] = 0; | ||
| 271 | |||
| 272 | fd = _wopen( widename, _O_RDONLY | _O_BINARY ); | ||
| 273 | if( fd < 0 ) | ||
| 274 | { | ||
| 275 | printf( "ERROR\tCould not open copied wide library2 file %ls: %s\n", widename, strerror( errno ) ); | ||
| 276 | DeleteFileW( widename ); | ||
| 277 | RETURN_ERROR; | ||
| 278 | } | ||
| 279 | _close( fd ); | ||
| 280 | |||
| 281 | fd = _open( bytename, _O_RDONLY | _O_BINARY ); | ||
| 282 | if( fd < 0 ) | ||
| 283 | { | ||
| 284 | printf( "ERROR\tCould not open copied wide library2 file %s: %s\n", bytename, strerror( errno ) ); | ||
| 285 | DeleteFileW( widename ); | ||
| 286 | RETURN_ERROR; | ||
| 287 | } | ||
| 288 | _close( fd ); | ||
| 289 | |||
| 290 | dlclose( library2 ); | ||
| 291 | library2 = dlopen( bytename, RTLD_GLOBAL ); | ||
| 292 | if( !library2 ) | ||
| 293 | { | ||
| 294 | error = dlerror( ); | ||
| 295 | printf( "ERROR\tCould not open copied wide library2 file %s globally: %s\n", bytename, error ? error : "" ); | ||
| 296 | DeleteFileW( widename ); | ||
| 297 | RETURN_ERROR; | ||
| 298 | } | ||
| 299 | else | ||
| 300 | printf( "SUCCESS\tOpened copied wide library2 file %s globally: %p\n", bytename, library2 ); | ||
| 301 | |||
| 302 | dlclose( library2 ); | ||
| 303 | DeleteFileW( widename ); | ||
| 304 | |||
| 305 | library2 = dlopen( "testdll2.dll", RTLD_GLOBAL ); | ||
| 306 | if( !library2 ) | ||
| 307 | { | ||
| 308 | error = dlerror( ); | ||
| 309 | printf( "ERROR\tCould not open library2 globally: %s\n", error ? error : "" ); | ||
| 310 | RETURN_ERROR; | ||
| 311 | } | ||
| 312 | else | ||
| 313 | printf( "SUCCESS\tOpened library2 globally: %p\n", library2 ); | ||
| 314 | } | ||
| 315 | |||
| 223 | library = dlopen( "testdll.dll", RTLD_GLOBAL ); | 316 | library = dlopen( "testdll.dll", RTLD_GLOBAL ); |
| 224 | if( !library ) | 317 | if( !library ) |
| 225 | { | 318 | { |
