diff options
| author | “pengxuanzheng” <[email protected]> | 2022-07-08 05:54:40 +0000 |
|---|---|---|
| committer | “pengxuanzheng” <[email protected]> | 2022-07-12 07:28:14 +0000 |
| commit | d232643ada60cb3c2ec495c0009460470c14ed8c (patch) | |
| tree | b6ba6b6693fd9f8bb1e962e412aaaa543569a945 | |
| parent | b19d688c161dacfd4a48a12970a5185c4c1b6437 (diff) | |
🐞 fix(TSG-11123): 修复c_pull_param_from_lua 段错误
| -rw-r--r-- | gtest/gtest_tsg_lua_register_function.cpp | 8 | ||||
| -rw-r--r-- | gtest/script/call_cfunction.lua | 2 | ||||
| -rw-r--r-- | src/tsg_lua_func.cpp | 43 | ||||
| -rw-r--r-- | src/tsg_lua_interface.h | 2 |
4 files changed, 28 insertions, 27 deletions
diff --git a/gtest/gtest_tsg_lua_register_function.cpp b/gtest/gtest_tsg_lua_register_function.cpp index 9612dd1..e3388de 100644 --- a/gtest/gtest_tsg_lua_register_function.cpp +++ b/gtest/gtest_tsg_lua_register_function.cpp @@ -18,17 +18,17 @@ int set_world(tsg_lua_handle L) lua_arg_t *argv = NULL; c_pull_param_from_lua(L, &argc, &argv); - if (argc != 1 || argv == NULL || argv[0].type != STRING) + if (argc != 2 || argv == NULL || argv[0].type != STRING || argv[1].type != STRING) { return 0; } - char *buff = (char *)calloc(1, argv[0].len + strlen(" world.") + 1); - sprintf(buff, "%s%s", argv[0].str, " world."); + char *buff = (char *)calloc(2, argv[0].len + argv[1].len + 3); + sprintf(buff, "%s %s.", argv[0].str, argv[1].str); c_push_string_into_lua(L, buff, strlen(buff)); free(buff); buff = NULL; - free_param_form_lua(argc, &argv); + free_param_form_lua(argc, argv); return 1; } diff --git a/gtest/script/call_cfunction.lua b/gtest/script/call_cfunction.lua index 4315297..641bcae 100644 --- a/gtest/script/call_cfunction.lua +++ b/gtest/script/call_cfunction.lua @@ -2,5 +2,5 @@ local data = TSG.data local str = TSG.get.get_hello() -local ret = TSG.set.set_world(str) +local ret = TSG.set.set_world(str, "world") return string.len(ret), ret
\ No newline at end of file diff --git a/src/tsg_lua_func.cpp b/src/tsg_lua_func.cpp index 20eb3f1..b19ec01 100644 --- a/src/tsg_lua_func.cpp +++ b/src/tsg_lua_func.cpp @@ -1440,7 +1440,7 @@ int c_pull_param_from_lua(tsg_lua_handle L, int *argc, struct lua_arg_t **argv) return 0; } - *argv = (struct lua_arg_t *)calloc(*argc, sizeof(struct lua_arg_t)); + struct lua_arg_t *value = (struct lua_arg_t *)calloc(*argc, sizeof(struct lua_arg_t)); // memset(argv, 0, argc * sizeof(struct lua_arg_t)); const char *str = NULL; @@ -1450,51 +1450,52 @@ int c_pull_param_from_lua(tsg_lua_handle L, int *argc, struct lua_arg_t **argv) switch (type) { case LUA_TBOOLEAN: - argv[i]->type = BOOLEAN; - argv[i]->flag = lua_toboolean(L, i - *argc); + value[i].type = BOOLEAN; + value[i].flag = lua_toboolean(L, i - *argc); break; case LUA_TNUMBER: - argv[i]->type = INTEGER; - argv[i]->num = lua_tonumber(L, i - *argc); + value[i].type = INTEGER; + value[i].num = lua_tonumber(L, i - *argc); break; case LUA_TSTRING: - argv[i]->type = STRING; + value[i].type = STRING; str = lua_tostring(L, i - *argc); - argv[i]->len = strlen(str); - argv[i]->str = (char *)malloc(argv[i]->len+1); - memcpy(argv[i]->str, str, argv[i]->len); - argv[i]->str[argv[i]->len] = '\0'; + value[i].len = strlen(str); + value[i].str = (char *)malloc(value[i].len+1); + memcpy(value[i].str, str, value[i].len); + value[i].str[value[i].len] = '\0'; break; default: + free_param_form_lua(*argc, value); + *argc = 0; + *argv = NULL; return ERR_LUA_FUNCTION_ARGV; } } + *argv = value; + return 0; } -int free_param_form_lua(int argc, lua_arg_t **argv) +int free_param_form_lua(int argc, lua_arg_t *argv) { - if (argc == 0 || *argv == NULL) + if (argc == 0 || argv == NULL) { return 0; } for(int i = 0; i < argc; i++) { - if (argv[i] == NULL) - { - continue; - } - if (argv[i]->type == STRING) + if (argv[i].type == STRING) { - free(argv[i]->str); - argv[i]->str = NULL; + free(argv[i].str); + argv[i].str = NULL; } } - free(*argv); - *argv = NULL; + free(argv); + //*argv = NULL; return 0; } diff --git a/src/tsg_lua_interface.h b/src/tsg_lua_interface.h index 3642012..4f73d25 100644 --- a/src/tsg_lua_interface.h +++ b/src/tsg_lua_interface.h @@ -166,7 +166,7 @@ int tsg_lua_cache_exec(tsg_lua_handle L, size_t script_id, const char *in, size_ int tsg_destory_lua(tsg_lua_handle L); int c_pull_param_from_lua(tsg_lua_handle lua, int *argc, lua_arg_t **argv); -int free_param_form_lua(int argc, lua_arg_t **argv); +int free_param_form_lua(int argc, lua_arg_t *argv); int c_push_num_into_lua(tsg_lua_handle lua, long num); int c_push_bool_into_lua(tsg_lua_handle lua, bool flag); int c_push_nil_into_lua(tsg_lua_handle lua); |
