From 9b2366d13ed542e37e6ab1b468c39a52fff4d957 Mon Sep 17 00:00:00 2001 From: openeuler-basic Date: Wed, 5 Feb 2020 13:34:55 +0800 Subject: [PATCH] Fix test failures ran as root and enable -xautofs and disable leaf opt --- 0001-findutils-leaf-opt.patch | 75 ++++++++++++ 0001-findutils-xautofs.patch | 132 +++++++++++++++++++++ 0001-tests-avoid-FP-when-run-as-root.patch | 129 ++++++++++++++++++++ findutils.spec | 17 ++- 4 files changed, 351 insertions(+), 2 deletions(-) create mode 100644 0001-findutils-leaf-opt.patch create mode 100644 0001-findutils-xautofs.patch create mode 100644 0001-tests-avoid-FP-when-run-as-root.patch diff --git a/0001-findutils-leaf-opt.patch b/0001-findutils-leaf-opt.patch new file mode 100644 index 0000000..d674dd6 --- /dev/null +++ b/0001-findutils-leaf-opt.patch @@ -0,0 +1,75 @@ +From 79962cf9eecbf5e67e195f48aa5ab890fbed9250 Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Thu, 13 Feb 2020 09:59:09 +0800 +Subject: [PATCH] findutils leaf opt + +This reverts commit dce8759f0f0236a860a3e68b63c5e99cc6f168f9. +--- + find/ftsfind.c | 3 +++ + gl/lib/fts.c | 4 ++++ + gl/lib/fts_.h | 16 ++++++++++++---- + 3 files changed, 19 insertions(+), 4 deletions(-) + +diff --git a/find/ftsfind.c b/find/ftsfind.c +index 69a3d8d..d207f90 100644 +--- a/find/ftsfind.c ++++ b/find/ftsfind.c +@@ -553,6 +553,9 @@ find (char *arg) + if (options.stay_on_filesystem) + ftsoptions |= FTS_XDEV; + ++ if (options.no_leaf_check) ++ ftsoptions |= FTS_NOLEAF; ++ + p = fts_open (arglist, ftsoptions, NULL); + if (NULL == p) + { +diff --git a/gl/lib/fts.c b/gl/lib/fts.c +index 8b7a4de..1093ce5 100644 +--- a/gl/lib/fts.c ++++ b/gl/lib/fts.c +@@ -713,6 +713,10 @@ filesystem_type (FTSENT const *p, int fd) + struct dev_type *ent; + struct statfs fs_buf; + ++ if (ISSET(FTS_NOLEAF)) ++ /* leaf optimization explicitly disabled by the FTS_NOLEAF flag */ ++ return 0; ++ + /* If we're not in CWDFD mode, don't bother with this optimization, + since the caller is not serious about performance. */ + if (!ISSET (FTS_CWDFD)) +diff --git a/gl/lib/fts_.h b/gl/lib/fts_.h +index fb5558f..d40a116 100644 +--- a/gl/lib/fts_.h ++++ b/gl/lib/fts_.h +@@ -149,14 +149,22 @@ typedef struct { + dirent.d_type data. */ + # define FTS_DEFER_STAT 0x0400 + ++/* 0x0800 unused, was non-working FTS_NOATIME */ ++ + /* Use this flag to disable stripping of trailing slashes + from input path names during fts_open initialization. */ +-# define FTS_VERBATIM 0x0800 ++# define FTS_VERBATIM 0x1000 ++ ++ /* Disable leaf optimization (which eliminates stat() calls during traversal, ++ based on the count of nested directories stored in stat.st_nlink of each ++ directory). Note that the optimization is by default enabled only for ++ selected file systems, and only if the FTS_CWDFD flag is set. */ ++# define FTS_NOLEAF 0x2000 + +-# define FTS_OPTIONMASK 0x0fff /* valid user option mask */ ++# define FTS_OPTIONMASK 0x3fff /* valid user option mask */ + +-# define FTS_NAMEONLY 0x1000 /* (private) child names only */ +-# define FTS_STOP 0x2000 /* (private) unrecoverable error */ ++# define FTS_NAMEONLY 0x4000 /* (private) child names only */ ++# define FTS_STOP 0x8000 /* (private) unrecoverable error */ + int fts_options; /* fts_open options, global flags */ + + /* Map a directory's device number to a boolean. The boolean is +-- +1.8.3.1 + diff --git a/0001-findutils-xautofs.patch b/0001-findutils-xautofs.patch new file mode 100644 index 0000000..6ebe179 --- /dev/null +++ b/0001-findutils-xautofs.patch @@ -0,0 +1,132 @@ +From 96c16e761f5a60b29197181400fa2a8e3603ebf9 Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Thu, 13 Feb 2020 09:49:30 +0800 +Subject: [PATCH] findutils xautofs + +--- + doc/find.texi | 4 ++++ + find/defs.h | 3 +++ + find/find.1 | 3 +++ + find/ftsfind.c | 6 ++++++ + find/parser.c | 9 +++++++++ + find/util.c | 3 ++- + 6 files changed, 27 insertions(+), 1 deletion(-) + +diff --git a/doc/find.texi b/doc/find.texi +index a410b29..42a4257 100644 +--- a/doc/find.texi ++++ b/doc/find.texi +@@ -1475,6 +1475,10 @@ them. + There are two ways to avoid searching certain filesystems. One way is + to tell @code{find} to only search one filesystem: + ++@deffn Option -xautofs ++Don't descend directories on autofs filesystems. ++@end deffn ++ + @deffn Option -xdev + @deffnx Option -mount + Don't descend directories on other filesystems. These options are +diff --git a/find/defs.h b/find/defs.h +index 9b5e506..c0a0bba 100644 +--- a/find/defs.h ++++ b/find/defs.h +@@ -574,6 +574,9 @@ struct options + /* If true, don't cross filesystem boundaries. */ + bool stay_on_filesystem; + ++ /* If true, don't descend directories on autofs filesystems. */ ++ bool bypass_autofs; ++ + /* If true, we ignore the problem where we find that a directory entry + * no longer exists by the time we get around to processing it. + */ +diff --git a/find/find.1 b/find/find.1 +index bcc1b32..7f4a733 100644 +--- a/find/find.1 ++++ b/find/find.1 +@@ -567,6 +567,9 @@ to stat them; this gives a significant increase in search speed. + .IP "\-version, \-\-version" + Print the \fBfind\fR version number and exit. + ++.IP \-xautofs ++Don't descend directories on autofs filesystems. ++ + .IP \-xdev + Don't descend directories on other filesystems. + +diff --git a/find/ftsfind.c b/find/ftsfind.c +index 0d96c4c..69a3d8d 100644 +--- a/find/ftsfind.c ++++ b/find/ftsfind.c +@@ -479,6 +479,12 @@ consider_visiting (FTS *p, FTSENT *ent) + } + } + ++ if (options.bypass_autofs && ++ 0 == strcmp ("autofs", filesystem_type (&statbuf, ent->fts_name))) ++ { ++ fts_set(p, ent, FTS_SKIP); /* descend no further */ ++ } ++ + if ( (ent->fts_info == FTS_D) && !options.do_dir_first ) + { + /* this is the preorder visit, but user said -depth */ +diff --git a/find/parser.c b/find/parser.c +index 5770487..8c66b0a 100644 +--- a/find/parser.c ++++ b/find/parser.c +@@ -138,6 +138,7 @@ static bool parse_used (const struct parser_table*, char *argv[], int * + static bool parse_user (const struct parser_table*, char *argv[], int *arg_ptr); + static bool parse_wholename (const struct parser_table*, char *argv[], int *arg_ptr); + static bool parse_xdev (const struct parser_table*, char *argv[], int *arg_ptr); ++static bool parse_xautofs (const struct parser_table*, char *argv[], int *arg_ptr); + static bool parse_ignore_race (const struct parser_table*, char *argv[], int *arg_ptr); + static bool parse_noignore_race (const struct parser_table*, char *argv[], int *arg_ptr); + static bool parse_warn (const struct parser_table*, char *argv[], int *arg_ptr); +@@ -302,6 +303,7 @@ static struct parser_table const parse_table[] = + PARSE_TEST_NP ("wholename", wholename), /* GNU, replaced -path, but now -path is standardized since POSIX 2008 */ + {ARG_TEST, "writable", parse_accesscheck, pred_writable}, /* GNU, 4.3.0+ */ + PARSE_OPTION ("xdev", xdev), /* POSIX */ ++ PARSE_OPTION ("xautofs", xautofs), + PARSE_TEST ("xtype", xtype), /* GNU */ + #ifdef UNIMPLEMENTED_UNIX + /* It's pretty ugly for find to know about archive formats. +@@ -2604,6 +2606,13 @@ parse_xdev (const struct parser_table* entry, char **argv, int *arg_ptr) + } + + static bool ++parse_xautofs (const struct parser_table* entry, char **argv, int *arg_ptr) ++{ ++ options.bypass_autofs = true; ++ return parse_noop (entry, argv, arg_ptr); ++} ++ ++static bool + parse_ignore_race (const struct parser_table* entry, char **argv, int *arg_ptr) + { + options.ignore_readdir_race = true; +diff --git a/find/util.c b/find/util.c +index aa387a4..a10f169 100644 +--- a/find/util.c ++++ b/find/util.c +@@ -181,7 +181,7 @@ operators (decreasing precedence; -and is implicit where no others are given):\n + positional options (always true): -daystart -follow -regextype\n\n\ + normal options (always true, specified before other expressions):\n\ + -depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf\n\ +- --version -xdev -ignore_readdir_race -noignore_readdir_race\n")); ++ --version -xautofs -xdev -ignore_readdir_race -noignore_readdir_race\n")); + HTL (_("\ + tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N\n\ + -cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME\n\ +@@ -1044,6 +1044,7 @@ set_option_defaults (struct options *p) + + p->full_days = false; + p->stay_on_filesystem = false; ++ p->bypass_autofs = false; + p->ignore_readdir_race = false; + + if (p->posixly_correct) +-- +1.8.3.1 + diff --git a/0001-tests-avoid-FP-when-run-as-root.patch b/0001-tests-avoid-FP-when-run-as-root.patch new file mode 100644 index 0000000..9cd42ba --- /dev/null +++ b/0001-tests-avoid-FP-when-run-as-root.patch @@ -0,0 +1,129 @@ +From 2f9fff9e1f0c0b7a9034d7c46ca197ce693c4736 Mon Sep 17 00:00:00 2001 +From: Bernhard Voelker +Date: Sun, 9 Feb 2020 19:58:07 +0100 +Subject: [PATCH] tests: avoid FP when run as root + +Test 'sv-bug-54171' produced a false-positive error as 'find' would +not fail for an unreadable directory when run as root. +Migrate the test to the newer shell-based tests, and add the +'skip_if_root_' guard to avoid a false-positive. + +* find/testsuite/find.posix/sv-bug-54171.exp: Remove. +* find/testsuite/find.posix/sv-bug-54171.xo: Remove. +* find/testsuite/Makefile.am (EXTRA_DIST_XO, EXTRA_DIST_EXP): Remove the +above deleted test. +* tests/find/depth-unreadable-dir.sh: Add test. +* tests/local.mk (all_tests): Reference it. + +Test FP introduced in commit v4.6.0-178-gdf4610d0. +Fixes https://savannah.gnu.org/bugs/?57762 +and https://bugzilla.redhat.com/1799064 +--- + find/testsuite/Makefile.am | 2 -- + find/testsuite/find.posix/sv-bug-54171.exp | 5 ---- + find/testsuite/find.posix/sv-bug-54171.xo | 1 - + tests/find/depth-unreadable-dir.sh | 39 ++++++++++++++++++++++++++++++ + tests/local.mk | 1 + + 5 files changed, 40 insertions(+), 8 deletions(-) + delete mode 100644 find/testsuite/find.posix/sv-bug-54171.exp + delete mode 100644 find/testsuite/find.posix/sv-bug-54171.xo + create mode 100755 tests/find/depth-unreadable-dir.sh + +diff --git a/find/testsuite/Makefile.am b/find/testsuite/Makefile.am +index d252451..77a2902 100644 +--- a/find/testsuite/Makefile.am ++++ b/find/testsuite/Makefile.am +@@ -119,7 +119,6 @@ find.posix/prune-stat.xo \ + find.posix/sizetype.xo \ + find.posix/sv-bug-15235.xo \ + find.posix/sv-bug-19613.xo \ +-find.posix/sv-bug-54171.xo \ + find.posix/typesize.xo + + +@@ -246,7 +245,6 @@ find.posix/sv-bug-15235.exp \ + find.posix/sv-bug-19605.exp \ + find.posix/sv-bug-19613.exp \ + find.posix/sv-bug-19617.exp \ +-find.posix/sv-bug-54171.exp \ + find.posix/typesize.exp \ + find.posix/user-empty.exp \ + find.posix/user-missing.exp +diff --git a/find/testsuite/find.posix/sv-bug-54171.exp b/find/testsuite/find.posix/sv-bug-54171.exp +deleted file mode 100644 +index 8e5448f..0000000 +--- a/find/testsuite/find.posix/sv-bug-54171.exp ++++ /dev/null +@@ -1,5 +0,0 @@ +-exec rm -rf tmp +-exec mkdir tmp tmp/dir +-exec chmod 0311 tmp/dir +-find_start f {tmp -depth -name dir } +-exec rm -rf tmp +diff --git a/find/testsuite/find.posix/sv-bug-54171.xo b/find/testsuite/find.posix/sv-bug-54171.xo +deleted file mode 100644 +index 2dc4706..0000000 +--- a/find/testsuite/find.posix/sv-bug-54171.xo ++++ /dev/null +@@ -1 +0,0 @@ +-tmp/dir +diff --git a/tests/find/depth-unreadable-dir.sh b/tests/find/depth-unreadable-dir.sh +new file mode 100755 +index 0000000..86e2fd6 +--- /dev/null ++++ b/tests/find/depth-unreadable-dir.sh +@@ -0,0 +1,39 @@ ++#!/bin/sh ++# find -depth: ensure to output an unreadable directory. ++ ++# Copyright (C) 2020 Free Software Foundation, Inc. ++ ++# This program is free software: you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation, either version 3 of the License, or ++# (at your option) any later version. ++ ++# This program 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 General Public License for more details. ++ ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++. "${srcdir=.}/tests/init.sh"; fu_path_prepend_ ++print_ver_ find ++ ++# Find run as root would not fail for an unreadable directory. ++skip_if_root_ ++ ++# Prepare an unreadable directory, and the expected stdout/stderr. ++mkdir tmp tmp/dir \ ++ && chmod 0311 tmp/dir \ ++ && echo 'tmp/dir' > exp \ ++ && echo "find: 'tmp/dir': Permission denied" > experr \ ++ || framework_failure_ ++ ++# Run FTS-based find with -depth; versions < 4.7.0 failed to output ++# an unreadable directory (see #54171). ++returns_ 1 find tmp -depth -name dir > out 2> err || fail=1 ++ ++compare exp out || fail=1 ++compare experr err || fail=1 ++ ++Exit $fail +diff --git a/tests/local.mk b/tests/local.mk +index dccc734..986df55 100644 +--- a/tests/local.mk ++++ b/tests/local.mk +@@ -106,6 +106,7 @@ check-root: + + all_tests = \ + tests/misc/help-version.sh \ ++ tests/find/depth-unreadable-dir.sh \ + tests/find/many-dir-entries-vs-OOM.sh \ + tests/find/name-lbracket-literal.sh \ + tests/find/printf_escapechars.sh \ +-- +1.8.3.1 + diff --git a/findutils.spec b/findutils.spec index 40fd20a..ccc2a0d 100644 --- a/findutils.spec +++ b/findutils.spec @@ -1,12 +1,19 @@ Name: findutils Epoch: 2 Version: 4.7.0 -Release: 3 +Release: 4 Summary: The GNU Find Utilities License: GPLv3+ URL: http://www.gnu.org/software/findutils/ Source0: https://ftp.gnu.org/pub/gnu/findutils/%{name}-%{version}.tar.xz +# resolve test failures when ran as root +# https://savannah.gnu.org/bugs/?57762 +Patch0: 0001-tests-avoid-FP-when-run-as-root.patch +Patch1: 0001-findutils-xautofs.patch +# rhbz #1252549 #1299169 +Patch2: 0001-findutils-leaf-opt.patch + Buildrequires: gcc autoconf gettext-devel texinfo libselinux-devel dejagnu automake gdb Requires(post): info @@ -41,7 +48,7 @@ autoreconf -fiv %make_build %check -#make check +make check %install %make_install @@ -86,6 +93,12 @@ fi %exclude %{_mandir}/man5/locatedb.5* %changelog +* Tue Feb 11 2020 openEuler Buildteam - 2:4.7.0-4 +- Type:enhancement +- ID:NA +- SUG:NA +- DESC:Fix test failures ran as root and enable -xautofs and disable leaf opt + * Wed Jan 22 2020 openEuler Buildteam - 2:4.7.0-3 - Type:enhancement - ID:NA