+ resolved[0] = '/';
+ resolved[1] = '\0';
+- if (path[1] == '\0')
++ if (path[1] == '\0') {
+ return (resolved);
++ }
+ resolved_len = 1;
+ left_len = strlcpy(left, path + 1, sizeof(left));
+ } else {
+- if (getcwd(resolved, PATH_MAX) == NULL) {
++#if !defined(VARIANT_DARWINEXTSN) && __DARWIN_UNIX03
++ /* 4447159: don't use GETPATH, so this will fail if */
++ /* if parent directories are not readable, as per POSIX */
++ if (__private_getcwd(resolved, PATH_MAX, 0) == NULL)
++#else /* VARIANT_DARWINEXTSN || !__DARWIN_UNIX03 */
++ if (__private_getcwd(resolved, PATH_MAX, 1) == NULL)
++#endif /* !VARIANT_DARWINEXTSN && __DARWIN_UNIX03 */
++ {
+ strlcpy(resolved, ".", PATH_MAX);
+ return (NULL);
+ }
+@@ -80,6 +149,13 @@ realpath(const char *path, char resolved