summaryrefslogtreecommitdiff
path: root/cp_mv.c
diff options
context:
space:
mode:
authorEric Andersen2000-06-06 16:15:23 +0000
committerEric Andersen2000-06-06 16:15:23 +0000
commit815e90447064e287ad181c1231636e7f1b44f76c (patch)
tree0955917be0c7adc926b7298bf450fedc67e447e6 /cp_mv.c
parentc389d9118152e45303173c221a33a8083e769884 (diff)
downloadbusybox-815e90447064e287ad181c1231636e7f1b44f76c.zip
busybox-815e90447064e287ad181c1231636e7f1b44f76c.tar.gz
Fixed a bunch of stuff:
* Fixed segfault caused by "touch -c" * Fixed segfault caused by "rm -f" * Fixed segfault caused by "ln -s -s" and similar abuses. * Fixed segfault caused by "cp -a -a" and similar abuses. * Implemented "rm -- <foo>" updated docs accordingly. -Erik
Diffstat (limited to 'cp_mv.c')
-rw-r--r--cp_mv.c51
1 files changed, 28 insertions, 23 deletions
diff --git a/cp_mv.c b/cp_mv.c
index ac1e71b..4445e77 100644
--- a/cp_mv.c
+++ b/cp_mv.c
@@ -203,37 +203,42 @@ extern int cp_mv_main(int argc, char **argv)
if (dz_i == is_cp) {
recursiveFlag = preserveFlag = forceFlag = FALSE;
followLinks = TRUE;
- while (**argv == '-') {
- while (*++(*argv)) {
- switch (**argv) {
- case 'a':
- followLinks = FALSE;
- preserveFlag = TRUE;
- recursiveFlag = TRUE;
- break;
- case 'd':
- followLinks = FALSE;
- break;
- case 'p':
- preserveFlag = TRUE;
- break;
- case 'R':
- recursiveFlag = TRUE;
- break;
- case 'f':
- forceFlag = TRUE;
- break;
- default:
- usage(cp_mv_usage[is_cp]);
+ while (--argc >= 0 && *argv && **argv) {
+ while (**argv == '-') {
+ while (*++(*argv)) {
+ switch (**argv) {
+ case 'a':
+ followLinks = FALSE;
+ preserveFlag = TRUE;
+ recursiveFlag = TRUE;
+ break;
+ case 'd':
+ followLinks = FALSE;
+ break;
+ case 'p':
+ preserveFlag = TRUE;
+ break;
+ case 'R':
+ recursiveFlag = TRUE;
+ break;
+ case 'f':
+ forceFlag = TRUE;
+ break;
+ default:
+ usage(cp_mv_usage[is_cp]);
+ }
}
}
- argc--;
argv++;
}
+ if (argc < 1) {
+ fatalError("cp: missing file argument\n");
+ }
} else { /* (dz_i == is_mv) */
recursiveFlag = preserveFlag = TRUE;
followLinks = FALSE;
}
+
if (strlen(argv[argc - 1]) > BUFSIZ) {
fprintf(stderr, name_too_long, "cp");