From 00053529121e139c5d4618ccf6a147b0b487aa0f Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Mon, 21 Feb 2022 15:54:48 -0800 Subject: [PATCH] unix: Getwd: ensure returned path is absolute 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: I6c48e7ec9b53be348138e3d974d3f11401c7bea6 Reviewed-on: https://go-review.googlesource.com/c/sys/+/387194 Reviewed-by: Ian Lance Taylor Reviewed-by: Tobias Klauser Trust: Tobias Klauser --- unix/syscall_linux.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go index f5915e23..5f28f8fd 100644 --- a/unix/syscall_linux.go +++ b/unix/syscall_linux.go @@ -250,6 +250,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 }