]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: ensure that Getwd returns absolute path
authorKir Kolyshkin <kolyshkin@gmail.com>
Mon, 21 Feb 2022 22:54:05 +0000 (14:54 -0800)
committerTobias Klauser <tobias.klauser@gmail.com>
Wed, 16 Mar 2022 16:07:26 +0000 (16:07 +0000)
Since Linux kernel 2.6.36, the pathname returned by the getcwd() system
call can be prefixed with the string "(unreachable)" in some cases [1].

Getcwd should return an absolute path, and doing otherwise is a
conformance issue; it also can be dangerous, since the path returned
can be an existing relative path.

Fix by returning ENOENT in case the path is not absolute. This is
essentially the same as what glibc does (since [2]).

[1] https://man7.org/linux/man-pages/man2/getcwd.2.html#BUGS
[2] https://sourceware.org/git/?p=glibc.git;a=commit;h=52a713fdd0a30e1bd79818e2e3c4ab44ddca1a94

Change-Id: I444c80eb3c836ff7d32c64c8b65d5112fa8c710f
Reviewed-on: https://go-review.googlesource.com/c/go/+/387174
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
Trust: Tobias Klauser <tobias.klauser@gmail.com>
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/syscall/syscall_linux.go

index e3891b08558e86c90a49b84479d9b6c6ea5d454e..f74a79c28519156fb9ac86076d9366fea2fd8d07 100644 (file)
@@ -253,6 +253,13 @@ func Getwd() (wd string, err error) {
        if n < 1 || n > len(buf) || buf[n-1] != 0 {
                return "", EINVAL
        }
+       // In some cases, Linux can return a path that starts with the
+       // "(unreachable)" prefix, which can potentially be a valid relative
+       // path. To work around that, return ENOENT if path is not absolute.
+       if buf[0] != '/' {
+               return "", ENOENT
+       }
+
        return string(buf[0 : n-1]), nil
 }