summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Library/2024-04-02-20-30-12.gh-issue-114848.YX4pEc.rst2
-rw-r--r--Modules/posixmodule.c14
2 files changed, 16 insertions, 0 deletions
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;