diff -r 2a18f6b85da2 Modules/posixmodule.c --- a/Modules/posixmodule.c Sun Apr 12 18:47:56 2015 -0400 +++ b/Modules/posixmodule.c Tue Apr 14 11:52:51 2015 -0700 @@ -3257,12 +3257,15 @@ static PyObject * posix_getcwd(int use_bytes) { - char buf[1026]; + char *buf; char *res; + const size_t chunk = 1024; + size_t buflen = 0; + PyObject *ret; #ifdef MS_WINDOWS if (!use_bytes) { - wchar_t wbuf[1026]; + wchar_t wbuf[MAXPATHLEN]; wchar_t *wbuf2 = wbuf; PyObject *resobj; DWORD len; @@ -3297,13 +3300,36 @@ #endif Py_BEGIN_ALLOW_THREADS - res = getcwd(buf, sizeof buf); + buf = res = NULL; + do { + buflen += chunk; + + if (buflen > MAXPATHLEN) { + errno = ENAMETOOLONG; + res = NULL; + break; + } + + if ((buf = realloc(buf, buflen)) == NULL) { + res = NULL; + break; + } + + res = getcwd(buf, buflen); + } while (res == NULL && errno == ERANGE); Py_END_ALLOW_THREADS - if (res == NULL) - return posix_error(); - if (use_bytes) - return PyBytes_FromStringAndSize(buf, strlen(buf)); - return PyUnicode_DecodeFSDefault(buf); + + if (res && use_bytes) { + ret = PyBytes_FromStringAndSize(buf, strlen(buf)); + } else if (res) { + ret = PyUnicode_DecodeFSDefault(buf); + } else { + ret = posix_error(); + } + + free(buf); + buf = NULL; + return ret; }