improved error checking and some fixes
[oweals/openssl.git] / crypto / dso / dso_dlfcn.c
index de88b2fd16d033da6795271e10fe255de4ee6804..1fd10104c521ccbf29a798091faa078f0e1c81aa 100644 (file)
@@ -128,7 +128,11 @@ DSO_METHOD *DSO_METHOD_dlfcn(void)
 #              endif
 #      endif
 #else
-#      define DLOPEN_FLAG RTLD_NOW /* Hope this works everywhere else */
+#      ifdef OPENSSL_SYS_SUNOS
+#              define DLOPEN_FLAG 1
+#      else
+#              define DLOPEN_FLAG RTLD_NOW /* Hope this works everywhere else */
+#      endif
 #endif
 
 /* For this DSO_METHOD, our meth_data STACK will contain;
@@ -140,13 +144,19 @@ static int dlfcn_load(DSO *dso)
        void *ptr = NULL;
        /* See applicable comments in dso_dl.c */
        char *filename = DSO_convert_filename(dso, NULL);
+       int flags = DLOPEN_FLAG;
 
        if(filename == NULL)
                {
                DSOerr(DSO_F_DLFCN_LOAD,DSO_R_NO_FILENAME);
                goto err;
                }
-       ptr = dlopen(filename, DLOPEN_FLAG);
+
+#ifdef RTLD_GLOBAL
+       if (dso->flags & DSO_FLAG_GLOBAL_SYMBOLS)
+               flags |= RTLD_GLOBAL;
+#endif
+       ptr = dlopen(filename, flags);
        if(ptr == NULL)
                {
                DSOerr(DSO_F_DLFCN_LOAD,DSO_R_LOAD_FAILED);
@@ -227,7 +237,7 @@ static void *dlfcn_bind_var(DSO *dso, const char *symname)
 static DSO_FUNC_TYPE dlfcn_bind_func(DSO *dso, const char *symname)
        {
        void *ptr;
-       DSO_FUNC_TYPE sym;
+       DSO_FUNC_TYPE sym, *tsym = &sym;
 
        if((dso == NULL) || (symname == NULL))
                {
@@ -245,7 +255,7 @@ static DSO_FUNC_TYPE dlfcn_bind_func(DSO *dso, const char *symname)
                DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_NULL_HANDLE);
                return(NULL);
                }
-       sym = (DSO_FUNC_TYPE)dlsym(ptr, symname);
+       *(void **)(tsym) = dlsym(ptr, symname);
        if(sym == NULL)
                {
                DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_SYM_FAILURE);