]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
Return ERANGE from getcwd() if buffer size is 1.
authorDarren Tucker <dtucker@dtucker.net>
Thu, 14 Jul 2022 01:22:08 +0000 (11:22 +1000)
committerDarren Tucker <dtucker@dtucker.net>
Thu, 14 Jul 2022 01:22:08 +0000 (11:22 +1000)
If getcwd() is supplied a buffer size of exactly 1 and a path of "/", it
could result in a nul byte being written out of array bounds.  POSIX says
it should return ERANGE if the path will not fit in the available buffer
(with terminating nul). 1 byte cannot fit any possible path with its nul,
so immediately return ERANGE in that case.

OpenSSH never uses getcwd() with this buffer size, and all current
(and even quite old) platforms that we are currently known to work
on have a native getcwd() so this code is not used on those anyway.
Reported by Qualys, ok djm@

openbsd-compat/getcwd.c

index 2d56bae19dd6a755a866af3fd91bbfde0279d2bb..a904291a29d69d91a96e18629d8e5daa10abfab3 100644 (file)
@@ -70,9 +70,12 @@ getcwd(char *pt, size_t size)
         */
        if (pt) {
                ptsize = 0;
-               if (!size) {
+               if (size == 0) {
                        errno = EINVAL;
                        return (NULL);
+               } else if (size == 1) {
+                       errno = ERANGE;
+                       return (NULL);
                }
                ept = pt + size;
        } else {