_Py_wgetcwd() decodes the path using _Py_char2wchar() to support surrogates
diff --git a/Modules/getpath.c b/Modules/getpath.c
index 9e5934d..2275c84 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -231,12 +231,12 @@
 /* copy_absolute requires that path be allocated at least
    MAXPATHLEN + 1 bytes and that p be no more than MAXPATHLEN bytes. */
 static void
-copy_absolute(wchar_t *path, wchar_t *p)
+copy_absolute(wchar_t *path, wchar_t *p, size_t pathlen)
 {
     if (p[0] == SEP)
         wcscpy(path, p);
     else {
-        if (!_Py_wgetcwd(path, MAXPATHLEN)) {
+        if (!_Py_wgetcwd(path, pathlen)) {
             /* unable to get the current directory */
             wcscpy(path, p);
             return;
@@ -251,11 +251,11 @@
 static void
 absolutize(wchar_t *path)
 {
-    wchar_t buffer[MAXPATHLEN + 1];
+    wchar_t buffer[MAXPATHLEN+1];
 
     if (path[0] == SEP)
         return;
-    copy_absolute(buffer, path);
+    copy_absolute(buffer, path, MAXPATHLEN+1);
     wcscpy(path, buffer);
 }
 
@@ -295,7 +295,7 @@
     }
 
     /* Search from argv0_path, until root is found */
-    copy_absolute(prefix, argv0_path);
+    copy_absolute(prefix, argv0_path, MAXPATHLEN+1);
     do {
         n = wcslen(prefix);
         joinpath(prefix, lib_python);
@@ -372,7 +372,7 @@
     }
 
     /* Search from argv0_path, until root is found */
-    copy_absolute(exec_prefix, argv0_path);
+    copy_absolute(exec_prefix, argv0_path, MAXPATHLEN+1);
     do {
         n = wcslen(exec_prefix);
         joinpath(exec_prefix, lib_python);
diff --git a/Python/fileutils.c b/Python/fileutils.c
index 9423cb0..564e2c0 100644
--- a/Python/fileutils.c
+++ b/Python/fileutils.c
@@ -364,7 +364,8 @@
 }
 #endif
 
-/* Get the current directory. Decode the path from the locale encoding. */
+/* Get the current directory. size is the buffer size in wide characters
+   including the null character. Decode the path from the locale encoding. */
 
 wchar_t*
 _Py_wgetcwd(wchar_t *buf, size_t size)
@@ -373,12 +374,19 @@
     return _wgetcwd(buf, size);
 #else
     char fname[PATH_MAX];
+    wchar_t *wname;
+
     if (getcwd(fname, PATH_MAX) == NULL)
         return NULL;
-    if (mbstowcs(buf, fname, size) >= size) {
-        errno = ERANGE;
+    wname = _Py_char2wchar(fname);
+    if (wname == NULL)
+        return NULL;
+    if (size <= wcslen(wname)) {
+        PyMem_Free(wname);
         return NULL;
     }
+    wcsncpy(buf, wname, size);
+    PyMem_Free(wname);
     return buf;
 #endif
 }