aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPali Rohár <pali.rohar@gmail.com>2019-05-23 20:23:50 +0200
committerPali Rohár <pali.rohar@gmail.com>2019-05-23 20:23:50 +0200
commit44589dba9c663eaeed5dbf55a02984133b9ab822 (patch)
treefa5f5abe4077b811f798a2cbd8511539753aa5ec
parent4fe419cac3a5732844e5dd9fd52600b054bd0b18 (diff)
downloaddlfcn-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.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/dlfcn.c b/dlfcn.c
index 26135e3..7fe4701 100644
--- a/dlfcn.c
+++ b/dlfcn.c
@@ -72,34 +72,36 @@ static local_object *local_search( HMODULE hModule )
72 return NULL; 72 return NULL;
73} 73}
74 74
75static void local_add( HMODULE hModule ) 75static 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
105static void local_rem( HMODULE hModule ) 107static 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 {