summaryrefslogblamecommitdiff
path: root/system/coreutils/revert-gnulib-getcwd-speedup-linux.patch
blob: fa8f6639584d6d51b70525b4bc1769c97aeff41b (plain) (tree)



























































































                                                                                
From d598f8169bbc9178c59d35f0df95637a70d3377f Mon Sep 17 00:00:00 2001
From: Zach van Rijn <me@zv.io>
Date: Mon, 10 Apr 2023 04:09:56 -0500
Subject: [PATCH] Revert "getcwd: Speed up on Linux. Add support for Android."

This reverts commit 356a414e8c15ef3f8cc7b7157427c8ce9a9f7c1b.

diff --git a/lib/getcwd.c b/lib/getcwd.c
index 0530630c43..04b8d2df39 100644
--- a/lib/getcwd.c
+++ b/lib/getcwd.c
@@ -173,9 +173,6 @@ __getcwd_generic (char *buf, size_t size)
 #if HAVE_OPENAT_SUPPORT
   int fd = AT_FDCWD;
   bool fd_needs_closing = false;
-# if defined __linux__
-  bool proc_fs_not_mounted = false;
-# endif
 #else
   char dots[DEEP_NESTING * sizeof ".." + BIG_FILE_NAME_COMPONENT_LENGTH + 1];
   char *dotlist = dots;
@@ -441,67 +438,6 @@ __getcwd_generic (char *buf, size_t size)
 
       thisdev = dotdev;
       thisino = dotino;
-
-#if HAVE_OPENAT_SUPPORT
-      /* On some platforms, a system call returns the directory that FD points
-         to.  This is useful if some of the ancestor directories of the
-         directory are unreadable, because in this situation the loop that
-         climbs up the ancestor hierarchy runs into an EACCES error.
-         For example, in some Android app, /data/data/com.termux is readable,
-         but /data/data and /data are not.  */
-# if defined __linux__
-      /* On Linux, in particular, if /proc is mounted,
-           readlink ("/proc/self/fd/<fd>")
-         returns the directory, if its length is < 4096.  (If the length is
-         >= 4096, it fails with error ENAMETOOLONG, even if the buffer that we
-         pass to the readlink function would be large enough.)  */
-      if (!proc_fs_not_mounted)
-        {
-          char namebuf[14 + 10 + 1];
-          sprintf (namebuf, "/proc/self/fd/%u", (unsigned int) fd);
-          char linkbuf[4096];
-          ssize_t linklen = readlink (namebuf, linkbuf, sizeof linkbuf);
-          if (linklen < 0)
-            {
-              if (errno != ENAMETOOLONG)
-                /* If this call was not successful, the next one will likely be
-                   not successful either.  */
-                proc_fs_not_mounted = true;
-            }
-          else
-            {
-              dirroom = dirp - dir;
-              if (dirroom < linklen)
-                {
-                  if (size != 0)
-                    {
-                      __set_errno (ERANGE);
-                      goto lose;
-                    }
-                  else
-                    {
-                      char *tmp;
-                      size_t oldsize = allocated;
-
-                      allocated += linklen - dirroom;
-                      if (allocated < oldsize
-                          || ! (tmp = realloc (dir, allocated)))
-                        goto memory_exhausted;
-
-                      /* Move current contents up to the end of the buffer.  */
-                      dirp = memmove (tmp + dirroom + (allocated - oldsize),
-                                      tmp + dirroom,
-                                      oldsize - dirroom);
-                      dir = tmp;
-                    }
-                }
-              dirp -= linklen;
-              memcpy (dirp, linkbuf, linklen);
-              break;
-            }
-        }
-# endif
-#endif
     }
 
   if (dirstream && __closedir (dirstream) != 0)
-- 
2.25.1