avoid excessive stack usage in getcwd
authorRich Felker <dalias@aerifal.cx>
Tue, 1 May 2018 18:46:59 +0000 (14:46 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 1 May 2018 18:46:59 +0000 (14:46 -0400)
to support the GNU extension of allocating a buffer for getcwd's
result when a null pointer is passed without incurring a link
dependency on free, we use a PATH_MAX-sized buffer on the stack and
only duplicate it to allocated storage after the operation succeeds.
unfortunately this imposed excessive stack usage on all callers,
including those not making use of the GNU extension.

instead, use a VLA to make stack allocation conditional.

src/unistd/getcwd.c

index 103fbbb5f78f1fc3578d1ed3839f6667f3ddef87..f407ffe07ed6008fa4af1ce020b60df0a26a7534 100644 (file)
@@ -6,10 +6,10 @@
 
 char *getcwd(char *buf, size_t size)
 {
-       char tmp[PATH_MAX];
+       char tmp[buf ? 1 : PATH_MAX];
        if (!buf) {
                buf = tmp;
-               size = PATH_MAX;
+               size = sizeof tmp;
        } else if (!size) {
                errno = EINVAL;
                return 0;