From 513d54450549e10b166f78216c78e7c210059ad5 Mon Sep 17 00:00:00 2001 From: wangjianyu3 Date: Wed, 26 Aug 2026 22:54:07 +0800 Subject: [PATCH 1/2] system/nxinit: increase SERVICE_ARGS_MAX default to 16 The previous default of 8 is insufficient for services with many arguments (e.g. ptpd needs 10 argv slots). When exceeded, argv lacks a NULL terminator, causing posix_spawnp to read out of bounds. Increase default to 16 to prevent argument truncation for typical daemon services. Signed-off-by: wangjianyu3 --- system/nxinit/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/nxinit/Kconfig b/system/nxinit/Kconfig index f3033567774..3cd256bf710 100644 --- a/system/nxinit/Kconfig +++ b/system/nxinit/Kconfig @@ -94,7 +94,7 @@ comment "NXInit Service" config SYSTEM_NXINIT_SERVICE_ARGS_MAX int "Max number of service arguments" - default 8 + default 16 range 3 64 ---help--- Maximum number of service arguments, From 2f4019d378852546fe97a66ddeec6cde03420b16 Mon Sep 17 00:00:00 2001 From: wangjianyu3 Date: Wed, 26 Aug 2026 22:54:16 +0800 Subject: [PATCH 2/2] system/nxinit: add 'set' builtin command for environment variables Previously, 'set KEY VALUE' in init.rc was not recognized as a builtin command. It fell through to posix_spawnp(), which ran it in a temporary child shell. The environment variable was set only in the child process and lost when it exited, so services started afterward never inherited it. Register cmd_set as an init builtin that calls setenv(key, value, 1) directly in the init process. The command takes exactly 2 arguments (key and value). All code is guarded by CONFIG_DISABLE_ENVIRON so it compiles out when environment support is disabled. Since child processes inherit init's environment, 'set TZ Asia/Shanghai' in init.rc now correctly propagates to all subsequently started services. Signed-off-by: wangjianyu3 --- system/nxinit/builtin.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/system/nxinit/builtin.c b/system/nxinit/builtin.c index f0097d90c55..5ed7f3a29fe 100644 --- a/system/nxinit/builtin.c +++ b/system/nxinit/builtin.c @@ -64,6 +64,10 @@ static int cmd_start(FAR struct action_manager_s *am, int argc, FAR char **argv); static int cmd_stop(FAR struct action_manager_s *am, int argc, FAR char **argv); +#ifndef CONFIG_DISABLE_ENVIRON +static int cmd_set(FAR struct action_manager_s *am, + int argc, FAR char **argv); +#endif #if CONFIG_SYSTEM_NXINIT_ACTION_EVENTS_MAX > 1 static int cmd_setprop(FAR struct action_manager_s *am, int argc, FAR char **argv); @@ -107,6 +111,9 @@ static const struct cmd_map_s g_builtin[] = {"class_stop", 2, 2, cmd_class_stop}, {"exec", 3, 99, cmd_exec}, {"exec_start", 2, 2, cmd_exec_start}, +#ifndef CONFIG_DISABLE_ENVIRON + {"set", 3, 3, cmd_set}, +#endif #if CONFIG_SYSTEM_NXINIT_ACTION_EVENTS_MAX > 1 {"setprop", 3, 3, cmd_setprop}, #endif @@ -221,6 +228,16 @@ static int cmd_stop(FAR struct action_manager_s *am, return init_service_stop(service); } +#ifndef CONFIG_DISABLE_ENVIRON +static int cmd_set(FAR struct action_manager_s *am, + int argc, FAR char **argv) +{ + UNUSED(am); + init_info("setenv '%s' '%s'", argv[1], argv[2]); + return setenv(argv[1], argv[2], 1); +} +#endif + #if CONFIG_SYSTEM_NXINIT_ACTION_EVENTS_MAX > 1 static int cmd_setprop(FAR struct action_manager_s *am, int argc, FAR char **argv)