This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new d410a6e1a6 libc/realpath: allocate link buffer of pseudofs to save
stack
d410a6e1a6 is described below
commit d410a6e1a640dd3d810cbc404ab9f31dbe5f677e
Author: chao an <[email protected]>
AuthorDate: Mon Nov 6 16:19:40 2023 +0800
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 <[email protected]>
---
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 86ec60ca2b..6603f19466 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 @@ loop:
}
*p = '\0';
+
+#ifdef CONFIG_PSEUDOFS_SOFTLINKS
+ if (wbuf[0] != NULL)
+ {
+ lib_free(wbuf[0]);
+ }
+#endif
+
return resolved;
}
@@ -186,7 +197,19 @@ loop:
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 @@ loop:
/* 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 @@ loop:
out:
lib_free(fres);
+#ifdef CONFIG_PSEUDOFS_SOFTLINKS
+ if (wbuf[0] != NULL)
+ {
+ lib_free(wbuf[0]);
+ }
+#endif
+
return NULL;
}