On 3/15/25 10:30, James Youngman wrote:
I don't think anybody ever intended to support things like -). But
we don't have visibility into what people are actually doing.
I'd suggest issuing a warning for these usages. [edit] So that we have
the option to eventually make them an error.
Fair enough.
As accepting '-!' is a GNU extension (even if probably inadvertently),
I think we can safely issue a warning without setting the error status.
Patch attached. Pushing soon.
Have a nice day,
Berny
From f1fa80330bb57353c99884affa5e372824f75056 Mon Sep 17 00:00:00 2001
From: Bernhard Voelker <m...@bernhard-voelker.de>
Date: Sun, 23 Mar 2025 23:29:36 +0100
Subject: [PATCH] find: issue a warning for wrongly accepted operators like
'-!'
In the current implementation, GNU find accepts the operators '!', ',',
'(' and ')' with a leading dash, e.g. '-!'.
Let's issue a warning to see if anyone relies on that odd behavior.
With a later release, let's fix the parser, and not accept these anymore.
* find/parser.c (find_parser): Issue a warning in the case one of the
above operators has been passed with a leading '-'.
* tests/find/operators-wrong-with-dash.sh: Add test.
* tests/local.mk (sh_tests): Reference it.
* NEWS (Changes in find): Mention the change in behavior.
---
NEWS | 4 +++
find/parser.c | 14 ++++++++++
tests/find/operators-wrong-with-dash.sh | 37 +++++++++++++++++++++++++
tests/local.mk | 1 +
4 files changed, 56 insertions(+)
create mode 100755 tests/find/operators-wrong-with-dash.sh
diff --git a/NEWS b/NEWS
index 5b32c9fc..5df941d6 100644
--- a/NEWS
+++ b/NEWS
@@ -24,6 +24,10 @@ GNU findutils NEWS - User visible changes. -*- outline -*- (allout)
argument of the command to be run. While POSIX allows this for -exec, this is
deemed insecure as an attacker could influence which files could be found.
+ find now issues a warning when the punctuation operators '(', ')', '!' and ','
+ are passed with a leading dash, e.g. '-!'. Future releases will not accept
+ that any more. Accepting that was rather a bug "since the beginning".
+
** Documentation Changes
The forthcoming Issue 8 of the POSIX standard will standardise "find
diff --git a/find/parser.c b/find/parser.c
index 4843a5d7..d2850c64 100644
--- a/find/parser.c
+++ b/find/parser.c
@@ -662,6 +662,20 @@ find_parser (const char *search_name)
{
if (strcmp (parse_table[i].parser_name, search_name) == 0)
{
+ /* FIXME >4.11: fix parser to disallow dashed operators like '-!'.
+ * Meanwhile, issue a warning. */
+ if ( (original_arg < search_name) /* with '-' */
+ && (ARG_PUNCTUATION == parse_table[i].type)
+ && ( search_name[0] == '!' || search_name[0] == ','
+ || search_name[0] == '(' || search_name[0] == ')')
+ && (search_name[1] == '\0'))
+ {
+ error (0, 0,
+ _("warning: operator '%s' (with leading dash '-') will "
+ "no longer be accepted in future findutils releases!"),
+ original_arg);
+ }
+
return found_parser (original_arg, &parse_table[i]);
}
}
diff --git a/tests/find/operators-wrong-with-dash.sh b/tests/find/operators-wrong-with-dash.sh
new file mode 100755
index 00000000..88079b2c
--- /dev/null
+++ b/tests/find/operators-wrong-with-dash.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+# Verify behavior for '-!', '-,', '-(', and '-)'.
+
+# Copyright (C) 2025 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 <https://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; fu_path_prepend_
+print_ver_ find
+
+# Versions before and including 4.10 accepted the above mentioned operator
+# options (with a leading dash '-').
+# Findutils 4.11 issues a warning.
+
+cat <<\EOF > exp || framework_failure_
+find: warning: operator '-(' (with leading dash '-') will no longer be accepted in future findutils releases!
+find: warning: operator '-!' (with leading dash '-') will no longer be accepted in future findutils releases!
+find: warning: operator '-,' (with leading dash '-') will no longer be accepted in future findutils releases!
+find: warning: operator '-)' (with leading dash '-') will no longer be accepted in future findutils releases!
+EOF
+
+find '-(' '-!' -not -type c -, -type b '-)' 2>err || fail=1
+cat err
+compare exp err || fail=1
+
+Exit $fail
diff --git a/tests/local.mk b/tests/local.mk
index f04af96b..203ccf20 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -122,6 +122,7 @@ sh_tests = \
tests/find/printf_escapechars.sh \
tests/find/printf_escape_c.sh \
tests/find/printf_inode.sh \
+ tests/find/operators-wrong-with-dash.sh \
tests/find/execdir-fd-leak.sh \
tests/find/exec-plus-last-file.sh \
tests/find/files0-from.sh \
--
2.48.1