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 <anchao@xiaomi.com>
This commit is contained in:
chao an 2023-11-06 16:19:40 +08:00 committed by Xiang Xiao
parent 4d65d9908b
commit d410a6e1a6
1 changed files with 33 additions and 3 deletions

View File

@ -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;
}