Skip to content

Commit 120fef1

Browse files
committed
add argument number and type checks in cli-core-plugin`
1 parent d2cacbf commit 120fef1

File tree

1 file changed

+90
-12
lines changed

1 file changed

+90
-12
lines changed

source/cli/plugins/cli_core_plugin/source/cli_core_plugin.cpp

Lines changed: 90 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,50 @@ void *load(size_t argc, void *args[], void *data)
3535
(void)argc;
3636
(void)data;
3737

38-
char *tag = metacall_value_to_string(args[0]);
39-
if (tag == NULL)
38+
if (argc < 2)
4039
{
4140
return metacall_value_create_int(1);
4241
}
4342

44-
size_t size = metacall_value_count(args[1]);
43+
void **script_val = NULL;
44+
char **scripts = NULL;
4545

46-
char **scripts = (char **)malloc(sizeof(char *) * size);
47-
void **script_val = metacall_value_to_array(args[1]);
48-
if (scripts == NULL || script_val == NULL)
46+
char *tag = metacall_value_to_string(args[0]);
47+
if (tag == NULL)
4948
{
5049
return metacall_value_create_int(1);
5150
}
5251

52+
size_t size = 0;
53+
if (metacall_value_id(args[1]) == METACALL_ARRAY)
54+
{
55+
size = metacall_value_count(args[1]);
56+
script_val = metacall_value_to_array(args[1]);
57+
if (script_val == NULL)
58+
{
59+
return metacall_value_create_int(1);
60+
}
61+
}
62+
else
63+
{
64+
script_val = (args + 1);
65+
size = argc - 1;
66+
}
67+
68+
scripts = (char **)malloc(sizeof(char *) * size);
69+
5370
for (size_t i = 0; i < size; ++i)
5471
{
55-
scripts[i] = metacall_value_to_string(script_val[i]);
72+
if (metacall_value_id(script_val[i]) == METACALL_STRING)
73+
{
74+
scripts[i] = metacall_value_to_string(script_val[i]);
75+
}
76+
else
77+
{
78+
log_write("metacall", LOG_LEVEL_ERROR, "Calling load with wrong type of argument at argument position %" PRIuS ", expected metacall value id %" PRIuS " , got %" PRIuS,
79+
i + 1, METACALL_STRING, metacall_value_id(script_val[i]));
80+
return metacall_value_create_int(1);
81+
}
5682
}
5783

5884
int ret = metacall_load_from_file(tag, const_cast<const char **>(scripts), size, NULL);
@@ -72,20 +98,46 @@ void *eval(size_t argc, void *args[], void *data)
7298
return metacall_value_create_int(1);
7399
}
74100

75-
char *tag = metacall_value_to_string(args[0]);
76-
char *script = metacall_value_to_string(args[1]);
101+
if (metacall_value_id(args[0]) == METACALL_STRING && metacall_value_id(args[1]) == METACALL_STRING)
102+
{
103+
char *tag = metacall_value_to_string(args[0]);
104+
char *script = metacall_value_to_string(args[1]);
77105

78-
int ret = metacall_load_from_memory(tag, script, strlen(script) + 1, NULL);
79-
return metacall_value_create_int(ret);
106+
return metacall_value_create_int(metacall_load_from_memory(tag, script, strlen(script) + 1, NULL));
107+
}
108+
else
109+
{
110+
log_write("metacall", LOG_LEVEL_ERROR, "Calling eval with wrong type of arguments, expected metacall value id %" PRIuS " , got %" PRIuS " and %" PRIuS,
111+
METACALL_STRING, metacall_value_id(args[0]), metacall_value_id(args[1]));
112+
}
113+
114+
return metacall_value_create_int(1);
80115
}
81116

82117
void *await(size_t argc, void *args[], void *data)
83118
{
84119
(void)argc;
85120
(void)data;
86121

122+
if (argc != 1)
123+
{
124+
log_write("metacall", LOG_LEVEL_ERROR, "Calling await with wrong number of arguments, expected 1 arguments, got %" PRIuS " arguments", argc);
125+
return metacall_value_create_int(1);
126+
}
127+
128+
if (metacall_value_id(args[0]) != METACALL_STRING)
129+
{
130+
log_write("metacall", LOG_LEVEL_ERROR, "Calling await with wrong type of arguments, expected metacall value id %" PRIuS " , got %" PRIuS, METACALL_STRING, metacall_value_id(args[0]));
131+
return metacall_value_create_int(1);
132+
}
133+
87134
/* Parse function call */
88135
std::string func_str = metacall_value_to_string(args[0]);
136+
if (func_str.find('(') == std::string::npos || func_str.find(')') == std::string::npos)
137+
{
138+
log_write("metacall", LOG_LEVEL_ERROR, "'await' called with mangled function call string: %s", func_str.c_str());
139+
return metacall_value_create_int(1);
140+
}
89141

90142
std::string::size_type idx = func_str.find_first_of('(');
91143
std::string func_name = func_str.substr(0, idx);
@@ -144,20 +196,38 @@ void *await(size_t argc, void *args[], void *data)
144196

145197
await_cond.wait(lock);
146198

147-
return fdata.v;
148199
/* Unused */
149200
metacall_value_destroy(future);
150201

151202
metacall_allocator_destroy(allocator);
203+
204+
return fdata.v;
152205
}
153206

154207
void *call(size_t argc, void *args[], void *data)
155208
{
156209
(void)argc;
157210
(void)data;
158211

212+
if (argc != 1)
213+
{
214+
log_write("metacall", LOG_LEVEL_ERROR, "Calling call with wrong number of arguments, expected 1 arguments, got %" PRIuS " arguments", argc);
215+
return metacall_value_create_int(1);
216+
}
217+
218+
if (metacall_value_id(args[0]) != METACALL_STRING)
219+
{
220+
log_write("metacall", LOG_LEVEL_ERROR, "Calling call with wrong type of arguments, expected metacall value id %" PRIuS " , got %" PRIuS, METACALL_STRING, metacall_value_id(args[0]));
221+
return metacall_value_create_int(1);
222+
}
223+
159224
/* Parse function call */
160225
std::string func_str = metacall_value_to_string(args[0]);
226+
if (func_str.find('(') == std::string::npos || func_str.find(')') == std::string::npos)
227+
{
228+
log_write("metacall", LOG_LEVEL_ERROR, "'call' called with mangled function call string: %s", func_str.c_str());
229+
return metacall_value_create_int(1);
230+
}
161231

162232
std::string::size_type idx = func_str.find_first_of('(');
163233
std::string func_name = func_str.substr(0, idx);
@@ -192,6 +262,14 @@ void *clear(size_t argc, void *args[], void *data)
192262

193263
if (argc != 2)
194264
{
265+
log_write("metacall", LOG_LEVEL_ERROR, "Calling call with wrong number of arguments, expected 2 arguments, got %" PRIuS " arguments", argc);
266+
return metacall_value_create_int(1);
267+
}
268+
269+
if (metacall_value_id(args[0]) != METACALL_STRING && metacall_value_id(args[1]) != METACALL_STRING)
270+
{
271+
log_write("metacall", LOG_LEVEL_ERROR, "Calling clear with wrong type of arguments, expected metacall value id %" PRIuS " , got %" PRIuS " and %" PRIuS,
272+
METACALL_STRING, metacall_value_id(args[0]), metacall_value_id(args[1]));
195273
return metacall_value_create_int(1);
196274
}
197275

0 commit comments

Comments
 (0)