summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author“pengxuanzheng” <[email protected]>2022-07-08 05:54:40 +0000
committer“pengxuanzheng” <[email protected]>2022-07-12 07:28:14 +0000
commitd232643ada60cb3c2ec495c0009460470c14ed8c (patch)
treeb6ba6b6693fd9f8bb1e962e412aaaa543569a945
parentb19d688c161dacfd4a48a12970a5185c4c1b6437 (diff)
🐞 fix(TSG-11123): 修复c_pull_param_from_lua 段错误
-rw-r--r--gtest/gtest_tsg_lua_register_function.cpp8
-rw-r--r--gtest/script/call_cfunction.lua2
-rw-r--r--src/tsg_lua_func.cpp43
-rw-r--r--src/tsg_lua_interface.h2
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);