static int LSCRIU_load_liblscapi(void) { void *lib_handle = NULL; void *pthread_lib_handle = NULL; if (s_native) return 0; // Numerical signals indicates Apache int error = 1; char *last; if (!(lib_handle = DL_LOAD(last = "liblscapi.so")) /*|| !(pthread_lib_handle = DL_LOAD(last = "libpthread.so"))*/) fprintf(stderr, "LSCRIU (%d): failed to dlopen %s: %s - ignore CRIU\n", s_pid, last, dlerror()); else if (!(s_lscapi_dump_me = dlsym(lib_handle, last = "lscapi_dump_me")) || !(s_lscapi_prepare_me = dlsym(lib_handle, last = "lscapi_prepare_me")) || !(psem_open = dlsym(pthread_lib_handle, last = "sem_open")) || !(psem_post = dlsym(pthread_lib_handle, last = "sem_post")) || !(psem_close = dlsym(pthread_lib_handle, last = "sem_close"))) fprintf(stderr, "LSCRIU (%d): failed to dlsym %s: %s - ignore CRIU\n", s_pid, last, dlerror()); else error = 0; if (error) { // close the dll handles so we release the resources if (lib_handle) dlclose(lib_handle); if (pthread_lib_handle) dlclose(pthread_lib_handle); return -1; } return 0; }
int zend_load_extension(const char *path) { #if ZEND_EXTENSIONS_SUPPORT DL_HANDLE handle; handle = DL_LOAD(path); if (!handle) { #ifndef ZEND_WIN32 fprintf(stderr, "Failed loading %s: %s\n", path, DL_ERROR()); #else fprintf(stderr, "Failed loading %s\n", path); /* See http://support.microsoft.com/kb/190351 */ fflush(stderr); #endif return FAILURE; } return zend_load_extension_handle(handle, path); #else fprintf(stderr, "Extensions are not supported on this platform.\n"); /* See http://support.microsoft.com/kb/190351 */ #ifdef ZEND_WIN32 fflush(stderr); #endif return FAILURE; #endif }
static UBool bzip2_trydload(void) { DL_HANDLE handle; handle = DL_LOAD("bz2", 1); if (!handle) { if (HAVE_DL_ERROR) { debug("failed loading bzip2: %s", DL_ERROR); } else { debug("failed loading bzip2"); } return FALSE; } DL_GET_SYM(handle, DRNS(BZ2_bzerror), "BZ2_bzerror"); DL_GET_SYM(handle, DRNS(BZ2_bzReadOpen), "BZ2_bzReadOpen"); DL_GET_SYM(handle, DRNS(BZ2_bzRead), "BZ2_bzRead"); DL_GET_SYM(handle, DRNS(BZ2_bzReadClose), "BZ2_bzReadClose"); env_register_resource(handle, (func_dtor_t) DL_UNLOAD); return TRUE; }
/* {{{ php_load_shlib */ PHPAPI void *php_load_shlib(char *path, char **errp) { void *handle; char *err; handle = DL_LOAD(path); if (!handle) { err = GET_DL_ERROR(); #ifdef PHP_WIN32 if (err && (*err)) { (*errp)=estrdup(err); LocalFree(err); } else { (*errp) = estrdup("<No message>"); } #else (*errp) = estrdup(err); GET_DL_ERROR(); /* free the buffer storing the error */ #endif } return handle; }
/* {{{ php_load_shlib */ PHPAPI void *php_load_shlib(char *path, char **errp) { void *handle; char *err; handle = DL_LOAD(path); if (!handle) { err = GET_DL_ERROR(); #ifdef PHP_WIN32 if (err && (*err)) { size_t i = strlen(err); (*errp)=estrdup(err); php_win32_error_msg_free(err); while (i > 0 && isspace((*errp)[i-1])) { (*errp)[i-1] = '\0'; i--; } } else { (*errp) = estrdup("<No message>"); } #else (*errp) = estrdup(err); GET_DL_ERROR(); /* free the buffer storing the error */ #endif } return handle; }
/* {{{ php_load_extension */ PHPAPI int php_load_extension(char *filename, int type, int start_now) { void *handle; char *libpath; zend_module_entry *module_entry; zend_module_entry *(*get_module)(void); int error_type; char *extension_dir; if (type == MODULE_PERSISTENT) { extension_dir = INI_STR("extension_dir"); } else { extension_dir = PG(extension_dir); } if (type == MODULE_TEMPORARY) { error_type = E_WARNING; } else { error_type = E_CORE_WARNING; } /* Check if passed filename contains directory separators */ if (strchr(filename, '/') != NULL || strchr(filename, DEFAULT_SLASH) != NULL) { /* Passing modules with full path is not supported for dynamically loaded extensions */ if (type == MODULE_TEMPORARY) { php_error_docref(NULL, E_WARNING, "Temporary module name should contain only filename"); return FAILURE; } libpath = estrdup(filename); } else if (extension_dir && extension_dir[0]) { int extension_dir_len = (int)strlen(extension_dir); if (IS_SLASH(extension_dir[extension_dir_len-1])) { spprintf(&libpath, 0, "%s%s", extension_dir, filename); /* SAFE */ } else { spprintf(&libpath, 0, "%s%c%s", extension_dir, DEFAULT_SLASH, filename); /* SAFE */ } } else { return FAILURE; /* Not full path given or extension_dir is not set */ } /* load dynamic symbol */ handle = DL_LOAD(libpath); if (!handle) { #if PHP_WIN32 char *err = GET_DL_ERROR(); if (err && (*err != '\0')) { php_error_docref(NULL, error_type, "Unable to load dynamic library '%s' - %s", libpath, err); LocalFree(err); } else { php_error_docref(NULL, error_type, "Unable to load dynamic library '%s' - %s", libpath, "Unknown reason"); } #else php_error_docref(NULL, error_type, "Unable to load dynamic library '%s' - %s", libpath, GET_DL_ERROR()); GET_DL_ERROR(); /* free the buffer storing the error */ #endif efree(libpath); return FAILURE; } efree(libpath); get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "get_module"); /* Some OS prepend _ to symbol names while their dynamic linker * does not do that automatically. Thus we check manually for * _get_module. */ if (!get_module) { get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "_get_module"); } if (!get_module) { if (DL_FETCH_SYMBOL(handle, "zend_extension_entry") || DL_FETCH_SYMBOL(handle, "_zend_extension_entry")) { DL_UNLOAD(handle); php_error_docref(NULL, error_type, "Invalid library (appears to be a Zend Extension, try loading using zend_extension=%s from php.ini)", filename); return FAILURE; } DL_UNLOAD(handle); php_error_docref(NULL, error_type, "Invalid library (maybe not a PHP library) '%s'", filename); return FAILURE; } module_entry = get_module(); if (module_entry->zend_api != ZEND_MODULE_API_NO) { php_error_docref(NULL, error_type, "%s: Unable to initialize module\n" "Module compiled with module API=%d\n" "PHP compiled with module API=%d\n" "These options need to match\n", module_entry->name, module_entry->zend_api, ZEND_MODULE_API_NO); DL_UNLOAD(handle); return FAILURE; } if(strcmp(module_entry->build_id, ZEND_MODULE_BUILD_ID)) { php_error_docref(NULL, error_type, "%s: Unable to initialize module\n" "Module compiled with build ID=%s\n" "PHP compiled with build ID=%s\n" "These options need to match\n", module_entry->name, module_entry->build_id, ZEND_MODULE_BUILD_ID); DL_UNLOAD(handle); return FAILURE; } module_entry->type = type; module_entry->module_number = zend_next_free_module(); module_entry->handle = handle; if ((module_entry = zend_register_module_ex(module_entry)) == NULL) { DL_UNLOAD(handle); return FAILURE; } if ((type == MODULE_TEMPORARY || start_now) && zend_startup_module_ex(module_entry) == FAILURE) { DL_UNLOAD(handle); return FAILURE; } if ((type == MODULE_TEMPORARY || start_now) && module_entry->request_startup_func) { if (module_entry->request_startup_func(type, module_entry->module_number) == FAILURE) { php_error_docref(NULL, error_type, "Unable to initialize module '%s'", module_entry->name); DL_UNLOAD(handle); return FAILURE; } } return SUCCESS; }
int zend_load_extension(const char *path) { #if ZEND_EXTENSIONS_SUPPORT DL_HANDLE handle; zend_extension *new_extension; zend_extension_version_info *extension_version_info; handle = DL_LOAD(path); if (!handle) { #ifndef ZEND_WIN32 fprintf(stderr, "Failed loading %s: %s\n", path, DL_ERROR()); /* See http://support.microsoft.com/kb/190351 */ #ifdef PHP_WIN32 fflush(stderr); #endif #else fprintf(stderr, "Failed loading %s\n", path); #endif return FAILURE; } extension_version_info = (zend_extension_version_info *) DL_FETCH_SYMBOL(handle, "extension_version_info"); if (!extension_version_info) { extension_version_info = (zend_extension_version_info *) DL_FETCH_SYMBOL(handle, "_extension_version_info"); } new_extension = (zend_extension *) DL_FETCH_SYMBOL(handle, "zend_extension_entry"); if (!new_extension) { new_extension = (zend_extension *) DL_FETCH_SYMBOL(handle, "_zend_extension_entry"); } if (!extension_version_info || !new_extension) { fprintf(stderr, "%s doesn't appear to be a valid Zend extension\n", path); /* See http://support.microsoft.com/kb/190351 */ #ifdef PHP_WIN32 fflush(stderr); #endif DL_UNLOAD(handle); return FAILURE; } /* allow extension to proclaim compatibility with any Zend version */ if (extension_version_info->zend_extension_api_no != ZEND_EXTENSION_API_NO &&(!new_extension->api_no_check || new_extension->api_no_check(ZEND_EXTENSION_API_NO) != SUCCESS)) { if (extension_version_info->zend_extension_api_no > ZEND_EXTENSION_API_NO) { fprintf(stderr, "%s requires Zend Engine API version %d.\n" "The Zend Engine API version %d which is installed, is outdated.\n\n", new_extension->name, extension_version_info->zend_extension_api_no, ZEND_EXTENSION_API_NO); /* See http://support.microsoft.com/kb/190351 */ #ifdef PHP_WIN32 fflush(stderr); #endif DL_UNLOAD(handle); return FAILURE; } else if (extension_version_info->zend_extension_api_no < ZEND_EXTENSION_API_NO) { fprintf(stderr, "%s requires Zend Engine API version %d.\n" "The Zend Engine API version %d which is installed, is newer.\n" "Contact %s at %s for a later version of %s.\n\n", new_extension->name, extension_version_info->zend_extension_api_no, ZEND_EXTENSION_API_NO, new_extension->author, new_extension->URL, new_extension->name); /* See http://support.microsoft.com/kb/190351 */ #ifdef PHP_WIN32 fflush(stderr); #endif DL_UNLOAD(handle); return FAILURE; } } else if (strcmp(ZEND_EXTENSION_BUILD_ID, extension_version_info->build_id) && (!new_extension->build_id_check || new_extension->build_id_check(ZEND_EXTENSION_BUILD_ID) != SUCCESS)) { fprintf(stderr, "Cannot load %s - it was built with configuration %s, whereas running engine is %s\n", new_extension->name, extension_version_info->build_id, ZEND_EXTENSION_BUILD_ID); /* See http://support.microsoft.com/kb/190351 */ #ifdef PHP_WIN32 fflush(stderr); #endif DL_UNLOAD(handle); return FAILURE; } return zend_register_extension(new_extension, handle); #else fprintf(stderr, "Extensions are not supported on this platform.\n"); /* See http://support.microsoft.com/kb/190351 */ #ifdef PHP_WIN32 fflush(stderr); #endif return FAILURE; #endif }
/* {{{ php_dl */ PHPAPI int php_load_extension(char *filename, int type, int start_now TSRMLS_DC) /* {{{ */ { void *handle; char *libpath; zend_module_entry *module_entry; zend_module_entry *(*get_module)(void); int error_type; char *extension_dir; if (type == MODULE_PERSISTENT) { extension_dir = INI_STR("extension_dir"); } else { extension_dir = PG(extension_dir); } if (type == MODULE_TEMPORARY) { error_type = E_WARNING; } else { error_type = E_CORE_WARNING; } /* Check if passed filename contains directory separators */ if (strchr(filename, '/') != NULL || strchr(filename, DEFAULT_SLASH) != NULL) { /* Passing modules with full path is not supported for dynamically loaded extensions */ if (type == MODULE_TEMPORARY) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Temporary module name should contain only filename"); return FAILURE; } libpath = estrdup(filename); } else if (extension_dir && extension_dir[0]) { int extension_dir_len = strlen(extension_dir); if (IS_SLASH(extension_dir[extension_dir_len-1])) { spprintf(&libpath, 0, "%s%s", extension_dir, filename); /* SAFE */ } else { spprintf(&libpath, 0, "%s%c%s", extension_dir, DEFAULT_SLASH, filename); /* SAFE */ } } else { return FAILURE; /* Not full path given or extension_dir is not set */ } /* load dynamic symbol */ handle = DL_LOAD(libpath); if (!handle) { #if PHP_WIN32 char *err = GET_DL_ERROR(); if (err && (*err != "")) { php_error_docref(NULL TSRMLS_CC, error_type, "Unable to load dynamic library '%s' - %s", libpath, err); LocalFree(err); } else { php_error_docref(NULL TSRMLS_CC, error_type, "Unable to load dynamic library '%s' - %s", libpath, "Unknown reason"); } #else php_error_docref(NULL TSRMLS_CC, error_type, "Unable to load dynamic library '%s' - %s", libpath, GET_DL_ERROR()); GET_DL_ERROR(); /* free the buffer storing the error */ #endif efree(libpath); return FAILURE; } efree(libpath); get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "get_module"); /* Some OS prepend _ to symbol names while their dynamic linker * does not do that automatically. Thus we check manually for * _get_module. */ if (!get_module) { get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "_get_module"); } if (!get_module) { DL_UNLOAD(handle); php_error_docref(NULL TSRMLS_CC, error_type, "Invalid library (maybe not a PHP library) '%s'", filename); return FAILURE; } module_entry = get_module(); if (module_entry->zend_api != ZEND_MODULE_API_NO) { /* Check for pre-4.1.0 module which has a slightly different module_entry structure :( */ struct pre_4_1_0_module_entry { char *name; zend_function_entry *functions; int (*module_startup_func)(INIT_FUNC_ARGS); int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); int (*request_startup_func)(INIT_FUNC_ARGS); int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); int (*global_startup_func)(void); int (*global_shutdown_func)(void); int globals_id; int module_started; unsigned char type; void *handle; int module_number; unsigned char zend_debug; unsigned char zts; unsigned int zend_api; }; const char *name; int zend_api; if ((((struct pre_4_1_0_module_entry *)module_entry)->zend_api > 20000000) && (((struct pre_4_1_0_module_entry *)module_entry)->zend_api < 20010901) ) { name = ((struct pre_4_1_0_module_entry *)module_entry)->name; zend_api = ((struct pre_4_1_0_module_entry *)module_entry)->zend_api; } else { name = module_entry->name; zend_api = module_entry->zend_api; } php_error_docref(NULL TSRMLS_CC, error_type, "%s: Unable to initialize module\n" "Module compiled with module API=%d\n" "PHP compiled with module API=%d\n" "These options need to match\n", name, zend_api, ZEND_MODULE_API_NO); DL_UNLOAD(handle); return FAILURE; } if(strcmp(module_entry->build_id, ZEND_MODULE_BUILD_ID)) { php_error_docref(NULL TSRMLS_CC, error_type, "%s: Unable to initialize module\n" "Module compiled with build ID=%s\n" "PHP compiled with build ID=%s\n" "These options need to match\n", module_entry->name, module_entry->build_id, ZEND_MODULE_BUILD_ID); DL_UNLOAD(handle); return FAILURE; } module_entry->type = type; module_entry->module_number = zend_next_free_module(); module_entry->handle = handle; if ((module_entry = zend_register_module_ex(module_entry TSRMLS_CC)) == NULL) { DL_UNLOAD(handle); return FAILURE; } if ((type == MODULE_TEMPORARY || start_now) && zend_startup_module_ex(module_entry TSRMLS_CC) == FAILURE) { DL_UNLOAD(handle); return FAILURE; } if ((type == MODULE_TEMPORARY || start_now) && module_entry->request_startup_func) { if (module_entry->request_startup_func(type, module_entry->module_number TSRMLS_CC) == FAILURE) { php_error_docref(NULL TSRMLS_CC, error_type, "Unable to initialize module '%s'", module_entry->name); DL_UNLOAD(handle); return FAILURE; } } return SUCCESS; }