Some test fixes, and introduce some pledge and unveil for OpenBSD.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4851 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
parent
9af4068bb6
commit
dca48fae36
15
src/main.c
15
src/main.c
@ -395,6 +395,21 @@ static void _shed_privileges()
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__OpenBSD__)
|
||||
/* How do I unveil nothing? */
|
||||
if (unveil("/dev/null", "r") ||
|
||||
unveil(NULL, NULL))
|
||||
{
|
||||
perror("unveil");
|
||||
exit(-1);
|
||||
}
|
||||
if (pledge("stdio unveil", NULL))
|
||||
{
|
||||
perror("pledge");
|
||||
exit(-1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static int _tf_command_run(const char* file, int argc, char* argv[])
|
||||
|
10
src/task.c
10
src/task.c
@ -193,6 +193,7 @@ static bool _export_record_release(tf_task_t* task, export_record_t** export)
|
||||
}
|
||||
|
||||
static JSValue _tf_task_setTimeout(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv);
|
||||
static JSValue _tf_task_pokeSandbox(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv);
|
||||
static promise_t* _tf_task_find_promise(tf_task_t* task, promiseid_t id);
|
||||
static void _tf_task_sendPromiseExportMessage(tf_task_t* from, tf_taskstub_t* to, tf_task_message_t messageType, promiseid_t promiseId, exportid_t exportId, JSValue result);
|
||||
static JSValue _tf_task_executeSource(tf_task_t* task, const char* source, const char* name);
|
||||
@ -1769,6 +1770,7 @@ void tf_task_activate(tf_task_t* task)
|
||||
JS_SetPropertyStr(context, global, "platform", JS_NewCFunction(context, _tf_task_platform, "platform", 0));
|
||||
JS_SetPropertyStr(context, global, "getFile", JS_NewCFunction(context, _tf_task_getFile, "getFile", 1));
|
||||
JS_SetPropertyStr(context, global, "setTimeout", JS_NewCFunction(context, _tf_task_setTimeout, "setTimeout", 2));
|
||||
JS_SetPropertyStr(context, global, "pokeSandbox", JS_NewCFunction(context, _tf_task_pokeSandbox, "pokeSandbox", 0));
|
||||
JS_FreeValue(context, global);
|
||||
}
|
||||
|
||||
@ -2129,3 +2131,11 @@ static JSValue _tf_task_setTimeout(JSContext* context, JSValueConst this_val, in
|
||||
}
|
||||
return JS_NULL;
|
||||
}
|
||||
|
||||
static JSValue _tf_task_pokeSandbox(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||
{
|
||||
tf_printf("Poking sandbox.\n");
|
||||
system("pwd");
|
||||
tf_printf("Sandbox poked.\n");
|
||||
return JS_UNDEFINED;
|
||||
}
|
||||
|
43
src/tests.c
43
src/tests.c
@ -34,7 +34,7 @@
|
||||
#if !TARGET_OS_IPHONE
|
||||
static void _write_file(const char* path, const char* contents)
|
||||
{
|
||||
FILE* file = fopen("out/test.js", "w");
|
||||
FILE* file = fopen(path, "w");
|
||||
if (!file)
|
||||
{
|
||||
printf("Unable to write %s: %s.\n", path, strerror(errno));
|
||||
@ -58,12 +58,48 @@ static void _test_nop(const tf_test_options_t* options)
|
||||
assert(WEXITSTATUS(result) == 0);
|
||||
}
|
||||
|
||||
static void _test_sandbox(const tf_test_options_t* options)
|
||||
{
|
||||
_write_file("out/test.js",
|
||||
"var task = new Task();\n"
|
||||
"task.onExit = function(code, signal) {\n"
|
||||
" print('child exited', code, signal);\n"
|
||||
" if (code === 0 && signal === 0) {\n"
|
||||
" exit(1);\n"
|
||||
" }\n"
|
||||
"};\n"
|
||||
"task.activate();\n"
|
||||
"File.readFile('out/child.js').then(function(data) {\n"
|
||||
" task.execute({name: 'child.js', source: utf8Decode(data)}).then(function() {\n"
|
||||
" print('child started');\n"
|
||||
" });\n"
|
||||
"});");
|
||||
|
||||
_write_file("out/child.js",
|
||||
"print('Poking the sandbox. This should fail.');\n"
|
||||
"pokeSandbox();\n"
|
||||
"print('We poked the sandbox without failing.');\n"
|
||||
"exit(0);\n");
|
||||
|
||||
char command[256];
|
||||
snprintf(command, sizeof(command), "%s run --db-path=:memory: -s out/test.js" TEST_ARGS, options->exe_path);
|
||||
tf_printf("%s\n", command);
|
||||
int result = system(command);
|
||||
(void)result;
|
||||
assert(WIFEXITED(result));
|
||||
assert(WEXITSTATUS(result) == 0);
|
||||
|
||||
unlink("out/test.js");
|
||||
unlink("out/child.js");
|
||||
}
|
||||
|
||||
static void _test_child(const tf_test_options_t* options)
|
||||
{
|
||||
_write_file("out/test.js",
|
||||
"var task = new Task();\n"
|
||||
"task.onExit = function() {\n"
|
||||
" print('child exited');\n"
|
||||
"task.onExit = function(code, signal) {\n"
|
||||
" print('child exited', code, signal);\n"
|
||||
" exit(code || signal);\n"
|
||||
"};\n"
|
||||
"task.activate();\n"
|
||||
"File.readFile('out/child.js').then(function(data) {\n"
|
||||
@ -846,6 +882,7 @@ void tf_tests(const tf_test_options_t* options)
|
||||
_tf_test_run(options, "ssb_id", tf_ssb_test_id_conversion, false);
|
||||
_tf_test_run(options, "ssb_following", tf_ssb_test_following, false);
|
||||
_tf_test_run(options, "nop", _test_nop, false);
|
||||
_tf_test_run(options, "sandbox", _test_sandbox, false);
|
||||
_tf_test_run(options, "child", _test_child, false);
|
||||
_tf_test_run(options, "promise", _test_promise, false);
|
||||
_tf_test_run(options, "promise_remote_throw", _test_promise_remote_throw, false);
|
||||
|
Loading…
Reference in New Issue
Block a user