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
This commit is contained in:
Eric Andersen 2000-06-06 16:15:23 +00:00
parent c389d91181
commit 815e904470
11 changed files with 123 additions and 98 deletions

View File

@ -50,6 +50,11 @@
* Fixed all fatalError() calls lacking a "\n", thanks to Pavel Roskin. * Fixed all fatalError() calls lacking a "\n", thanks to Pavel Roskin.
* Fixed a segfault in yes when no args were given -- Pavel Roskin. * Fixed a segfault in yes when no args were given -- Pavel Roskin.
* Simplified freeramdisk and added argument checking -- Pavel Roskin. * Simplified freeramdisk and added argument checking -- Pavel Roskin.
* 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>"
* "which" rewritten to use stat(). Fixes to improve its compatability * "which" rewritten to use stat(). Fixes to improve its compatability
with traditional implementations -- Pavel Roskin. with traditional implementations -- Pavel Roskin.
* More doc updates * More doc updates

View File

@ -26,7 +26,7 @@ export VERSION
# Set the following to `true' to make a debuggable build. # Set the following to `true' to make a debuggable build.
# Leave this set to `false' for production use. # Leave this set to `false' for production use.
# eg: `make DODEBUG=true tests' # eg: `make DODEBUG=true tests'
DODEBUG = false DODEBUG = true
# If you want a static binary, turn this on. # If you want a static binary, turn this on.
DOSTATIC = false DOSTATIC = false

6
TODO
View File

@ -26,12 +26,6 @@ Bugs that need fixing before the 0.44 release goes out the door:
chmod -R chmod -R
chown -R chown -R
chgrp -R chgrp -R
cp -a -a
ln -s -s
rm -f
rm -f -
rm -- -
touch -c
- I believe that swaponoff may also be also broken (check it). - I believe that swaponoff may also be also broken (check it).
- It used to be that BusyBox tar would happily overwrite existing files on - It used to be that BusyBox tar would happily overwrite existing files on
an extraction. However, as of 0.42, BusyBox tar simply dies as soon as an an extraction. However, as of 0.42, BusyBox tar simply dies as soon as an

View File

