Skip to content

Commit 58d0f33

Browse files
committed
Add secure versions for metacallv and metacallfv.
1 parent 9a4f8a5 commit 58d0f33

File tree

2 files changed

+58
-3
lines changed

2 files changed

+58
-3
lines changed

source/metacall/include/metacall/metacall.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,24 @@ METACALL_API int metacall_load_from_configuration(const char * path, void ** han
270270
*/
271271
METACALL_API void * metacallv(const char * name, void * args[]);
272272

273+
/**
274+
* @brief
275+
* Call a function anonymously by value array @args
276+
*
277+
* @param[in] name
278+
* Name of the function
279+
*
280+
* @param[in] args
281+
* Array of pointers to data
282+
*
283+
* @param[in] size
284+
* Number of elements of the call
285+
*
286+
* @return
287+
* Pointer to value containing the result of the call
288+
*/
289+
METACALL_API void * metacallv_s(const char * name, void * args[], size_t size);
290+
273291
/**
274292
* @brief
275293
* Call a function anonymously by handle @handle value array @args
@@ -421,6 +439,24 @@ METACALL_API void * metacall_handle_export(void * handle);
421439
*/
422440
METACALL_API void * metacallfv(void * func, void * args[]);
423441

442+
/**
443+
* @brief
444+
* Call a function anonymously by value array @args and function @func
445+
*
446+
* @param[in] func
447+
* Reference to function to be called
448+
*
449+
* @param[in] args
450+
* Array of pointers to data
451+
*
452+
* @param[in] size
453+
* Number of function arguments
454+
*
455+
* @return
456+
* Pointer to value containing the result of the call
457+
*/
458+
METACALL_API void * metacallfv_s(void * func, void * args[], size_t size);
459+
424460
/**
425461
* @brief
426462
* Call a function anonymously by variable arguments @va_args and function @func

source/metacall/source/metacall.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,11 @@ void * metacallv(const char * name, void * args[])
264264
return metacallfv(loader_get(name), args);
265265
}
266266

267+
void * metacallv_s(const char * name, void * args[], size_t size)
268+
{
269+
return metacallfv_s(loader_get(name), args, size);
270+
}
271+
267272
void * metacallhv(void * handle, const char * name, void * args[])
268273
{
269274
(void)handle;
@@ -611,11 +616,25 @@ void * metacallfv(void * func, void * args[])
611616
{
612617
signature s = function_signature(f);
613618

614-
size_t iterator, args_count = signature_count(s);
619+
return metacallfv_s(func, args, signature_count(s));
620+
}
621+
622+
return NULL;
623+
}
624+
625+
void * metacallfv_s(void * func, void * args[], size_t size)
626+
{
627+
function f = (function)func;
628+
629+
if (f != NULL)
630+
{
631+
signature s = function_signature(f);
632+
633+
size_t iterator;
615634

616635
value ret;
617636

618-
for (iterator = 0; iterator < args_count; ++iterator)
637+
for (iterator = 0; iterator < size; ++iterator)
619638
{
620639
type t = signature_get_type(s, iterator);
621640

@@ -635,7 +654,7 @@ void * metacallfv(void * func, void * args[])
635654
}
636655
}
637656

638-
ret = function_call(f, args, args_count);
657+
ret = function_call(f, args, size);
639658

640659
if (ret != NULL)
641660
{

0 commit comments

Comments
 (0)