Received: (at 60989) by debbugs.gnu.org; 21 Jan 2023 14:53:24 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jan 21 09:53:23 2023
Received: from localhost ([127.0.0.1]:48420 helo=debbugs.gnu.org)
by debbugs.gnu.org with esmtp (Exim 4.84_2)
(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
id 1pJFFD-0000UP-Ia
for submit <at> debbugs.gnu.org; Sat, 21 Jan 2023 09:53:23 -0500
Received: from mail-wr1-f45.google.com ([209.85.221.45]:44854)
by debbugs.gnu.org with esmtp (Exim 4.84_2)
(envelope-from <pixelbeat@HIDDEN>) id 1pJFFB-0000UC-5U
for 60989 <at> debbugs.gnu.org; Sat, 21 Jan 2023 09:53:21 -0500
Received: by mail-wr1-f45.google.com with SMTP id bk16so7157165wrb.11
for <60989 <at> debbugs.gnu.org>; Sat, 21 Jan 2023 06:53:21 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112;
h=content-transfer-encoding:in-reply-to:from:references:to
:content-language:subject:user-agent:mime-version:date:message-id
:sender:from:to:cc:subject:date:message-id:reply-to;
bh=uMV8nSBhVYM+JyJJ4FDVbY7NULb1N2UYJ6exVSz/K/E=;
b=FWAVkS5cjLONrbDcBotEOl7JUcQkIiQkge6uIKKJGxTm4lKHlbHLOSMFWFlFs0QQSB
LUH90xut9NvVryHj0KNMxERGs9U/z2eobiG8+aV9UR81jvNNwt9k+FjEK6J261+d5Zci
yA/YtpPbpfA8k9CfEC9EwRjBq2ml2ES894dm4abUqsmzaCjkDtGqoggcC/xarsUaT3YI
IbNiuKlCID0rtMn5qkCUsteN51OAqivGnGkBDZy5vGNULl3oTp8YR35YqdrFEJDCI7NN
QNBRa3rky74ZEiEeEAoXhsWUApmQZjY8k9oxHCfvwX1JkLT+HgqtID8s1MwVxYLFx0sQ
BBwA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20210112;
h=content-transfer-encoding:in-reply-to:from:references:to
:content-language:subject:user-agent:mime-version:date:message-id
:sender:x-gm-message-state:from:to:cc:subject:date:message-id
:reply-to;
bh=uMV8nSBhVYM+JyJJ4FDVbY7NULb1N2UYJ6exVSz/K/E=;
b=iAyCCpYCwpNFrrfGtnhCnU8lp4x+M+0+p4L3japZ+oUg+u7ujMHx0vBYcqTVrD3iCR
hQPOQHmoYOl21ZOTSvhBzHpv8d3sYo/Xu4GxAie5tdljj796c4Fon/y2Fjdzxgws1H3s
OJYNOXMpeMs6RSzVsKo1UWuZy9QSha/XUlvkOCJxAyrmSTDxZs3ifAmzOybDbL/Ir/f6
6ss2ahaA7IWeYaC9+16HgCtBOWo/E4IBEVHg+t2WJrAPRlVGNtHu8nJWPmC6fXJdJWGJ
LYm1UkUY0Ls+dPru3SxX0Gq/1HAqVRtx4JHOim8tuzxmxF4KWJv6u9vDjsVMkeuEQHGv
u9ew==
X-Gm-Message-State: AFqh2kpqrvIXYzbDvETyhueVpMn0D+3MaHeumZcRpjx8kIrTWYvT4yXv
v+C8i9Nn+JOp3BHKf9DZso0=
X-Google-Smtp-Source: AMrXdXsoqf6qlSOtKRXwHyG3BqA9OYUWxFAWh7z/xAvqwnTckvEL06uDYvV4CIoFN+8cwlvGhtTbbA==
X-Received: by 2002:adf:f54d:0:b0:273:7d1b:7337 with SMTP id
j13-20020adff54d000000b002737d1b7337mr25049079wrp.7.1674312795195;
Sat, 21 Jan 2023 06:53:15 -0800 (PST)
Received: from [192.168.1.9]
(95-44-90-175-dynamic.agg2.lod.rsl-rtd.eircom.net. [95.44.90.175])
by smtp.googlemail.com with ESMTPSA id
c6-20020adffb06000000b002423620d356sm18196936wrr.35.2023.01.21.06.53.14
(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
Sat, 21 Jan 2023 06:53:14 -0800 (PST)
Message-ID: <0461e966-8ae5-4fcb-7f9f-42283f6b30cb@HIDDEN>
Date: Sat, 21 Jan 2023 14:53:13 +0000
MIME-Version: 1.0
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101
Thunderbird/109.0
Subject: Re: bug#60989: [PATCH] rm: fail on duplicate input if force not
enabled
Content-Language: en-US
To: =?UTF-8?Q?=C5=81ukasz_Sroka?= <sroka.dev@HIDDEN>, 60989 <at> debbugs.gnu.org
References: <CAGtcvOiSkkFv59ceFApbYVXWQS57jgQEVEf=O=sZDZ1+aXE98A@HIDDEN>
From: =?UTF-8?Q?P=C3=A1draig_Brady?= <P@HIDDEN>
In-Reply-To: <CAGtcvOiSkkFv59ceFApbYVXWQS57jgQEVEf=O=sZDZ1+aXE98A@HIDDEN>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-Spam-Score: -0.9 (/)
X-Debbugs-Envelope-To: 60989
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>,
<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>,
<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.9 (-)
On 21/01/2023 13:05, Łukasz Sroka wrote:
> When the input files contain duplicates, then the rm fails. Because
> duplicates occur most often when the * is used and the shell unwraps it.
> There is a very common scenario when a user accidentally enters space
> after a filename, or enters space instead of forward slash.
> Example:
>
> rm prefix_ *
>
> The user intended to remove all files with a `prefix_` but removed all
> of the files in cwd.
> The program quits immediately when a duplicate is detected, to prevent
> pressing `y` because user expected a prompt regarding removing multiple
> files.
> The force option disables this function to enable scripts to work
> without modifying them.
>
> ```
> diff --git a/src/rm.c b/src/rm.c
> index 354e2b0df..e4f9949f0 100644
> --- a/src/rm.c
> +++ b/src/rm.c
> @@ -123,6 +123,16 @@ diagnose_leading_hyphen (int argc, char **argv)
> }
> }
>
> +static bool
> +find_duplicates (int n_files, char **files)
> +{
> + for (int l = 0; l < n_files-1; l++)
> + for (int r = l+1; r < n_files; r++)
> + if (strcmp(files[l], files[r]) == 0)
> + return true;
> + return false;
> +}
> +
> void
> usage (int status)
> {
> @@ -211,6 +221,7 @@ main (int argc, char **argv)
> bool preserve_root = true;
> struct rm_options x;
> bool prompt_once = false;
> + bool force_rm = false;
> int c;
>
> initialize_main (&argc, &argv);
> @@ -238,6 +249,7 @@ main (int argc, char **argv)
> x.interactive = RMI_NEVER;
> x.ignore_missing_files = true;
> prompt_once = false;
> + force_rm = true;
> break;
>
> case 'i':
> @@ -352,6 +364,17 @@ main (int argc, char **argv)
> uintmax_t n_files = argc - optind;
> char **file = argv + optind;
>
> + if (!force_rm && find_duplicates(n_files, file))
> + {
> + /* Because usually when the input files are duplicated it means
> that the user
> + sumbitted both a directory and an * as separate arguments,
> probably by accident */
> + fprintf (stderr,
> + "%s: input contains duplicates, most likely you've put "
> + "both * and a file from the same directory.\n",
> + program_name);
> + return EXIT_FAILURE;
> + }
> +
> if (prompt_once && (x.recursive || 3 < n_files))
> {
> fprintf (stderr,
> ```
An interesting proposal.
The main protection would be for `dir/ *` rather than `file_prefix_ *`.
The former would be unusual for a user to type, while the latter more usual, but wouldn't trigger the protection AFAICS.
This ads O(N^2) on each interaction, so if it was to be included probably only enabled with --interactive.
cheers,
Pádraig
bug-coreutils@HIDDEN:bug#60989; Package coreutils.
Full text available.
Received: (at submit) by debbugs.gnu.org; 21 Jan 2023 14:28:13 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jan 21 09:28:13 2023
Received: from localhost ([127.0.0.1]:48377 helo=debbugs.gnu.org)
by debbugs.gnu.org with esmtp (Exim 4.84_2)
(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
id 1pJEqr-0008Ct-3L
for submit <at> debbugs.gnu.org; Sat, 21 Jan 2023 09:28:13 -0500
Received: from lists.gnu.org ([209.51.188.17]:36020)
by debbugs.gnu.org with esmtp (Exim 4.84_2)
(envelope-from <sroka.dev@HIDDEN>) id 1pJDYz-0006Dp-Uk
for submit <at> debbugs.gnu.org; Sat, 21 Jan 2023 08:05:42 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10])
by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
(Exim 4.90_1) (envelope-from <sroka.dev@HIDDEN>)
id 1pJDYz-00006v-J4
for bug-coreutils@HIDDEN; Sat, 21 Jan 2023 08:05:41 -0500
Received: from mail-pf1-x42e.google.com ([2607:f8b0:4864:20::42e])
by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
(Exim 4.90_1) (envelope-from <sroka.dev@HIDDEN>)
id 1pJDYx-0004gu-OA
for bug-coreutils@HIDDEN; Sat, 21 Jan 2023 08:05:41 -0500
Received: by mail-pf1-x42e.google.com with SMTP id c26so5844330pfp.10
for <bug-coreutils@HIDDEN>; Sat, 21 Jan 2023 05:05:38 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112;
h=to:subject:message-id:date:from:mime-version:from:to:cc:subject
:date:message-id:reply-to;
bh=NxxCzssBD0cIWcnLLssSDbBmG2H3TOUJCGa0t8Dn0oI=;
b=TUEwOmhC/Scd4FL0OydFEIGgQ/CfmzHfwvfNGEwXNoHSn5iR4F00glNAJbQz4oqVIY
LRW/0PmP+ep6iqvxmo/Wk7rDF7x0oYesJDde61axxylyqJxu6QQzGEQhtukZwab3bSX7
szCyTaEPjgRnft96BwrVzF9qONRlw2u0oLE0JPGZOo4dRd6W23TaC4F95+ADK3KjpS0Y
JRwwquET9Td+817yli1McNqmxGJ19yNTwyTrZrdW2yOe1QR4niEQuKL+5A1zXE78hKWz
zZF2/0F+6lP89U9if5xSW0zEVOGRZBRPMLF2ydyjm/0n9lYEROYoijbdNIJzyyzB6m3U
QY1w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20210112;
h=to:subject:message-id:date:from:mime-version:x-gm-message-state
:from:to:cc:subject:date:message-id:reply-to;
bh=NxxCzssBD0cIWcnLLssSDbBmG2H3TOUJCGa0t8Dn0oI=;
b=78uSW2oKUukWJRHmuwouxRPIxcAXn7GWQEuj+EcJFZNWdVRMizzMRLJgYbLT961Fva
xIjibS9NmU5lAv3HUpnh051B4mw87Nb6Eje4paogGKJEHswWof88P4dSuqPC5hXedWrk
3fvIlMUpSeeeFueObiRtictjCkaMXiPIQUSnoxh5vm1QymW4zIaOAoNWqYSZIe1JSomN
Zd21JsBJWpW7RmVpXaYZZOgdtBc0PWXKm35rX4lX12lU/ttV0XVWBYMr2tCPy3at1zhC
MTHwtJnzG8+P5tcUJizA41n0doR6PclaDXZB8WBXOHYVx3FhshfP6iRMK0rZ55eWtTFt
O8FQ==
X-Gm-Message-State: AFqh2kpAkPeOwDhtgMSAwqWytk0Cd6O9uMrFv0PVyfx3ehUrCuXXt7Hm
6U+jmDra6Xoo/UzByEOYCIF+59TofD9/HH2yLJQkufrCX0E=
X-Google-Smtp-Source: AMrXdXsR0CpADgpH8WunKEGtZlyFChIuhHFUl9imzPuxoTx1/t0xwIEv86hCu1hRt6n+jkxsr1QU9TWPjXbsQgm6jLk=
X-Received: by 2002:aa7:820f:0:b0:58d:a713:d1dd with SMTP id
k15-20020aa7820f000000b0058da713d1ddmr1970474pfi.59.1674306337429; Sat, 21
Jan 2023 05:05:37 -0800 (PST)
MIME-Version: 1.0
From: =?UTF-8?Q?=C5=81ukasz_Sroka?= <sroka.dev@HIDDEN>
Date: Sat, 21 Jan 2023 14:05:25 +0100
Message-ID: <CAGtcvOiSkkFv59ceFApbYVXWQS57jgQEVEf=O=sZDZ1+aXE98A@HIDDEN>
Subject: [PATCH] rm: fail on duplicate input if force not enabled
To: bug-coreutils@HIDDEN
Content-Type: text/plain; charset="UTF-8"
Received-SPF: pass client-ip=2607:f8b0:4864:20::42e;
envelope-from=sroka.dev@HIDDEN; helo=mail-pf1-x42e.google.com
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,
RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,
SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: -1.3 (-)
X-Debbugs-Envelope-To: submit
X-Mailman-Approved-At: Sat, 21 Jan 2023 09:28:12 -0500
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>,
<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>,
<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -2.3 (--)
When the input files contain duplicates, then the rm fails. Because
duplicates occur most often when the * is used and the shell unwraps it.
There is a very common scenario when a user accidentally enters space
after a filename, or enters space instead of forward slash.
Example:
rm prefix_ *
The user intended to remove all files with a `prefix_` but removed all
of the files in cwd.
The program quits immediately when a duplicate is detected, to prevent
pressing `y` because user expected a prompt regarding removing multiple
files.
The force option disables this function to enable scripts to work
without modifying them.
```
diff --git a/src/rm.c b/src/rm.c
index 354e2b0df..e4f9949f0 100644
--- a/src/rm.c
+++ b/src/rm.c
@@ -123,6 +123,16 @@ diagnose_leading_hyphen (int argc, char **argv)
}
}
+static bool
+find_duplicates (int n_files, char **files)
+{
+ for (int l = 0; l < n_files-1; l++)
+ for (int r = l+1; r < n_files; r++)
+ if (strcmp(files[l], files[r]) == 0)
+ return true;
+ return false;
+}
+
void
usage (int status)
{
@@ -211,6 +221,7 @@ main (int argc, char **argv)
bool preserve_root = true;
struct rm_options x;
bool prompt_once = false;
+ bool force_rm = false;
int c;
initialize_main (&argc, &argv);
@@ -238,6 +249,7 @@ main (int argc, char **argv)
x.interactive = RMI_NEVER;
x.ignore_missing_files = true;
prompt_once = false;
+ force_rm = true;
break;
case 'i':
@@ -352,6 +364,17 @@ main (int argc, char **argv)
uintmax_t n_files = argc - optind;
char **file = argv + optind;
+ if (!force_rm && find_duplicates(n_files, file))
+ {
+ /* Because usually when the input files are duplicated it means
that the user
+ sumbitted both a directory and an * as separate arguments,
probably by accident */
+ fprintf (stderr,
+ "%s: input contains duplicates, most likely you've put "
+ "both * and a file from the same directory.\n",
+ program_name);
+ return EXIT_FAILURE;
+ }
+
if (prompt_once && (x.recursive || 3 < n_files))
{
fprintf (stderr,
```
Łukasz Sroka <sroka.dev@HIDDEN>:bug-coreutils@HIDDEN.
Full text available.bug-coreutils@HIDDEN:bug#60989; Package coreutils.
Full text available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.