From 0018bdd249eb8e76bea56f7826dcb81e2e1c918a Mon Sep 17 00:00:00 2001 From: Toby Jaffey Date: Sat, 13 Dec 2025 19:12:24 +0000 Subject: [PATCH] Add test of reading cstring syscall argument which never terminates before hitting end of ram --- test/common/makefile-rom.common | 1 + test/syscall_args/rom/rom.c | 8 ++++++++ test/syscall_args/shared.h | 1 + test/syscall_args/test/tests.c | 21 +++++++++++++++++++++ 4 files changed, 31 insertions(+) diff --git a/test/common/makefile-rom.common b/test/common/makefile-rom.common index 77d5026..0f0bd0a 100644 --- a/test/common/makefile-rom.common +++ b/test/common/makefile-rom.common @@ -2,6 +2,7 @@ TOPDIR=../../../ PROJECT:=$(shell basename ${PWD}) SRCS=${PROJECT}.c ${TOPDIR}/apps/common/crt0.S OPT=-O0 +CFLAGS=-DUVM32_MEMORY_SIZE=16384 all: all_common @# Convert ROM to C file and header @xxd -i ${PROJECT}.bin > ${PROJECT}-header.c diff --git a/test/syscall_args/rom/rom.c b/test/syscall_args/rom/rom.c index d82e5aa..7ef7f85 100644 --- a/test/syscall_args/rom/rom.c +++ b/test/syscall_args/rom/rom.c @@ -42,6 +42,11 @@ void syscall_gh_test(void) { syscall((uint32_t)SYSCALL_H, (uint32_t)buf, 32); } +void syscall_i_test(void) { + char *p = "hello"; // runner will overwrite memory + syscall((uint32_t)SYSCALL_I, (uint32_t)p, 0); +} + void main(void) { switch(syscall(SYSCALL_PICKTEST, 0, 0)) { case SYSCALL_A: @@ -62,6 +67,9 @@ void main(void) { case SYSCALL_G: syscall_gh_test(); break; + case SYSCALL_I: + syscall_i_test(); + break; } } diff --git a/test/syscall_args/shared.h b/test/syscall_args/shared.h index 758fc2c..07fb572 100644 --- a/test/syscall_args/shared.h +++ b/test/syscall_args/shared.h @@ -13,4 +13,5 @@ #define SYSCALL_F SYSCALL_BASE+6 #define SYSCALL_G SYSCALL_BASE+7 #define SYSCALL_H SYSCALL_BASE+8 +#define SYSCALL_I SYSCALL_BASE+9 diff --git a/test/syscall_args/test/tests.c b/test/syscall_args/test/tests.c index bcfddda..6c915f5 100644 --- a/test/syscall_args/test/tests.c +++ b/test/syscall_args/test/tests.c @@ -169,3 +169,24 @@ void test_syscall_args_buf_pass(void) { } } +void test_syscall_args_string_never_terminates(void) { + // run the vm + uvm32_run(&vmst, &evt, 1000); + // check for picktest syscall + TEST_ASSERT_EQUAL(evt.typ, UVM32_EVT_SYSCALL); + TEST_ASSERT_EQUAL(evt.data.syscall.code, SYSCALL_PICKTEST); + uvm32_arg_setval(&vmst, &evt, RET, SYSCALL_I); + + uvm32_run(&vmst, &evt, 1000); + TEST_ASSERT_EQUAL(evt.typ, UVM32_EVT_SYSCALL); + TEST_ASSERT_EQUAL(evt.data.syscall.code, SYSCALL_I); + // To ensure c string read goes off end looking for termination... + memset(vmst._memory, 0xFF, UVM32_MEMORY_SIZE); + TEST_ASSERT_EQUAL(0, strlen(uvm32_arg_getcstr(&vmst, &evt, ARG0))); + + // check for error state + uvm32_run(&vmst, &evt, 100); + TEST_ASSERT_EQUAL(evt.typ, UVM32_EVT_ERR); + TEST_ASSERT_EQUAL(evt.data.err.errcode, UVM32_ERR_MEM_RD); +} +