Skip to content

Commit f1d103a

Browse files
author
Jim Flood
committed
Keep arg values on stack to prevent segfault in user-created function
1 parent 9cbc535 commit f1d103a

File tree

1 file changed

+2
-7
lines changed

1 file changed

+2
-7
lines changed

ext/sqlite3/database.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -359,22 +359,17 @@ static void set_sqlite3_func_result(sqlite3_context * ctx, VALUE result)
359359
static void rb_sqlite3_func(sqlite3_context * ctx, int argc, sqlite3_value **argv)
360360
{
361361
VALUE callable = (VALUE)sqlite3_user_data(ctx);
362-
VALUE * params = NULL;
362+
VALUE params[argc]; /* RB_GC_GUARD unreliable -- keep values safely on the stack */
363363
VALUE result;
364364
int i;
365365

366366
if (argc > 0) {
367-
params = xcalloc((size_t)argc, sizeof(VALUE *));
368-
369367
for(i = 0; i < argc; i++) {
370-
VALUE param = sqlite3val2rb(argv[i]);
371-
RB_GC_GUARD(param);
372-
params[i] = param;
368+
params[i] = sqlite3val2rb(argv[i]);
373369
}
374370
}
375371

376372
result = rb_funcall2(callable, rb_intern("call"), argc, params);
377-
xfree(params);
378373

379374
set_sqlite3_func_result(ctx, result);
380375
}

0 commit comments

Comments
 (0)