Skip to content
Snippets Groups Projects
Commit 1e9f3235 authored by Robert Schmidt's avatar Robert Schmidt
Browse files

fix: avoid AssertFatal() in load_module_shlib()

don't fail in library utility function, return with error code instead and let
application decide what is best on how to proceed
parent 604ec25a
No related branches found
No related tags found
No related merge requests found
...@@ -129,7 +129,10 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void * ...@@ -129,7 +129,10 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void *
int ret = 0; int ret = 0;
int lib_idx = -1; int lib_idx = -1;
AssertFatal(modname, "no library name given\n"); if (!modname) {
fprintf(stderr, "[LOADER] load_module_shlib(): no library name given\n");
return -1;
}
if (!loader_data.shlibpath) { if (!loader_data.shlibpath) {
loader_init(); loader_init();
...@@ -148,9 +151,12 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void * ...@@ -148,9 +151,12 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void *
if (lib_idx < 0) { if (lib_idx < 0) {
lib_idx = loader_data.numshlibs; lib_idx = loader_data.numshlibs;
++loader_data.numshlibs; ++loader_data.numshlibs;
AssertFatal(loader_data.numshlibs <= loader_data.maxshlibs, if (loader_data.numshlibs > loader_data.maxshlibs) {
"shared lib loader: can not load more than %d shlibs\n", fprintf(stderr, "[LOADER] can not load more than %d shlibs\n",
loader_data.maxshlibs); loader_data.maxshlibs);
ret = -1;
goto load_module_shlib_exit;
}
loader_data.shlibs[lib_idx].name = strdup(modname); loader_data.shlibs[lib_idx].name = strdup(modname);
loader_data.shlibs[lib_idx].thisshlib_path = strdup(shlib_path); loader_data.shlibs[lib_idx].thisshlib_path = strdup(shlib_path);
} }
...@@ -174,9 +180,12 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void * ...@@ -174,9 +180,12 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void *
if (fpc) { if (fpc) {
int chkver_ret = fpc(loader_data.mainexec_buildversion, int chkver_ret = fpc(loader_data.mainexec_buildversion,
&(loader_data.shlibs[lib_idx].shlib_buildversion)); &(loader_data.shlibs[lib_idx].shlib_buildversion));
AssertFatal(chkver_ret >= 0, if (chkver_ret < 0) {
"[LOADER] %s %d lib %s, version mismatch", fprintf(stderr, "[LOADER] %s %d lib %s, version mismatch",
__FILE__, __LINE__, modname); __FILE__, __LINE__, modname);
ret = -1;
goto load_module_shlib_exit;
}
} }
sprintf(afname,"%s_autoinit",modname); sprintf(afname,"%s_autoinit",modname);
fpi = dlsym(lib_handle,afname); fpi = dlsym(lib_handle,afname);
...@@ -188,13 +197,21 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void * ...@@ -188,13 +197,21 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void *
if (farray) { if (farray) {
if (!loader_data.shlibs[lib_idx].funcarray) { if (!loader_data.shlibs[lib_idx].funcarray) {
loader_data.shlibs[lib_idx].funcarray = malloc(numf*sizeof(loader_shlibfunc_t)); loader_data.shlibs[lib_idx].funcarray = malloc(numf*sizeof(loader_shlibfunc_t));
AssertFatal(loader_data.shlibs[lib_idx].funcarray, "unable to allocate memory\n"); if (!loader_data.shlibs[lib_idx].funcarray) {
fprintf(stderr, "[LOADER] load_module_shlib(): unable to allocate memory\n");
ret = -1;
goto load_module_shlib_exit;
}
} }
loader_data.shlibs[lib_idx].numfunc = 0; loader_data.shlibs[lib_idx].numfunc = 0;
for (int i = 0; i < numf; i++) { for (int i = 0; i < numf; i++) {
farray[i].fptr = dlsym(lib_handle,farray[i].fname); farray[i].fptr = dlsym(lib_handle,farray[i].fname);
AssertFatal(farray[i].fptr, "%s: function not found %s\n", if (!farray[i].fptr) {
dlerror(), farray[i].fname); fprintf(stderr, "[LOADER] load_module_shlib(): function %s not found: %s\n",
farray[i].fname, dlerror());
ret = -1;
goto load_module_shlib_exit;
}
loader_data.shlibs[lib_idx].funcarray[i].fname=strdup(farray[i].fname); loader_data.shlibs[lib_idx].funcarray[i].fname=strdup(farray[i].fname);
loader_data.shlibs[lib_idx].funcarray[i].fptr = farray[i].fptr; loader_data.shlibs[lib_idx].funcarray[i].fptr = farray[i].fptr;
loader_data.shlibs[lib_idx].numfunc++; loader_data.shlibs[lib_idx].numfunc++;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment