diff options
author | Ron Yorston <rmy@pobox.com> | 2021-06-24 15:08:15 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-06-25 00:23:29 +0200 |
commit | a84bbc54257e68ef149cbaff8835c9cb3605c9ac (patch) | |
tree | 9cb21b15f9abfc47f7f1db32985fbb79d78d6bf2 | |
parent | 294d0c85adcbcf48da1fc0f48dae3aed59c07436 (diff) | |
download | busybox-w32-a84bbc54257e68ef149cbaff8835c9cb3605c9ac.tar.gz busybox-w32-a84bbc54257e68ef149cbaff8835c9cb3605c9ac.tar.bz2 busybox-w32-a84bbc54257e68ef149cbaff8835c9cb3605c9ac.zip |
cp,mv: fix -t DIR option
When the '-t DIR' option is used the loop over the remaining
arguments should terminate when a NULL pointer is reached.
function old new delta
mv_main 585 590 +5
cp_main 492 496 +4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 9/0) Total: 9 bytes
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | coreutils/cp.c | 4 | ||||
-rw-r--r-- | coreutils/mv.c | 4 | ||||
-rw-r--r-- | testsuite/mv/mv-files-to-dir-2 | 16 |
3 files changed, 20 insertions, 4 deletions
diff --git a/coreutils/cp.c b/coreutils/cp.c index b7f0e290f..50ca1ccea 100644 --- a/coreutils/cp.c +++ b/coreutils/cp.c | |||
@@ -252,7 +252,7 @@ int cp_main(int argc, char **argv) | |||
252 | } | 252 | } |
253 | } | 253 | } |
254 | } | 254 | } |
255 | /* else: last is DIR from "t -DIR" */ | 255 | /* else: last is DIR from "-t DIR" */ |
256 | 256 | ||
257 | while (1) { | 257 | while (1) { |
258 | #if ENABLE_FEATURE_CP_LONG_OPTIONS | 258 | #if ENABLE_FEATURE_CP_LONG_OPTIONS |
@@ -274,7 +274,7 @@ int cp_main(int argc, char **argv) | |||
274 | if (copy_file(*argv, dest, flags) < 0) { | 274 | if (copy_file(*argv, dest, flags) < 0) { |
275 | status = EXIT_FAILURE; | 275 | status = EXIT_FAILURE; |
276 | } | 276 | } |
277 | if (*++argv == last) { | 277 | if (!*++argv || *argv == last) { |
278 | /* possibly leaking dest... */ | 278 | /* possibly leaking dest... */ |
279 | break; | 279 | break; |
280 | } | 280 | } |
diff --git a/coreutils/mv.c b/coreutils/mv.c index eae2e99bb..fd2422683 100644 --- a/coreutils/mv.c +++ b/coreutils/mv.c | |||
@@ -108,7 +108,7 @@ int mv_main(int argc, char **argv) | |||
108 | /* else: fall through into "do { move SRC to DIR/SRC } while" loop */ | 108 | /* else: fall through into "do { move SRC to DIR/SRC } while" loop */ |
109 | } | 109 | } |
110 | } | 110 | } |
111 | /* else: last is DIR from "t -DIR" */ | 111 | /* else: last is DIR from "-t DIR" */ |
112 | 112 | ||
113 | do { | 113 | do { |
114 | dest = concat_path_file(last, bb_get_last_path_component_strip(*argv)); | 114 | dest = concat_path_file(last, bb_get_last_path_component_strip(*argv)); |
@@ -185,7 +185,7 @@ int mv_main(int argc, char **argv) | |||
185 | if (dest != last) { | 185 | if (dest != last) { |
186 | free((void *) dest); | 186 | free((void *) dest); |
187 | } | 187 | } |
188 | } while (*++argv != last); | 188 | } while (*++argv && *argv != last); |
189 | 189 | ||
190 | return status; | 190 | return status; |
191 | } | 191 | } |
diff --git a/testsuite/mv/mv-files-to-dir-2 b/testsuite/mv/mv-files-to-dir-2 new file mode 100644 index 000000000..e189ebb6f --- /dev/null +++ b/testsuite/mv/mv-files-to-dir-2 | |||
@@ -0,0 +1,16 @@ | |||
1 | echo file number one > file1 | ||
2 | echo file number two > file2 | ||
3 | ln -s file2 link1 | ||
4 | mkdir dir1 | ||
5 | TZ=UTC0 touch -d '2000-01-30 05:24:08' dir1/file3 | ||
6 | mkdir there | ||
7 | busybox mv -t there file1 file2 link1 dir1 | ||
8 | test -f there/file1 | ||
9 | test -f there/file2 | ||
10 | test -f there/dir1/file3 | ||
11 | test -L there/link1 | ||
12 | test xfile2 = x`readlink there/link1` | ||
13 | test ! -e file1 | ||
14 | test ! -e file2 | ||
15 | test ! -e link1 | ||
16 | test ! -e dir1/file3 | ||