From 345194de8cb3ceaa40d19353d30ba6e23b6e6edb Mon Sep 17 00:00:00 2001 From: Barney Gale Date: Wed, 3 Apr 2024 16:39:40 +0100 Subject: GH-114847: Raise FileNotFoundError when getcwd() returns '(unreachable)' (#117481) On Linux >= 2.6.36 with glibc < 2.27, `getcwd()` can return a relative pathname starting with '(unreachable)'. We detect this and fail with ENOENT, matching new glibc behaviour. Co-authored-by: Petr Viktorin --- .../Library/2024-04-02-20-30-12.gh-issue-114848.YX4pEc.rst | 2 ++ Modules/posixmodule.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2024-04-02-20-30-12.gh-issue-114848.YX4pEc.rst diff --git a/Misc/NEWS.d/next/Library/2024-04-02-20-30-12.gh-issue-114848.YX4pEc.rst b/Misc/NEWS.d/next/Library/2024-04-02-20-30-12.gh-issue-114848.YX4pEc.rst new file mode 100644 index 0000000..30b1a50 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-04-02-20-30-12.gh-issue-114848.YX4pEc.rst @@ -0,0 +1,2 @@ +Raise :exc:`FileNotFoundError` when ``getcwd()`` returns '(unreachable)', +which can happen on Linux >= 2.6.36 with glibc < 2.27. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index a4b635e..fcac3db 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -4106,6 +4106,20 @@ posix_getcwd(int use_bytes) else { obj = PyUnicode_DecodeFSDefault(buf); } +#ifdef __linux__ + if (buf[0] != '/') { + /* + * On Linux >= 2.6.36 with glibc < 2.27, getcwd() can return a + * relative pathname starting with '(unreachable)'. We detect this + * and fail with ENOENT, matching newer glibc behaviour. + */ + errno = ENOENT; + path_object_error(obj); + PyMem_RawFree(buf); + return NULL; + } +#endif + assert(buf[0] == '/'); PyMem_RawFree(buf); return obj; -- cgit v0.12