diff options
-rw-r--r-- | NEWS | 8 | ||||
-rw-r--r-- | THANKS | 1 | ||||
m--------- | gnulib | 0 | ||||
-rw-r--r-- | lib/xfts.c | 29 | ||||
-rw-r--r-- | po/POTFILES.in | 1 | ||||
-rwxr-xr-x | tests/rm/empty-name | 18 |
6 files changed, 32 insertions, 25 deletions
@@ -2,6 +2,14 @@ GNU coreutils NEWS -*- outline -*- * Noteworthy changes in release ?.? (????-??-??) [?] +** Bug fixes + + rm once again handles zero-length arguments properly. + The rewrite to make rm use fts introduced a regression whereby + a command like "rm a '' b" would fail to remove "a" and "b", due to + the presence of the empty string argument. + [bug introduced in coreutils-8.0] + * Noteworthy changes in release 8.1 (2009-11-18) [stable] @@ -334,6 +334,7 @@ Kirk Kelsey kirk.kelsey@0x4b.net Kristin E Thomas kristint@us.ibm.com Kjetil Torgrim Homme kjetilho@ifi.uio.no Kristoffer Rose kris@diku.dk +Ladislav Hagara ladislav.hagara@unob.cz Larry McVoy lm@sgi.com Lars Hecking lhecking@nmrc.ucc.ie Leah Q eequor@earthlink.net diff --git a/gnulib b/gnulib -Subproject cf8ddf08dec79be620c011ce204cbdb6bff35c5 +Subproject cdfe647f8d29540cdfe90cef0fa568c5d2fd448 diff --git a/lib/xfts.c b/lib/xfts.c index 9c46f6af5..dd86a5cba 100644 --- a/lib/xfts.c +++ b/lib/xfts.c @@ -21,13 +21,9 @@ #include <stdbool.h> #include <stdlib.h> +#include <errno.h> +#include <assert.h> -#include "error.h" - -#include "gettext.h" -#define _(msgid) gettext (msgid) - -#include "quote.h" #include "xalloc.h" #include "xfts.h" @@ -40,23 +36,10 @@ xfts_open (char * const *argv, int options, FTS *fts = fts_open (argv, options | FTS_CWDFD, compar); if (fts == NULL) { - /* This can fail in three ways: out of memory, invalid bit_flags, - and one or more of the FILES is an empty string. We could try - to decipher that errno==EINVAL means invalid bit_flags and - errno==ENOENT means there's an empty string, but that seems wrong. - Ideally, fts_open would return a proper error indicator. For now, - we'll presume that the bit_flags are valid and just check for - empty strings. */ - bool invalid_arg = false; - for (; *argv; ++argv) - { - if (**argv == '\0') - invalid_arg = true; - } - if (invalid_arg) - error (EXIT_FAILURE, 0, _("invalid argument: %s"), quote ("")); - else - xalloc_die (); + /* This can fail in two ways: out of memory or with errno==EINVAL, + which indicates it was called with invalid bit_flags. */ + assert (errno != EINVAL); + xalloc_die (); } return fts; diff --git a/po/POTFILES.in b/po/POTFILES.in index 9a46a9a74..e744dda00 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -28,7 +28,6 @@ lib/verror.c lib/version-etc.c lib/xalloc-die.c lib/xfreopen.c -lib/xfts.c lib/xmemcoll.c lib/xmemxfrm.c lib/xprintf.c diff --git a/tests/rm/empty-name b/tests/rm/empty-name index 08cc8e339..27f76d0ae 100755 --- a/tests/rm/empty-name +++ b/tests/rm/empty-name @@ -29,12 +29,28 @@ use strict; my $prog = 'rm'; +# FIXME: copied from misc/ls-misc; factor into Coreutils.pm? +sub mk_file(@) +{ + foreach my $f (@_) + { + open (F, '>', $f) && close F + or die "creating $f: $!\n"; + } +} + my @Tests = ( # test-name options input expected-output # ['empty-name-1', "''", {EXIT => 1}, - {ERR => "$prog: invalid argument: `'\n"}], + {ERR => "$prog: cannot remove `': No such file or directory\n"}], + + ['empty-name-2', "a '' b", {EXIT => 1}, + {ERR => "$prog: cannot remove `': No such file or directory\n"}, + {PRE => sub { mk_file qw(a b) }}, + {POST => sub {-f 'a' || -f 'b' and die "a or b remain\n" }}, + ], ); my $save_temps = $ENV{SAVE_TEMPS}; |