@@ -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;
@@ -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;
@@ -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;
@@ -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);
deleted file mode 100644
@@ -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 */
new file mode 100644
@@ -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
@@ -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
@@ -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>