@ -59,6 +59,7 @@ extern int ln_main(int argc, char **argv)
argv++; argv++;
/* Parse any options */ /* Parse any options */
while (--argc >= 0 && *argv && **argv) {
while (**argv == '-') { while (**argv == '-') {
while (*++(*argv)) while (*++(*argv))
switch (**argv) { switch (**argv) {
@ -74,10 +75,14 @@ extern int ln_main(int argc, char **argv)
default: default:
usage(ln_usage); usage(ln_usage);
} }
argc--; }
argv++; argv++;
} }
if (argc < 1) {
fatalError("ln: missing file argument\n");
}
linkName = argv[argc - 1]; linkName = argv[argc - 1];
if (strlen(linkName) > BUFSIZ) { if (strlen(linkName) > BUFSIZ) {

View File

@ -31,7 +31,8 @@
static const char *rm_usage = "rm [OPTION]... FILE...\n" static const char *rm_usage = "rm [OPTION]... FILE...\n"
#ifndef BB_FEATURE_TRIVIAL_HELP #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" "Options:\n"
"\t-f\t\tremove existing destinations, never prompt\n" "\t-f\t\tremove existing destinations, never prompt\n"
"\t-r or -R\tremove the contents of directories recursively\n" "\t-r or -R\tremove the contents of directories recursively\n"
@ -64,15 +65,16 @@ static int dirAction(const char *fileName, struct stat *statbuf, void* junk)
extern int rm_main(int argc, char **argv) extern int rm_main(int argc, char **argv)
{ {
int stopIt=FALSE;
struct stat statbuf; struct stat statbuf;
if (argc < 2) { if (argc < 2) {
usage(rm_usage); usage(rm_usage);
} }
argc--;
argv++; argv++;
/* Parse any options */ /* Parse any options */
while (--argc >= 0 && *argv && **argv && stopIt==FALSE) {
while (**argv == '-') { while (**argv == '-') {
while (*++(*argv)) while (*++(*argv))
switch (**argv) { switch (**argv) {
@ -83,10 +85,13 @@ extern int rm_main(int argc, char **argv)
case 'f': case 'f':
forceFlag = TRUE; forceFlag = TRUE;
break; break;
case '-':
stopIt = TRUE;
break;
default: default:
usage(rm_usage); usage(rm_usage);
} }
argc--; }
argv++; argv++;
} }

View File

@ -203,6 +203,7 @@ extern int cp_mv_main(int argc, char **argv)
if (dz_i == is_cp) { if (dz_i == is_cp) {
recursiveFlag = preserveFlag = forceFlag = FALSE; recursiveFlag = preserveFlag = forceFlag = FALSE;
followLinks = TRUE; followLinks = TRUE;
while (--argc >= 0 && *argv && **argv) {
while (**argv == '-') { while (**argv == '-') {
while (*++(*argv)) { while (*++(*argv)) {
switch (**argv) { switch (**argv) {
@ -227,14 +228,18 @@ extern int cp_mv_main(int argc, char **argv)
usage(cp_mv_usage[is_cp]); usage(cp_mv_usage[is_cp]);
} }
} }
argc--; }
argv++; argv++;
} }
if (argc < 1) {
fatalError("cp: missing file argument\n");
}
} else { /* (dz_i == is_mv) */ } else { /* (dz_i == is_mv) */
recursiveFlag = preserveFlag = TRUE; recursiveFlag = preserveFlag = TRUE;
followLinks = FALSE; followLinks = FALSE;
} }
if (strlen(argv[argc - 1]) > BUFSIZ) { if (strlen(argv[argc - 1]) > BUFSIZ) {
fprintf(stderr, name_too_long, "cp"); fprintf(stderr, name_too_long, "cp");
goto exit_false; goto exit_false;

View File

@ -1327,7 +1327,8 @@ Instructs the kernel to reboot the system.
Usage: rm [OPTION]... FILE... Usage: rm [OPTION]... FILE...
Remove (unlink) the FILE(s). Remove (unlink) the FILE(s). You may use '--' to
indicate that all following arguments are non-options.
Options: Options:
@ -1946,4 +1947,4 @@ Enrique Zanardi <ezanardi@ull.es>
=cut =cut
# $Id: busybox.pod,v 1.34 2000/06/05 17:23:06 andersen Exp $ # $Id: busybox.pod,v 1.35 2000/06/06 16:15:23 andersen Exp $

7
ln.c
View File

@ -59,6 +59,7 @@ extern int ln_main(int argc, char **argv)
argv++; argv++;
/* Parse any options */ /* Parse any options */
while (--argc >= 0 && *argv && **argv) {
while (**argv == '-') { while (**argv == '-') {
while (*++(*argv)) while (*++(*argv))
switch (**argv) { switch (**argv) {
@ -74,10 +75,14 @@ extern int ln_main(int argc, char **argv)
default: default:
usage(ln_usage); usage(ln_usage);
} }
argc--; }
argv++; argv++;
} }
if (argc < 1) {
fatalError("ln: missing file argument\n");
}
linkName = argv[argc - 1]; linkName = argv[argc - 1];
if (strlen(linkName) > BUFSIZ) { if (strlen(linkName) > BUFSIZ) {

View File

@ -188,7 +188,7 @@ static volatile void show_usage()
fprintf(stderr, fprintf(stderr,
"\t-n [14|30]\tSpecify the maximum length of filenames\n"); "\t-n [14|30]\tSpecify the maximum length of filenames\n");
fprintf(stderr, fprintf(stderr,
"\t-i\t\tSpecify the number of inodes for the filesystem\n"); "\t-i INODES\tSpecify the number of inodes for the filesystem\n");
fprintf(stderr, fprintf(stderr,
"\t-l FILENAME\tRead the bad blocks list from FILENAME\n"); "\t-l FILENAME\tRead the bad blocks list from FILENAME\n");
fprintf(stderr, "\t-v\t\tMake a Minix version 2 filesystem\n\n"); fprintf(stderr, "\t-v\t\tMake a Minix version 2 filesystem\n\n");

11
rm.c
View File

@ -31,7 +31,8 @@
static const char *rm_usage = "rm [OPTION]... FILE...\n" static const char *rm_usage = "rm [OPTION]... FILE...\n"
#ifndef BB_FEATURE_TRIVIAL_HELP #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" "Options:\n"
"\t-f\t\tremove existing destinations, never prompt\n" "\t-f\t\tremove existing destinations, never prompt\n"
"\t-r or -R\tremove the contents of directories recursively\n" "\t-r or -R\tremove the contents of directories recursively\n"
@ -64,15 +65,16 @@ static int dirAction(const char *fileName, struct stat *statbuf, void* junk)
extern int rm_main(int argc, char **argv) extern int rm_main(int argc, char **argv)
{ {
int stopIt=FALSE;
struct stat statbuf; struct stat statbuf;
if (argc < 2) { if (argc < 2) {
usage(rm_usage); usage(rm_usage);
} }
argc--;
argv++; argv++;
/* Parse any options */ /* Parse any options */
while (--argc >= 0 && *argv && **argv && stopIt==FALSE) {
while (**argv == '-') { while (**argv == '-') {
while (*++(*argv)) while (*++(*argv))
switch (**argv) { switch (**argv) {
@ -83,10 +85,13 @@ extern int rm_main(int argc, char **argv)
case 'f': case 'f':
forceFlag = TRUE; forceFlag = TRUE;
break; break;
case '-':
stopIt = TRUE;
break;
default: default:
usage(rm_usage); usage(rm_usage);
} }
argc--; }
argv++; argv++;
} }

View File

@ -188,7 +188,7 @@ static volatile void show_usage()
fprintf(stderr, fprintf(stderr,
"\t-n [14|30]\tSpecify the maximum length of filenames\n"); "\t-n [14|30]\tSpecify the maximum length of filenames\n");
fprintf(stderr, fprintf(stderr,
"\t-i\t\tSpecify the number of inodes for the filesystem\n"); "\t-i INODES\tSpecify the number of inodes for the filesystem\n");
fprintf(stderr, fprintf(stderr,
"\t-l FILENAME\tRead the bad blocks list from FILENAME\n"); "\t-l FILENAME\tRead the bad blocks list from FILENAME\n");
fprintf(stderr, "\t-v\t\tMake a Minix version 2 filesystem\n\n"); fprintf(stderr, "\t-v\t\tMake a Minix version 2 filesystem\n\n");