aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2021-06-24 15:08:15 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2021-06-25 00:23:29 +0200
commita84bbc54257e68ef149cbaff8835c9cb3605c9ac (patch)
tree9cb21b15f9abfc47f7f1db32985fbb79d78d6bf2
parent294d0c85adcbcf48da1fc0f48dae3aed59c07436 (diff)
downloadbusybox-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.c4
-rw-r--r--coreutils/mv.c4
-rw-r--r--testsuite/mv/mv-files-to-dir-216
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 @@
1echo file number one > file1
2echo file number two > file2
3ln -s file2 link1
4mkdir dir1
5TZ=UTC0 touch -d '2000-01-30 05:24:08' dir1/file3
6mkdir there
7busybox mv -t there file1 file2 link1 dir1
8test -f there/file1
9test -f there/file2
10test -f there/dir1/file3
11test -L there/link1
12test xfile2 = x`readlink there/link1`
13test ! -e file1
14test ! -e file2
15test ! -e link1
16test ! -e dir1/file3