diff mbox series

Remove eloop-threshold.h

Message ID 20250304181347.1407531-1-adhemerval.zanella@linaro.org
State New
Headers show
Series Remove eloop-threshold.h | expand

Commit Message

Adhemerval Zanella March 4, 2025, 6:13 p.m. UTC
On both Linux and Hurd the __eloop_threshold() is always a constant
(40 and 32 respectively), so there is no need to always call
__sysconf (_SC_SYMLOOP_MAX) for Linux case (!SYMLOOP_MAX).  To avoid
a name clash with gnulib, rename the new file min-eloop-threshold.h.

Checked on x86_64-linux-gnu and with a build for x86_64-gnu.
---
 elf/chroot_canon.c                            |  5 +-
 hurd/lookup-retry.c                           |  6 +-
 stdlib/canonicalize.c                         |  6 +-
 stdlib/tst-canon-bz26341.c                    |  4 +-
 sysdeps/generic/eloop-threshold.h             | 72 -------------------
 sysdeps/generic/min-eloop-threshold.h         | 42 +++++++++++
 ...loop-threshold.h => min-eloop-threshold.h} | 14 ++--
 sysdeps/mach/hurd/sysconf.c                   |  4 +-
 8 files changed, 60 insertions(+), 93 deletions(-)
 delete mode 100644 sysdeps/generic/eloop-threshold.h
 create mode 100644 sysdeps/generic/min-eloop-threshold.h
 rename sysdeps/mach/hurd/{eloop-threshold.h => min-eloop-threshold.h} (83%)
diff mbox series

Patch

diff --git a/elf/chroot_canon.c b/elf/chroot_canon.c
index 5db13c22bd..34869f1c05 100644
--- a/elf/chroot_canon.c
+++ b/elf/chroot_canon.c
@@ -23,8 +23,7 @@ 
 #include <errno.h>
 #include <stddef.h>
 #include <stdint.h>
-
-#include <eloop-threshold.h>
+#include <min-eloop-threshold.h>
 #include <ldconfig.h>
 
 #ifndef PATH_MAX
@@ -126,7 +125,7 @@  chroot_canon (const char *chroot, const char *name)
 	      char *buf = alloca (PATH_MAX);
 	      size_t len;
 
