From d410a6e1a640dd3d810cbc404ab9f31dbe5f677e Mon Sep 17 00:00:00 2001 From: chao an Date: Mon, 6 Nov 2023 16:19:40 +0800 Subject: [PATCH] libc/realpath: allocate link buffer of pseudofs to save stack The link buffer of pseudofs will occupy too much of stack, allocate from the heap to save the stack usage. Signed-off-by: chao an --- libs/libc/stdlib/lib_realpath.c | 36 ++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/libs/libc/stdlib/lib_realpath.c b/libs/libc/stdlib/lib_realpath.c index 86ec60ca2b196..6603f19466f8c 100644 --- a/libs/libc/stdlib/lib_realpath.c +++ b/libs/libc/stdlib/lib_realpath.c @@ -39,7 +39,10 @@ FAR char *realpath(FAR const char *path, FAR char *resolved) { #ifdef CONFIG_PSEUDOFS_SOFTLINKS - char wbuf[2][PATH_MAX]; + FAR char *wbuf[2] = + { + }; + int nlnk = 0; int idx = 0; ssize_t n; @@ -117,6 +120,14 @@ FAR char *realpath(FAR const char *path, FAR char *resolved) } *p = '\0'; + +#ifdef CONFIG_PSEUDOFS_SOFTLINKS + if (wbuf[0] != NULL) + { + lib_free(wbuf[0]); + } +#endif + return resolved; } @@ -186,7 +197,19 @@ FAR char *realpath(FAR const char *path, FAR char *resolved) goto out; } - n = readlink(resolved, wbuf[idx], sizeof(wbuf[0]) - 1); + if (wbuf[0] == NULL) + { + wbuf[0] = lib_calloc(2, PATH_MAX); + if (wbuf[0] == NULL) + { + set_errno(ENOMEM); + goto out; + } + + wbuf[1] = wbuf[0] + PATH_MAX; + } + + n = readlink(resolved, wbuf[idx], PATH_MAX - 1); if (n <= 0) { if (n == 0) @@ -199,7 +222,7 @@ FAR char *realpath(FAR const char *path, FAR char *resolved) /* Append unresolved path to link target and switch to it. */ - if (n + (len = strlen(q)) + 1 > sizeof(wbuf[0])) + if (n + (len = strlen(q)) + 1 > PATH_MAX) { set_errno(ENAMETOOLONG); goto out; @@ -234,5 +257,12 @@ FAR char *realpath(FAR const char *path, FAR char *resolved) out: lib_free(fres); +#ifdef CONFIG_PSEUDOFS_SOFTLINKS + if (wbuf[0] != NULL) + { + lib_free(wbuf[0]); + } +#endif + return NULL; }