mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-07 06:43:00 +03:00
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:
@@ -23,8 +23,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <min-eloop-threshold.h>
|
||||||
#include <eloop-threshold.h>
|
|
||||||
#include <ldconfig.h>
|
#include <ldconfig.h>
|
||||||
|
|
||||||
#ifndef PATH_MAX
|
#ifndef PATH_MAX
|
||||||
@@ -126,7 +125,7 @@ chroot_canon (const char *chroot, const char *name)
|
|||||||
char *buf = alloca (PATH_MAX);
|
char *buf = alloca (PATH_MAX);
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
if (++num_links > __eloop_threshold ())
|
if (++num_links > MIN_ELOOP_THRESHOLD)
|
||||||
{
|
{
|
||||||
__set_errno (ELOOP);
|
__set_errno (ELOOP);
|
||||||
goto error;
|
goto error;
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <_itoa.h>
|
#include <_itoa.h>
|
||||||
#include <eloop-threshold.h>
|
#include <min-eloop-threshold.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
/* Translate the error from dir_lookup into the error the user sees. */
|
/* 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. */
|
/* Fall through. */
|
||||||
|
|
||||||
case FS_RETRY_NORMAL:
|
case FS_RETRY_NORMAL:
|
||||||
if (nloops++ >= __eloop_threshold ())
|
if (nloops++ >= MIN_ELOOP_THRESHOLD)
|
||||||
{
|
{
|
||||||
__mach_port_deallocate (__mach_task_self (), *result);
|
__mach_port_deallocate (__mach_task_self (), *result);
|
||||||
err = ELOOP;
|
err = ELOOP;
|
||||||
@@ -207,7 +207,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
|
|||||||
dirport = INIT_PORT_CRDIR;
|
dirport = INIT_PORT_CRDIR;
|
||||||
if (*result != MACH_PORT_NULL)
|
if (*result != MACH_PORT_NULL)
|
||||||
__mach_port_deallocate (__mach_task_self (), *result);
|
__mach_port_deallocate (__mach_task_self (), *result);
|
||||||
if (nloops++ >= __eloop_threshold ())
|
if (nloops++ >= MIN_ELOOP_THRESHOLD)
|
||||||
{
|
{
|
||||||
err = ELOOP;
|
err = ELOOP;
|
||||||
goto out;
|
goto out;
|
||||||
|
@@ -36,17 +36,19 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <eloop-threshold.h>
|
|
||||||
#include <filename.h>
|
#include <filename.h>
|
||||||
#include <idx.h>
|
#include <idx.h>
|
||||||
#include <intprops.h>
|
#include <intprops.h>
|
||||||
#include <scratch_buffer.h>
|
#include <scratch_buffer.h>
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
|
# include <min-eloop-threshold.h>
|
||||||
# include <shlib-compat.h>
|
# include <shlib-compat.h>
|
||||||
# define GCC_LINT 1
|
# define GCC_LINT 1
|
||||||
# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
|
# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
|
||||||
#else
|
#else
|
||||||
|
# include <eloop-threshold.h>
|
||||||
|
# define MIN_ELOOP_THRESHOLD __eloop_threshold ()
|
||||||
# define __canonicalize_file_name canonicalize_file_name
|
# define __canonicalize_file_name canonicalize_file_name
|
||||||
# define __realpath realpath
|
# define __realpath realpath
|
||||||
# define __strdup strdup
|
# define __strdup strdup
|
||||||
@@ -310,7 +312,7 @@ realpath_stk (const char *name, char *resolved, struct realpath_bufs *bufs)
|
|||||||
}
|
}
|
||||||
if (0 <= n)
|
if (0 <= n)
|
||||||
{
|
{
|
||||||
if (++num_links > __eloop_threshold ())
|
if (++num_links > MIN_ELOOP_THRESHOLD)
|
||||||
{
|
{
|
||||||
__set_errno (ELOOP);
|
__set_errno (ELOOP);
|
||||||
goto error;
|
goto error;
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#define __sysconf sysconf
|
#define __sysconf sysconf
|
||||||
#include <eloop-threshold.h>
|
#include <min-eloop-threshold.h>
|
||||||
#include <support/check.h>
|
#include <support/check.h>
|
||||||
#include <support/support.h>
|
#include <support/support.h>
|
||||||
#include <support/temp_file.h>
|
#include <support/temp_file.h>
|
||||||
@@ -54,7 +54,7 @@ create_link (void)
|
|||||||
/* Create MAXLINKS symbolic links to the temporary filename.
|
/* Create MAXLINKS symbolic links to the temporary filename.
|
||||||
On exit, linkname has the last link created. */
|
On exit, linkname has the last link created. */
|
||||||
char *prevlink = filename;
|
char *prevlink = filename;
|
||||||
int maxlinks = __eloop_threshold ();
|
int maxlinks = MIN_ELOOP_THRESHOLD;
|
||||||
for (int i = 0; i < maxlinks; i++)
|
for (int i = 0; i < maxlinks; i++)
|
||||||
{
|
{
|
||||||
linkname = xasprintf ("%s%d", filename, 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 */
|
|
42
sysdeps/generic/min-eloop-threshold.h
Normal file
42
sysdeps/generic/min-eloop-threshold.h
Normal file
@@ -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.
|
Copyright (C) 2012-2025 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@@ -16,8 +16,8 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<https://www.gnu.org/licenses/>. */
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#ifndef _ELOOP_THRESHOLD_H
|
#ifndef _MIN_ELOOP_THRESHOLD_H
|
||||||
#define _ELOOP_THRESHOLD_H 1
|
#define _MIN_ELOOP_THRESHOLD_H 1
|
||||||
|
|
||||||
/* Return the maximum number of symlink traversals to permit
|
/* Return the maximum number of symlink traversals to permit
|
||||||
before diagnosing ELOOP.
|
before diagnosing ELOOP.
|
||||||
@@ -28,10 +28,6 @@
|
|||||||
but instead use sysconf and the number can be changed here to
|
but instead use sysconf and the number can be changed here to
|
||||||
affect sysconf's result. */
|
affect sysconf's result. */
|
||||||
|
|
||||||
static inline unsigned int __attribute__ ((const))
|
#define MIN_ELOOP_THRESHOLD 32
|
||||||
__eloop_threshold (void)
|
|
||||||
{
|
|
||||||
return 32;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* eloop-threshold.h */
|
#endif
|
@@ -19,8 +19,8 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <unistd.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>
|
#include <sysdeps/posix/sysconf.c>
|
||||||
|
Reference in New Issue
Block a user