From acd10c6993fbb39e8c0bf745c29b872ac7b93226 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Sun, 19 Jan 2025 10:00:11 +0800 Subject: [PATCH] nshlib: Replace the big temp buffer with lib_get_[path|temp]buffer to save the stack consumption Signed-off-by: Xiang Xiao --- nshlib/nsh_fsutils.c | 14 +++++++++++--- nshlib/nsh_timcmds.c | 9 ++++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/nshlib/nsh_fsutils.c b/nshlib/nsh_fsutils.c index 99e9487848d..c3793b20619 100644 --- a/nshlib/nsh_fsutils.c +++ b/nshlib/nsh_fsutils.c @@ -73,7 +73,7 @@ static int getpid_callback(FAR struct nsh_vtbl_s *vtbl, FAR struct dirent *entryp, FAR void *pvarg) { FAR struct getpid_arg_s *arg = (FAR struct getpid_arg_s *)pvarg; - char buffer[PATH_MAX]; + FAR char *buffer; int fd; int len; @@ -82,13 +82,19 @@ static int getpid_callback(FAR struct nsh_vtbl_s *vtbl, return -E2BIG; } - /* Match the name of the process */ + buffer = lib_get_pathbuffer(); + if (buffer == NULL) + { + return -errno; + } - snprintf(buffer, sizeof(buffer), "%s/%s/cmdline", dirpath, entryp->d_name); + /* Match the name of the process */ + snprintf(buffer, PATH_MAX, "%s/%s/cmdline", dirpath, entryp->d_name); fd = open(buffer, O_RDONLY | O_CLOEXEC); if (fd < 0) { + lib_put_pathbuffer(buffer); return 0; } @@ -96,6 +102,7 @@ static int getpid_callback(FAR struct nsh_vtbl_s *vtbl, close(fd); if (len < 0) { + lib_put_pathbuffer(buffer); return -errno; } @@ -107,6 +114,7 @@ static int getpid_callback(FAR struct nsh_vtbl_s *vtbl, arg->pids[arg->next++] = atoi(entryp->d_name); } + lib_put_pathbuffer(buffer); return OK; } #endif diff --git a/nshlib/nsh_timcmds.c b/nshlib/nsh_timcmds.c index 732bb512e9a..a0952acc1b0 100644 --- a/nshlib/nsh_timcmds.c +++ b/nshlib/nsh_timcmds.c @@ -26,6 +26,7 @@ #include +#include #include #include #include @@ -552,7 +553,6 @@ int cmd_timedatectl(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) #ifndef CONFIG_NSH_DISABLE_WATCH int cmd_watch(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) { - char buffer[LINE_MAX]; int interval = 2; int count = -1; FAR char *cmd; @@ -595,8 +595,15 @@ int cmd_watch(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) for (i = 0; i < count; i++) { + FAR char *buffer = lib_get_tempbuffer(LINE_MAX); + if (buffer == NULL) + { + return ERROR; + } + strlcpy(buffer, cmd, LINE_MAX); ret = nsh_parse(vtbl, buffer); + lib_put_tempbuffer(buffer); if (ret < 0) { nsh_error(vtbl, g_fmtcmdfailed, argv[0], cmd, NSH_ERRNO);