From d3471d406fa3ec4d0289f82c8c690923390ab28a Mon Sep 17 00:00:00 2001 From: Shangbin Liu Date: Thu, 7 Sep 2023 16:03:57 +0800 Subject: [PATCH 24/26] uadk: support loading alg lib from specified directories Solving the problem of traversing the entire library directory to load alg drv lib may result in unexpected results by specifying the loading directory 'uadk'. Signed-off-by: Shangbin Liu --- Makefile.am | 6 ++++-- wd_util.c | 26 +++++++++++++------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Makefile.am b/Makefile.am index f04164f..657ed20 100644 --- a/Makefile.am +++ b/Makefile.am @@ -38,8 +38,10 @@ pkginclude_HEADERS = include/wd.h include/wd_cipher.h include/wd_aead.h \ nobase_pkginclude_HEADERS = v1/wd.h v1/wd_cipher.h v1/wd_aead.h v1/uacce.h v1/wd_dh.h \ v1/wd_digest.h v1/wd_rsa.h v1/wd_bmm.h -lib_LTLIBRARIES=libwd.la libwd_comp.la libwd_crypto.la libhisi_zip.la \ - libhisi_hpre.la libhisi_sec.la +lib_LTLIBRARIES=libwd.la libwd_comp.la libwd_crypto.la + +uadk_driversdir=$(libdir)/uadk +uadk_drivers_LTLIBRARIES=libhisi_sec.la libhisi_hpre.la libhisi_zip.la libwd_la_SOURCES=wd.c wd_mempool.c wd.h wd_alg.c wd_alg.h \ v1/wd.c v1/wd.h v1/wd_adapter.c v1/wd_adapter.h \ diff --git a/wd_util.c b/wd_util.c index cb89709..a9640c3 100644 --- a/wd_util.c +++ b/wd_util.c @@ -28,7 +28,7 @@ #define US2S(us) ((us) >> 20) #define WD_INIT_RETRY_TIMEOUT 3 -#define DEF_DRV_LIB_FILE "libwd.so" +#define WD_DRV_LIB_DIR "uadk" struct msg_pool { /* message array allocated dynamically */ @@ -2151,7 +2151,7 @@ static void dladdr_empty(void) int wd_get_lib_file_path(char *lib_file, char *lib_path, bool is_dir) { char file_path[PATH_MAX] = {0}; - char path[PATH_MAX]; + char path[PATH_MAX] = {0}; Dl_info file_info; int len, rc, i; @@ -2173,16 +2173,17 @@ int wd_get_lib_file_path(char *lib_file, char *lib_path, bool is_dir) } if (is_dir) { - (void)snprintf(lib_path, PATH_MAX, "%s", file_path); - return 0; + len = snprintf(lib_path, PATH_MAX, "%s/%s", file_path, WD_DRV_LIB_DIR); + if (len >= PATH_MAX) + return -WD_EINVAL; + } else { + len = snprintf(lib_path, PATH_MAX, "%s/%s/%s", file_path, WD_DRV_LIB_DIR, lib_file); + if (len >= PATH_MAX) + return -WD_EINVAL; } - len = snprintf(lib_path, PATH_MAX, "%s/%s", file_path, lib_file); - if (len < 0) - return -WD_EINVAL; - if (realpath(lib_path, path) == NULL) { - WD_ERR("%s: no such file or directory!\n", path); + WD_ERR("invalid: %s: no such file or directory!\n", path); return -WD_EINVAL; } @@ -2205,11 +2206,10 @@ void *wd_dlopen_drv(const char *cust_lib_dir) if (ret) return NULL; } else { - (void)snprintf(lib_path, PATH_MAX, "%s/%s", cust_lib_dir, DEF_DRV_LIB_FILE); - ret = access(lib_path, F_OK); - if (ret) + if (realpath(cust_lib_dir, lib_path) == NULL) { + WD_ERR("invalid: %s: no such file or directory!\n", lib_path); return NULL; - + } strncpy(lib_dir_path, cust_lib_dir, PATH_MAX - 1); } -- 2.25.1