]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Remove eloop-threshold.h
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Tue, 4 Mar 2025 18:13:41 +0000 (15:13 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 21 Mar 2025 18:46:48 +0000 (15:46 -0300)
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.
Reviewed-by: DJ Delorie <dj@redhat.com>
elf/chroot_canon.c
hurd/lookup-retry.c
stdlib/canonicalize.c
stdlib/tst-canon-bz26341.c
sysdeps/generic/eloop-threshold.h [deleted file]
sysdeps/generic/min-eloop-threshold.h [new file with mode: 0644]
sysdeps/mach/hurd/min-eloop-threshold.h [moved from sysdeps/mach/hurd/eloop-threshold.h with 83% similarity]
sysdeps/mach/hurd/sysconf.c

index 5db13c22bd8938bc5a6ecc0b364296f4e66ba723..34869f1c05c0534e5dbc58ed78a35e350ff9cb33 100644 (file)
@@ -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;
index 6b94a10eae6b25ef5d796214d1c0e9c953890c1d..ac8925ec1b563613b580cfd9e788180c49e27e23 100644 (file)
@@ -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;
index 528bf49acf3faa09c933ca561c491232257f34b7..dca6fca5fb76cc51767364821c3ecf0ab534d725 100644 (file)
 #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;
index a9b823b21e52d15f816af0c5a1431b6ea8d062e2..b62b2cae4422d85636f59c76ef5faa38d2d601a6 100644 (file)
@@ -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 (file)
index 0236368..0000000
+++ /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 (file)
index 0000000..2ac12ed
--- /dev/null
@@ -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
similarity index 83%
rename from sysdeps/mach/hurd/eloop-threshold.h
rename to sysdeps/mach/hurd/min-eloop-threshold.h
index 13842b489daccf7cbae8b90c7e158470734ac6c2..98ecf49d00f61db02639f057c18d9213b3e8d59e 100644 (file)
@@ -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.
    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
index cb4899a67b23ef3a7d19a74447c4fe07032cc72c..bf610901f4e9ea905c347cd595c471f88241180c 100644 (file)
@@ -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>