aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Kraai <kraai@debian.org>2001-05-02 21:17:38 +0000
committerMatt Kraai <kraai@debian.org>2001-05-02 21:17:38 +0000
commit3425111bb9925b9a00c34cbe95639a6e0bce58c1 (patch)
treea0cbb3581f34979f542b546face217c103080d72
parent0fcd447d59fffa2fafe090f0cd76bd115de02add (diff)
downloadbusybox-3425111bb9925b9a00c34cbe95639a6e0bce58c1.tar.gz
Fix bug #1108 by always canonicalizing arguments.
-rw-r--r--mount.c29
-rw-r--r--util-linux/mount.c29
2 files changed, 32 insertions, 26 deletions
diff --git a/mount.c b/mount.c
index fa298d93a..89eb099c5 100644
--- a/mount.c
+++ b/mount.c
@@ -43,6 +43,7 @@
*
*/
+#include <limits.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
@@ -338,8 +339,7 @@ extern int mount_main(int argc, char **argv)
char *extra_opts = string_flags_buf;
int flags = 0;
char *filesystemType = "auto";
- char *device = NULL;
- char *directory = NULL;
+ char device[PATH_MAX], directory[PATH_MAX];
int all = FALSE;
int fakeIt = FALSE;
int useMtab = TRUE;
@@ -378,15 +378,18 @@ extern int mount_main(int argc, char **argv)
}
}
- if (argv[optind] != NULL) {
- device = argv[optind];
- directory = argv[optind + 1];
- }
-
- if (device == NULL && !all)
+ if (!all && optind == argc)
show_mounts();
- if (all == TRUE || directory == NULL) {
+ if (optind < argc)
+ if (realpath(argv[optind], device) == NULL)
+ perror_msg_and_die("%s", device);
+
+ if (optind + 1 < argc)
+ if (realpath(argv[optind + 1], directory) == NULL)
+ perror_msg_and_die("%s", directory);
+
+ if (all == TRUE || optind + 1 == argc) {
struct mntent *m;
FILE *f = setmntent("/etc/fstab", "r");
fstabmount = TRUE;
@@ -395,7 +398,7 @@ extern int mount_main(int argc, char **argv)
perror_msg_and_die( "\nCannot read /etc/fstab");
while ((m = getmntent(f)) != NULL) {
- if (all == FALSE && directory == NULL && (
+ if (all == FALSE && optind + 1 == argc && (
(strcmp(device, m->mnt_fsname) != 0) &&
(strcmp(device, m->mnt_dir) != 0) ) ) {
continue;
@@ -414,8 +417,8 @@ extern int mount_main(int argc, char **argv)
parse_mount_options(m->mnt_opts, &flags, string_flags);
}
- device = strdup(m->mnt_fsname);
- directory = strdup(m->mnt_dir);
+ strcpy(device, m->mnt_fsname);
+ strcpy(directory, m->mnt_dir);
filesystemType = strdup(m->mnt_type);
singlemount:
string_flags = strdup(string_flags);
@@ -441,7 +444,7 @@ singlemount:
if (fstabmount == TRUE)
endmntent(f);
- if (all == FALSE && fstabmount == TRUE && directory == NULL)
+ if (all == FALSE && fstabmount == TRUE && optind + 1 == argc)
fprintf(stderr, "Can't find %s in /etc/fstab\n", device);
return rc;
diff --git a/util-linux/mount.c b/util-linux/mount.c
index fa298d93a..89eb099c5 100644
--- a/util-linux/mount.c
+++ b/util-linux/mount.c
@@ -43,6 +43,7 @@
*
*/
+#include <limits.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
@@ -338,8 +339,7 @@ extern int mount_main(int argc, char **argv)
char *extra_opts = string_flags_buf;
int flags = 0;
char *filesystemType = "auto";
- char *device = NULL;
- char *directory = NULL;
+ char device[PATH_MAX], directory[PATH_MAX];
int all = FALSE;
int fakeIt = FALSE;
int useMtab = TRUE;
@@ -378,15 +378,18 @@ extern int mount_main(int argc, char **argv)
}
}
- if (argv[optind] != NULL) {
- device = argv[optind];
- directory = argv[optind + 1];
- }
-
- if (device == NULL && !all)
+ if (!all && optind == argc)
show_mounts();
- if (all == TRUE || directory == NULL) {
+ if (optind < argc)
+ if (realpath(argv[optind], device) == NULL)
+ perror_msg_and_die("%s", device);
+
+ if (optind + 1 < argc)
+ if (realpath(argv[optind + 1], directory) == NULL)
+ perror_msg_and_die("%s", directory);
+
+ if (all == TRUE || optind + 1 == argc) {
struct mntent *m;
FILE *f = setmntent("/etc/fstab", "r");
fstabmount = TRUE;
@@ -395,7 +398,7 @@ extern int mount_main(int argc, char **argv)
perror_msg_and_die( "\nCannot read /etc/fstab");
while ((m = getmntent(f)) != NULL) {
- if (all == FALSE && directory == NULL && (
+ if (all == FALSE && optind + 1 == argc && (
(strcmp(device, m->mnt_fsname) != 0) &&
(strcmp(device, m->mnt_dir) != 0) ) ) {
continue;
@@ -414,8 +417,8 @@ extern int mount_main(int argc, char **argv)
parse_mount_options(m->mnt_opts, &flags, string_flags);
}
- device = strdup(m->mnt_fsname);
- directory = strdup(m->mnt_dir);
+ strcpy(device, m->mnt_fsname);
+ strcpy(directory, m->mnt_dir);
filesystemType = strdup(m->mnt_type);
singlemount:
string_flags = strdup(string_flags);
@@ -441,7 +444,7 @@ singlemount:
if (fstabmount == TRUE)
endmntent(f);
- if (all == FALSE && fstabmount == TRUE && directory == NULL)
+ if (all == FALSE && fstabmount == TRUE && optind + 1 == argc)
fprintf(stderr, "Can't find %s in /etc/fstab\n", device);
return rc;