-	      if (++num_links > __eloop_threshold ())
+	      if (++num_links > MIN_ELOOP_THRESHOLD)
 		{
 		  __set_errno (ELOOP);
 		  goto error;
diff --git a/hurd/lookup-retry.c b/hurd/lookup-retry.c
index 6b94a10eae..ac8925ec1b 100644
--- a/hurd/lookup-retry.c
+++ b/hurd/lookup-retry.c
@@ -24,7 +24,7 @@ 
 #include <fcntl.h>
 #include <string.h>
 #include <_itoa.h>
-#include <eloop-threshold.h>
+#include <min-eloop-threshold.h>
 #include <unistd.h>
 
 /* Translate the error from dir_lookup into the error the user sees.  */
@@ -113,7 +113,7 @@  __hurd_file_name_lookup_retry (error_t (*use_init_port)
 	  /* Fall through.  */
 
 	case FS_RETRY_NORMAL:
-	  if (nloops++ >= __eloop_threshold ())
+	  if (nloops++ >= MIN_ELOOP_THRESHOLD)
 	    {
 	      __mach_port_deallocate (__mach_task_self (), *result);
 	      err = ELOOP;
@@ -207,7 +207,7 @@  __hurd_file_name_lookup_retry (error_t (*use_init_port)
 	      dirport = INIT_PORT_CRDIR;
 	      if (*result != MACH_PORT_NULL)
 		__mach_port_deallocate (__mach_task_self (), *result);
-	      if (nloops++ >= __eloop_threshold ())
+	      if (nloops++ >= MIN_ELOOP_THRESHOLD)
 		{
 		  err = ELOOP;
 		  goto out;
diff --git a/stdlib/canonicalize.c b/stdlib/canonicalize.c
index 528bf49acf..dca6fca5fb 100644
--- a/stdlib/canonicalize.c
+++ b/stdlib/canonicalize.c
@@ -36,17 +36,19 @@ 
 #include <sys/stat.h>
 #include <unistd.h>
 
-#include <eloop-threshold.h>
 #include <filename.h>
 #include <idx.h>
 #include <intprops.h>
 #include <scratch_buffer.h>
 
 #ifdef _LIBC
+# include <min-eloop-threshold.h>
 # include <shlib-compat.h>
 # define GCC_LINT 1
 # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
 #else
+# include <eloop-threshold.h>
+# define MIN_ELOOP_THRESHOLD __eloop_threshold ()
 # define __canonicalize_file_name canonicalize_file_name
 # define __realpath realpath
 # define __strdup strdup
@@ -310,7 +312,7 @@  realpath_stk (const char *name, char *resolved, struct realpath_bufs *bufs)
             }
           if (0 <= n)
             {
-              if (++num_links > __eloop_threshold ())
+              if (++num_links > MIN_ELOOP_THRESHOLD)
                 {
                   __set_errno (ELOOP);
                   goto error;
diff --git a/stdlib/tst-canon-bz26341.c b/stdlib/tst-canon-bz26341.c
index a9b823b21e..b62b2cae44 100644
--- a/stdlib/tst-canon-bz26341.c
+++ b/stdlib/tst-canon-bz26341.c
@@ -23,7 +23,7 @@ 
 #include <unistd.h>
 
 #define __sysconf sysconf
-#include <eloop-threshold.h>
+#include <min-eloop-threshold.h>
 #include <support/check.h>
 #include <support/support.h>
 #include <support/temp_file.h>
@@ -54,7 +54,7 @@  create_link (void)
   /* Create MAXLINKS symbolic links to the temporary filename.
      On exit, linkname has the last link created.  */
   char *prevlink = filename;
-  int maxlinks = __eloop_threshold ();
+  int maxlinks = MIN_ELOOP_THRESHOLD;
   for (int i = 0; i < maxlinks; i++)
     {
       linkname = xasprintf ("%s%d", filename, i);
diff --git a/sysdeps/generic/eloop-threshold.h b/sysdeps/generic/eloop-threshold.h
deleted file mode 100644
index 02363689b0..0000000000
--- a/sysdeps/generic/eloop-threshold.h
+++ /dev/null
@@ -1,72 +0,0 @@ 
-/* Threshold at which to diagnose ELOOP.  Generic version.
-   Copyright (C) 2012-2025 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#ifndef _ELOOP_THRESHOLD_H
-#define _ELOOP_THRESHOLD_H      1
-
-#include <limits.h>
-#include <sys/param.h>
-
-/* POSIX specifies SYMLOOP_MAX as the "Maximum number of symbolic
-   links that can be reliably traversed in the resolution of a
-   pathname in the absence of a loop."  This makes it a minimum that
-   we should certainly accept.  But it leaves open the possibility
-   that more might sometimes work--just not "reliably".
-
-   For example, Linux implements a complex policy whereby there is a
-   small limit on the number of direct symlink traversals (a symlink
-   to a symlink to a symlink), but larger limit on the total number of
-   symlink traversals overall.  Hence the SYMLOOP_MAX number should be
-   the small one, but the limit library functions enforce on users
-   should be the larger one.
-
-   So, we use the larger of the reported SYMLOOP_MAX (if any) and our
-   own constant MIN_ELOOP_THRESHOLD, below.  This constant should be
-   large enough that it never rules out a file name and directory tree
-   that the underlying system (i.e. calls to 'open' et al) would
-   resolve successfully.  It should be small enough that actual loops
-   are detected without a huge number of iterations.  */
-
-#ifndef MIN_ELOOP_THRESHOLD
-# define MIN_ELOOP_THRESHOLD    40
-#endif
-
-/* Return the maximum number of symlink traversals to permit
-   before diagnosing ELOOP.  */
-static inline unsigned int __attribute__ ((const))
-__eloop_threshold (void)
-{
-#ifdef SYMLOOP_MAX
-  const int symloop_max = SYMLOOP_MAX;
-#else
-  /* The function is marked 'const' even though we use memory and
-     call a function, because sysconf is required to return the
-     same value in every call and so it must always be safe to
-     call __eloop_threshold exactly once and reuse the value.  */
-  static long int sysconf_symloop_max;
-  if (sysconf_symloop_max == 0)
-    sysconf_symloop_max = __sysconf (_SC_SYMLOOP_MAX);
-  const unsigned int symloop_max = (sysconf_symloop_max <= 0
-                                    ? _POSIX_SYMLOOP_MAX
-                                    : sysconf_symloop_max);
-#endif
-
-  return MAX (symloop_max, MIN_ELOOP_THRESHOLD);
-}
-
-#endif  /* eloop-threshold.h */
diff --git a/sysdeps/generic/min-eloop-threshold.h b/sysdeps/generic/min-eloop-threshold.h
new file mode 100644
index 0000000000..2ac12edeef
--- /dev/null
+++ b/sysdeps/generic/min-eloop-threshold.h
@@ -0,0 +1,42 @@ 
+/* Minimum threshold at which to diagnose ELOOP.  Generic version.
+   Copyright (C) 2012-2025 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _MIN_ELOOP_THRESHOLD_H
+#define _MIN_ELOOP_THRESHOLD_H      1
+
+/* POSIX specifies SYMLOOP_MAX as the "Maximum number of symbolic
+   links that can be reliably traversed in the resolution of a
+   pathname in the absence of a loop."  This makes it a minimum that
+   we should certainly accept.  But it leaves open the possibility
+   that more might sometimes work--just not "reliably".
+
+   For example, Linux implements a complex policy whereby there is a
+   small limit on the number of direct symlink traversals (a symlink
+   to a symlink to a symlink), but larger limit on the total number of
+   symlink traversals overall.  Hence the SYMLOOP_MAX number should be
+   the small one, but the limit library functions enforce on users
+   should be the larger one.
+
+   This constant should be large enough that it never rules out a file
+   name and directory tree that the underlying system (i.e. calls to 'open'
+   et al) would resolve successfully.  It should be small enough that
+   actual loops are detected without a huge number of iterations.  */
+
+#define MIN_ELOOP_THRESHOLD    40
+
+#endif
diff --git a/sysdeps/mach/hurd/eloop-threshold.h b/sysdeps/mach/hurd/min-eloop-threshold.h
similarity index 83%
rename from sysdeps/mach/hurd/eloop-threshold.h
rename to sysdeps/mach/hurd/min-eloop-threshold.h
index 13842b489d..98ecf49d00 100644
--- a/sysdeps/mach/hurd/eloop-threshold.h
+++ b/sysdeps/mach/hurd/min-eloop-threshold.h
@@ -1,4 +1,4 @@ 
-/* Threshold at which to diagnose ELOOP.  Hurd version.
+/* Minimum threshold at which to diagnose ELOOP.  Hurd version.
    Copyright (C) 2012-2025 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -16,8 +16,8 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#ifndef _ELOOP_THRESHOLD_H
-#define _ELOOP_THRESHOLD_H      1
+#ifndef _MIN_ELOOP_THRESHOLD_H
+#define _MIN_ELOOP_THRESHOLD_H      1
 
 /* Return the maximum number of symlink traversals to permit
    before diagnosing ELOOP.
@@ -28,10 +28,6 @@ 
    but instead use sysconf and the number can be changed here to
    affect sysconf's result.  */
 
-static inline unsigned int __attribute__ ((const))
-__eloop_threshold (void)
-{
-  return 32;
-}
+#define MIN_ELOOP_THRESHOLD 32
 
-#endif  /* eloop-threshold.h */
+#endif
diff --git a/sysdeps/mach/hurd/sysconf.c b/sysdeps/mach/hurd/sysconf.c
index cb4899a67b..bf610901f4 100644
--- a/sysdeps/mach/hurd/sysconf.c
+++ b/sysdeps/mach/hurd/sysconf.c
@@ -19,8 +19,8 @@ 
 #include <limits.h>
 #include <unistd.h>
 
-#include <eloop-threshold.h>
+#include <min-eloop-threshold.h>
 
-#define SYMLOOP_MAX     (__eloop_threshold ())
+#define SYMLOOP_MAX     MIN_ELOOP_THRESHOLD
 
 #include <sysdeps/posix/sysconf.c>