public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: libc-alpha@sourceware.org
Subject: [PATCH] Remove eloop-threshold.h
Date: Tue,  4 Mar 2025 15:13:41 -0300	[thread overview]
Message-ID: <20250304181347.1407531-1-adhemerval.zanella@linaro.org> (raw)

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 --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>
-- 
2.43.0


             reply	other threads:[~2025-03-04 18:13 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-04 18:13 Adhemerval Zanella [this message]
2025-03-19  2:36 ` DJ Delorie
2025-03-19  8:38   ` Andreas Schwab
2025-03-19 17:07     ` DJ Delorie
2025-03-19 17:21   ` Adhemerval Zanella Netto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250304181347.1407531-1-adhemerval.zanella@linaro.org \
    --to=adhemerval.zanella@linaro.org \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).