diff options
author | Pali Rohár <pali.rohar@gmail.com> | 2019-05-23 20:23:50 +0200 |
---|---|---|
committer | Pali Rohár <pali.rohar@gmail.com> | 2019-05-23 20:23:50 +0200 |
commit | 44589dba9c663eaeed5dbf55a02984133b9ab822 (patch) | |
tree | fa5f5abe4077b811f798a2cbd8511539753aa5ec | |
parent | 4fe419cac3a5732844e5dd9fd52600b054bd0b18 (diff) | |
download | dlfcn-win32-44589dba9c663eaeed5dbf55a02984133b9ab822.tar.gz dlfcn-win32-44589dba9c663eaeed5dbf55a02984133b9ab822.tar.bz2 dlfcn-win32-44589dba9c663eaeed5dbf55a02984133b9ab822.zip |
Correctly process malloc() error in local_add()
malloc() may fail, so propagate this error to caller of dlopen().
-rw-r--r-- | dlfcn.c | 23 |
1 files changed, 15 insertions, 8 deletions
@@ -72,34 +72,36 @@ static local_object *local_search( HMODULE hModule ) | |||
72 | return NULL; | 72 | return NULL; |
73 | } | 73 | } |
74 | 74 | ||
75 | static void local_add( HMODULE hModule ) | 75 | static BOOL local_add( HMODULE hModule ) |
76 | { | 76 | { |
77 | local_object *pobject; | 77 | local_object *pobject; |
78 | local_object *nobject; | 78 | local_object *nobject; |
79 | 79 | ||
80 | if( hModule == NULL ) | 80 | if( hModule == NULL ) |
81 | return; | 81 | return TRUE; |
82 | 82 | ||
83 | pobject = local_search( hModule ); | 83 | pobject = local_search( hModule ); |
84 | 84 | ||
85 | /* Do not add object again if it's already on the list */ | 85 | /* Do not add object again if it's already on the list */ |
86 | if( pobject ) | 86 | if( pobject ) |
87 | return; | 87 | return TRUE; |
88 | 88 | ||
89 | for( pobject = &first_object; pobject->next; pobject = pobject->next ); | 89 | for( pobject = &first_object; pobject->next; pobject = pobject->next ); |
90 | 90 | ||
91 | nobject = (local_object*) malloc( sizeof( local_object ) ); | 91 | nobject = (local_object*) malloc( sizeof( local_object ) ); |
92 | 92 | ||
93 | /* Should this be enough to fail local_add, and therefore also fail | ||
94 | * dlopen? | ||
95 | */ | ||
96 | if( !nobject ) | 93 | if( !nobject ) |
97 | return; | 94 | { |
95 | SetLastError( ERROR_NOT_ENOUGH_MEMORY ); | ||
96 | return FALSE; | ||
97 | } | ||
98 | 98 | ||
99 | pobject->next = nobject; | 99 | pobject->next = nobject; |
100 | nobject->next = NULL; | 100 | nobject->next = NULL; |
101 | nobject->previous = pobject; | 101 | nobject->previous = pobject; |
102 | nobject->hModule = hModule; | 102 | nobject->hModule = hModule; |
103 | |||
104 | return TRUE; | ||
103 | } | 105 | } |
104 | 106 | ||
105 | static void local_rem( HMODULE hModule ) | 107 | static void local_rem( HMODULE hModule ) |
@@ -287,7 +289,12 @@ void *dlopen( const char *file, int mode ) | |||
287 | */ | 289 | */ |
288 | if( (mode & RTLD_LOCAL) && dwProcModsBefore != dwProcModsAfter ) | 290 | if( (mode & RTLD_LOCAL) && dwProcModsBefore != dwProcModsAfter ) |
289 | { | 291 | { |
290 | local_add( hModule ); | 292 | if( !local_add( hModule ) ) |
293 | { | ||
294 | save_err_str( lpFileName ); | ||
295 | FreeLibrary( hModule ); | ||
296 | hModule = NULL; | ||
297 | } | ||
291 | } | 298 | } |
292 | else if( !(mode & RTLD_LOCAL) && dwProcModsBefore == dwProcModsAfter ) | 299 | else if( !(mode & RTLD_LOCAL) && dwProcModsBefore == dwProcModsAfter ) |
293 | { | 300 | { |