[packages/findutils] - rel 2; exec fix from fc/upstream

arekm arekm at pld-linux.org
Sun Jun 12 00:05:00 CEST 2016


commit 4d44078a5cd35b94a1affa6ba84e48f9d7181a21
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Sun Jun 12 00:04:51 2016 +0200

    - rel 2; exec fix from fc/upstream

 findutils-4.6.0-exec-args.patch | 226 ++++++++++++++++++++++++++++++++++++++++
 findutils.spec                  |   6 +-
 2 files changed, 229 insertions(+), 3 deletions(-)
---
diff --git a/findutils.spec b/findutils.spec
index b1b84dc..de2c1f0 100644
--- a/findutils.spec
+++ b/findutils.spec
@@ -11,7 +11,7 @@ Summary(pt_BR.UTF-8):	Utilitários de procura da GNU
 Summary(tr.UTF-8):	GNU dosya arama araçları
 Name:		findutils
 Version:	4.6.0
-Release:	1
+Release:	2
 Epoch:		1
 License:	GPL v3+
 Group:		Applications/File
@@ -21,7 +21,7 @@ Source0:	http://ftp.gnu.org/gnu/findutils/%{name}-%{version}.tar.gz
 #Source1:	http://www.mif.pg.gda.pl/homepages/ankry/man-PLD/%{name}-non-english-man-pages.tar.bz2
 Source1:	%{name}-non-english-man-pages.tar.bz2
 # Source1-md5:	e76388b0c3218eec3557d05ccd6d6515
-
+Patch0:		findutils-4.6.0-exec-args.patch
 Patch1:		%{name}-man-selinux.patch
 Patch2:		%{name}-info.patch
 # http://translationproject.org/latest/findutils/pl.po
@@ -85,7 +85,7 @@ arayabilirsiniz.
 
 %prep
 %setup -q
-
+%patch0 -p1
 # patch1 is applied in install stage
 %patch2 -p1
 %patch3 -p1
