diff options
author | Eric Andersen | 2000-06-06 16:15:23 +0000 |
---|---|---|
committer | Eric Andersen | 2000-06-06 16:15:23 +0000 |
commit | 815e90447064e287ad181c1231636e7f1b44f76c (patch) | |
tree | 0955917be0c7adc926b7298bf450fedc67e447e6 /cp_mv.c | |
parent | c389d9118152e45303173c221a33a8083e769884 (diff) | |
download | busybox-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.c | 51 |
1 files changed, 28 insertions, 23 deletions
@@ -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"); |