diff options
author | Eric Andersen <andersen@codepoet.org> | 2000-06-06 16:15:23 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2000-06-06 16:15:23 +0000 |
commit | 815e90447064e287ad181c1231636e7f1b44f76c (patch) | |
tree | 0955917be0c7adc926b7298bf450fedc67e447e6 /coreutils | |
parent | c389d9118152e45303173c221a33a8083e769884 (diff) | |
download | 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 'coreutils')
-rw-r--r-- | coreutils/ln.c | 37 | ||||
-rw-r--r-- | coreutils/rm.c | 37 |
2 files changed, 42 insertions, 32 deletions
diff --git a/coreutils/ln.c b/coreutils/ln.c index 29ff93863..d4fa47306 100644 --- a/coreutils/ln.c +++ b/coreutils/ln.c @@ -59,25 +59,30 @@ extern int ln_main(int argc, char **argv) argv++; /* Parse any options */ - while (**argv == '-') { - while (*++(*argv)) - switch (**argv) { - case 's': - symlinkFlag = TRUE; - break; - case 'f': - removeoldFlag = TRUE; - break; - case 'n': - followLinks = FALSE; - break; - default: - usage(ln_usage); - } - argc--; + while (--argc >= 0 && *argv && **argv) { + while (**argv == '-') { + while (*++(*argv)) + switch (**argv) { + case 's': + symlinkFlag = TRUE; + break; + case 'f': + removeoldFlag = TRUE; + break; + case 'n': + followLinks = FALSE; + break; + default: + usage(ln_usage); + } + } argv++; } + if (argc < 1) { + fatalError("ln: missing file argument\n"); + } + linkName = argv[argc - 1]; if (strlen(linkName) > BUFSIZ) { diff --git a/coreutils/rm.c b/coreutils/rm.c index c62d68aba..5901c5da9 100644 --- a/coreutils/rm.c +++ b/coreutils/rm.c @@ -31,7 +31,8 @@ static const char *rm_usage = "rm [OPTION]... FILE...\n" #ifndef BB_FEATURE_TRIVIAL_HELP - "\nRemove (unlink) the FILE(s).\n\n" + "\nRemove (unlink) the FILE(s). You may use '--' to\n" + "indicate that all following arguments are non-options.\n\n" "Options:\n" "\t-f\t\tremove existing destinations, never prompt\n" "\t-r or -R\tremove the contents of directories recursively\n" @@ -64,29 +65,33 @@ static int dirAction(const char *fileName, struct stat *statbuf, void* junk) extern int rm_main(int argc, char **argv) { + int stopIt=FALSE; struct stat statbuf; if (argc < 2) { usage(rm_usage); } - argc--; argv++; /* Parse any options */ - while (**argv == '-') { - while (*++(*argv)) - switch (**argv) { - case 'R': - case 'r': - recursiveFlag = TRUE; - break; - case 'f': - forceFlag = TRUE; - break; - default: - usage(rm_usage); - } - argc--; + while (--argc >= 0 && *argv && **argv && stopIt==FALSE) { + while (**argv == '-') { + while (*++(*argv)) + switch (**argv) { + case 'R': + case 'r': + recursiveFlag = TRUE; + break; + case 'f': + forceFlag = TRUE; + break; + case '-': + stopIt = TRUE; + break; + default: + usage(rm_usage); + } + } argv++; } |