diff --git a/findutils-4.6.0-exec-args.patch b/findutils-4.6.0-exec-args.patch
new file mode 100644
index 0000000..e86b883
--- /dev/null
+++ b/findutils-4.6.0-exec-args.patch
@@ -0,0 +1,226 @@
+From 443166adaf1c8b91e16a716f3b13f47493b895cc Mon Sep 17 00:00:00 2001
+From: Bernhard Voelker <mail at bernhard-voelker.de>
+Date: Tue, 31 May 2016 10:38:52 +0200
+Subject: [PATCH] Fix bug #48030: find: -exec + does not pass all arguments in
+ certain cases
+
+When the -exec arguments buffer (usually 128k) is full and the given
+command has been executed with all that arguments, find(1) missed to
+execute the command yet another time if only 1 another file would have
+to be processed.
+Both find(1), i.e., nowadays FTS-version, and oldfind are affected.
+This bug was present since the implementation of '-exec +' in 2005,
+see commit FINDUTILS_4_2_11-1-25-gf0a6ac6.
+
+* lib/buildcmd.c (bc_push_arg): Move the assignment to set 'state->todo'
+to 1 down after the immediate execution which resets that flag.
+* find/testsuite/sv-48030-exec-plus-bug.sh: Add a test.
+* find/testsuite/Makefile.am (test_shell_progs): Reference the test.
+* NEWS (Bug Fixes): Mention the fix.
+
+Reported by Joe Philip Ninan <indiajoe at gmail.com> in
+https://savannah.gnu.org/bugs/?48030
+
+Upstream-commit: 8cdc9767e305c9566f537af9d1acf71d1bc6ee8e
+Signed-off-by: Kamil Dudka <kdudka at redhat.com>
+---
+ find/testsuite/Makefile.am               |   3 +-
+ find/testsuite/sv-48030-exec-plus-bug.sh | 143 +++++++++++++++++++++++++++++++
+ lib/buildcmd.c                           |  10 +--
+ 3 files changed, 150 insertions(+), 6 deletions(-)
+ create mode 100644 find/testsuite/sv-48030-exec-plus-bug.sh
+
+diff --git a/find/testsuite/Makefile.am b/find/testsuite/Makefile.am
+index c1369c3..ab5dbe8 100644
+--- a/find/testsuite/Makefile.am
++++ b/find/testsuite/Makefile.am
+@@ -258,7 +258,8 @@ test_escapechars.sh \
+ test_escape_c.sh \
+ test_inode.sh \
+ sv-34079.sh \
+-sv-34976-execdir-fd-leak.sh
++sv-34976-execdir-fd-leak.sh \
++sv-48030-exec-plus-bug.sh
+ 
+ EXTRA_DIST = $(EXTRA_DIST_EXP) $(EXTRA_DIST_XO) $(EXTRA_DIST_GOLDEN) \
+ 	$(test_shell_progs) binary_locations.sh checklists.py
+diff --git a/find/testsuite/sv-48030-exec-plus-bug.sh b/find/testsuite/sv-48030-exec-plus-bug.sh
+new file mode 100644
+index 0000000..4dbf149
+--- /dev/null
++++ b/find/testsuite/sv-48030-exec-plus-bug.sh
+@@ -0,0 +1,143 @@
++#! /bin/sh
++# Copyright (C) 2016 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 <http://www.gnu.org/licenses/>.
++#
++
++# This test verifies that find invokes the given command for the
++# multiple-argument sytax '-exec CMD {} +'.  Between FINDUTILS-4.2.12
++# and v4.6.0, find(1) would have failed to execute CMD another time
++# if there was only one last single file argument.
++
++testname="$(basename $0)"
++
++. "${srcdir}"/binary_locations.sh
++
++die() {
++  echo "$@" >&2
++  exit 1
++}
++
++# This is used to simplify checking of the return value
++# which is useful when ensuring a command fails as desired.
++# I.e., just doing `command ... &&fail=1` will not catch
++# a segfault in command for example.  With this helper you
++# instead check an explicit exit code like
++#   returns_ 1 command ... || fail
++returns_ () {
++  # Disable tracing so it doesn't interfere with stderr of the wrapped command
++  { set +x; } 2>/dev/null
++
++  local exp_exit="$1"
++  shift
++  "$@"
++  test $? -eq $exp_exit && ret_=0 || ret_=1
++
++  set -x
++  { return $ret_; } 2>/dev/null
++}
++
++# Define the nicest compare available (borrowed from gnulib).
++if diff_out_=`exec 2>/dev/null; diff -u "$0" "$0" < /dev/null` \
++   && diff -u Makefile "$0" 2>/dev/null | grep '^[+]#!' >/dev/null; then
++  # diff accepts the -u option and does not (like AIX 7 'diff') produce an
++  # extra space on column 1 of every content line.
++  if test -z "$diff_out_"; then
++    compare () { diff -u "$@"; }
++  else
++    compare ()
++    {
++      if diff -u "$@" > diff.out; then
++        # No differences were found, but Solaris 'diff' produces output
++        # "No differences encountered". Hide this output.
++        rm -f diff.out
++        true
++      else
++        cat diff.out
++        rm -f diff.out
++        false
++      fi
++    }
++  fi
++elif diff_out_=`exec 2>/dev/null; diff -c "$0" "$0" < /dev/null`; then
++  if test -z "$diff_out_"; then
++    compare () { diff -c "$@"; }
++  else
++    compare ()
++    {
++      if diff -c "$@" > diff.out; then
++        # No differences were found, but AIX and HP-UX 'diff' produce output
++        # "No differences encountered" or "There are no differences between the
++        # files.". Hide this output.
++        rm -f diff.out
++        true
++      else
++        cat diff.out
++        rm -f diff.out
++        false
++      fi
++    }
++  fi
++elif cmp -s /dev/null /dev/null 2>/dev/null; then
++  compare () { cmp -s "$@"; }
++else
++  compare () { cmp "$@"; }
++fi
++
++DIR='RashuBug'
++# Name of the CMD to execute: the file name must be 6 characters long
++# (to trigger the bug in combination with the test files).
++CMD='tstcmd'
++
++# Create test files.
++make_test_data() {
++  # Create the CMD script and check that it works.
++  mkdir "$DIR" 'bin' \
++    && echo 'printf "%s\n" "$@"' > "bin/$CMD" \
++    && chmod +x "bin/$CMD" \
++    && PATH="$PWD/bin:$PATH" \
++    && [ $( "${ftsfind}" bin -maxdepth 0 -exec "$CMD" '{}' + ) = 'bin' ] \
++    || return 1
++
++  # Create expected output file - also used for creating the test data.
++  { seq -f "${DIR}/abcdefghijklmnopqrstuv%04g" 901 &&
++    seq -f "${DIR}/abcdefghijklmnopqrstu%04g" 902 3719
++  } > exp2 \
++    && LC_ALL=C sort exp2 > exp \
++    && rm exp2 \
++    || return 1
++
++  # Create test files, and check if test data has been created correctly.
++  xargs touch < exp \
++    && [ -f "${DIR}/abcdefghijklmnopqrstu3719" ] \
++    && [ 3719 = $( "${ftsfind}" "$DIR" -type f | wc -l ) ] \
++    || return 1
++}
++
++set -x
++tmpdir="$(mktemp -d)" \
++  && cd "$tmpdir" \
++  && make_test_data "${tmpdir}" \
++  || die "FAIL: failed to set up the test in ${tmpdir}"
++
++fail=0
++for exe in "${ftsfind}" "${oldfind}"; do
++  "$exe" "$DIR" -type f -exec "$CMD" '{}' + > out || fail=1
++  LC_ALL=C sort out > out2 || fail=1
++  compare exp out2 || fail=1
++done
++
++cd ..
++rm -rf "${tmpdir}" || exit 1
++exit $fail
+diff --git a/lib/buildcmd.c b/lib/buildcmd.c
+index a58f67e..27e9ce5 100644
+--- a/lib/buildcmd.c
++++ b/lib/buildcmd.c
+@@ -356,11 +356,6 @@ bc_push_arg (struct buildcmd_control *ctl,
+ 
+   assert (arg != NULL);
+ 
+-  if (!initial_args)
+-    {
+-      state->todo = 1;
+-    }
+-
+   if (!terminate)
+     {
+       if (state->cmd_argv_chars + len + pfxlen > ctl->arg_max)
+@@ -380,6 +375,11 @@ bc_push_arg (struct buildcmd_control *ctl,
+             bc_do_exec (ctl, state);
+     }
+ 
++  if (!initial_args)
++    {
++      state->todo = 1;
++    }
++
+   if (state->cmd_argc >= state->cmd_argv_alloc)
+     {
+       /* XXX: we could use extendbuf() here. */
+-- 
+2.5.5
+
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/findutils.git/commitdiff/4d44078a5cd35b94a1affa6ba84e48f9d7181a21



More information about the pld-cvs-commit mailing list