Browse Source

fix: clib读取动态库时检查env

SongZihuan 4 years ago
parent
commit
44086c4176
3 changed files with 12 additions and 5 deletions
  1. 4 0
      vmcore/ofunc/src/vmobj/lib_.c
  2. 6 2
      vmcore/src/inter.c
  3. 2 3
      vmcore/src/runfile.c

+ 4 - 0
vmcore/ofunc/src/vmobj/lib_.c

@@ -43,6 +43,10 @@ static ResultType lib_init(O_FUNC){
     }
     path = memWcsToStr(ap[1].value->value->data.str.str, false);
     handle = dlopen(path, RTLD_NOW);
+    if (handle == NULL) {
+        path = memStrcat(inter->data.env, path, false, true);  // 检查env地址下是否存在这个包
+        handle = dlopen(path, RTLD_NOW);
+    }
     if (handle == NULL) {
         wchar_t *tmp = memWidecat(L"load lib error: ", memStrToWcs(dlerror(), false), false, true);
         setResultError(E_ImportException, tmp, LINEFILE, true, CNEXT_NT);

+ 6 - 2
vmcore/src/inter.c

@@ -7,7 +7,8 @@ Inter *makeInter(char *out, char *error_, char *in, char *env, LinkValue *belong
     tmp->hash_base = NULL;
     tmp->base_var = NULL;
     tmp->package = NULL;
-    tmp->data.env = memStrcpy(env);
+    tmp->data.env = NULL;
+    changeInterEnv(env, false, tmp);
 
     setBaseInterData(tmp);
     tmp->var_list = makeVarList(tmp, true, NULL);
@@ -277,7 +278,10 @@ void changeInterEnv(char *env, bool split, Inter *inter) {
     }
 
     memFree(inter->data.env);
-    inter->data.env = memStrcpy(env);
+    if (env[memStrlen(env)] == SEP_CH)
+        inter->data.env = memStrcpy(env);
+    else
+        inter->data.env = memStrcat(env, SEP, false, false);  // 确保以SEP_CH结尾
     if (split)
         *bak = SEP_CH;
 }

+ 2 - 3
vmcore/src/runfile.c

@@ -66,7 +66,6 @@ static bool isExist(char **path, bool is_ab, char *file) {  // is_ab 参数参
 
 int checkFileDir(char **file_dir, FUNC) {
     int return_num;
-    char *arr_cwd = inter->data.env;
     bool diff = false;
     char *lib_file = strncmp(*file_dir, "lib", 3) == 0 ? memStrcpy(*file_dir) : (diff = true, memStrcat("libvm", *file_dir, false, false));  // 自动增加libvm前缀
     if (strstr(lib_file, SHARED_MARK) == NULL) {
@@ -92,7 +91,7 @@ int checkFileDir(char **file_dir, FUNC) {
         CHECK_TYPE(*file_dir);
 
     {
-        char *p_cwd = memStrcatIter(arr_cwd, false, SEP, *file_dir, NULL);  // 以NULL结尾表示结束
+        char *p_cwd = memStrcatIter(inter->data.env, false, SEP, *file_dir, NULL);  // 以NULL结尾表示结束
         if (isExist(&p_cwd, false, "__init__.vm")) {
             memFree(*file_dir);
             *file_dir = p_cwd;  // p_cwd 不需要释放
@@ -100,7 +99,7 @@ int checkFileDir(char **file_dir, FUNC) {
         } else if (diff) {  // 检查是否为动态库, 若 lib_file 和 file_dir 一致则不检查
             void *tmp_dl;
             memFree(p_cwd);
-            p_cwd = memStrcatIter(arr_cwd, false, SEP, lib_file, NULL);  // 以NULL结尾表示结束
+            p_cwd = memStrcatIter(inter->data.env, false, SEP, lib_file, NULL);  // 以NULL结尾表示结束
             if (CHECK_CLIB(p_cwd, tmp_dl)) {
                 memFree(*file_dir);
                 *file_dir = p_cwd;  // p_cwd 不需要释放