From: Victor Stinner <victor.stinner@gmail.com> Date: Fri, 24 Apr 2015 22:16:10 +0000 (+0200) Subject: Issue #9246: On POSIX, os.getcwd() now supports paths longer than 1025 bytes X-Git-Tag: v3.5.0b1~294^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4403d7def0ec8e6b395223fb2ab8b570ecc7a6e4;p=python Issue #9246: On POSIX, os.getcwd() now supports paths longer than 1025 bytes Patch written by William Orr. --- diff --git a/Misc/NEWS b/Misc/NEWS index 85e55d06a0..2616bf7d93 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -34,6 +34,9 @@ Core and Builtins Library ------- +- Issue #9246: On POSIX, os.getcwd() now supports paths longer than 1025 bytes. + Patch written by William Orr. + - Issue #23008: Fixed resolving attributes with boolean value is False in pydoc. - Fix asyncio issue 235: LifoQueue and PriorityQueue's put didn't diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index e538437941..04f0d3639c 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3418,12 +3418,15 @@ posix_lchown(PyObject *self, PyObject *args) static PyObject * posix_getcwd(int use_bytes) { - char buf[1026]; - char *res; + char *buf, *tmpbuf; + char *cwd; + const size_t chunk = 1024; + size_t buflen = 0; + PyObject *obj; #ifdef MS_WINDOWS if (!use_bytes) { - wchar_t wbuf[1026]; + wchar_t wbuf[MAXPATHLEN]; wchar_t *wbuf2 = wbuf; PyObject *resobj; DWORD len; @@ -3457,14 +3460,31 @@ posix_getcwd(int use_bytes) return NULL; #endif + buf = cwd = NULL; Py_BEGIN_ALLOW_THREADS - res = getcwd(buf, sizeof buf); + do { + buflen += chunk; + tmpbuf = PyMem_RawRealloc(buf, buflen); + if (tmpbuf == NULL) + break; + + buf = tmpbuf; + cwd = getcwd(buf, buflen); + } while (cwd == NULL && errno == ERANGE); Py_END_ALLOW_THREADS - if (res == NULL) + + if (cwd == NULL) { + PyMem_RawFree(buf); return posix_error(); + } + if (use_bytes) - return PyBytes_FromStringAndSize(buf, strlen(buf)); - return PyUnicode_DecodeFSDefault(buf); + obj = PyBytes_FromStringAndSize(buf, strlen(buf)); + else + obj = PyUnicode_DecodeFSDefault(buf); + PyMem_RawFree(buf); + + return obj; } PyDoc_STRVAR(posix_getcwd__doc__,