mirror of git://sourceware.org/git/glibc.git
Remove eloop-threshold.h
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>
This commit is contained in:
parent
855561a1fb
commit
1894e219dc
|
@ -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);
|
||||
|
|
|
@ -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 */
|
|
@ -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
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue