summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mount.cifs.c204
1 files changed, 110 insertions, 94 deletions
diff --git a/mount.cifs.c b/mount.cifs.c
index 903518b..36b6673 100644
--- a/mount.cifs.c
+++ b/mount.cifs.c
@@ -129,7 +129,7 @@ const char *thisprogram;
int verboseflag;
const char *cifs_fstype = "cifs";
-static int parse_unc(char *unc_name, struct parsed_mount_info *parsed_info);
+static int parse_unc(const char *unc_name, struct parsed_mount_info *parsed_info);
#if CIFS_DISABLE_SETUID_CHECK
static int check_setuid(void)
@@ -153,7 +153,7 @@ static int check_setuid(void)
#endif /* CIFS_DISABLE_SETUID_CHECK */
static int
-check_fstab(const char *progname, char *mountpoint, char *devname,
+check_fstab(const char *progname, const char *mountpoint, const char *devname,
char **options)
{
FILE *fstab;
@@ -873,10 +873,10 @@ resolve_host_out:
return rc;
}
-static int parse_unc(char *unc_name, struct parsed_mount_info *parsed_info)
+static int parse_unc(const char *unc_name, struct parsed_mount_info *parsed_info)
{
int length = strnlen(unc_name, MAX_UNC_LEN);
- char *host, *share, *prepath;
+ const char *host, *share, *prepath;
size_t hostlen, sharelen, prepathlen;
if (length > (MAX_UNC_LEN - 1)) {
@@ -1113,6 +1113,110 @@ add_mtab_exit:
return rc;
}
+static int
+assemble_mountinfo(struct parsed_mount_info *parsed_info,
+ const char *thisprogram, const char *mountpoint,
+ const char *orig_dev, char *orgoptions)
+{
+ int rc;
+
+ /* sanity check for unprivileged mounts */
+ if (getuid()) {
+ rc = check_fstab(thisprogram, mountpoint, orig_dev,
+ &orgoptions);
+ if (rc)
+ goto assemble_exit;
+
+ /* enable any default user mount flags */
+ parsed_info->flags |= CIFS_SETUID_FLAGS;
+ }
+
+ rc = get_pw_from_env(parsed_info);
+ if (rc)
+ goto assemble_exit;
+
+ if (orgoptions) {
+ rc = parse_options(orgoptions, parsed_info);
+ if (rc)
+ goto assemble_exit;
+ }
+
+ if (getuid()) {
+ if (!(parsed_info->flags & (MS_USERS | MS_USER))) {
+ fprintf(stderr, "%s: permission denied\n", thisprogram);
+ rc = EX_USAGE;
+ goto assemble_exit;
+ }
+
+ if (geteuid()) {
+ fprintf(stderr, "%s: not installed setuid - \"user\" "
+ "CIFS mounts not supported.", thisprogram);
+ rc = EX_FAIL;
+ goto assemble_exit;
+ }
+ }
+
+ parsed_info->flags &= ~(MS_USERS | MS_USER);
+
+ rc = parse_unc(orig_dev, parsed_info);
+ if (rc)
+ goto assemble_exit;
+
+ rc = resolve_host(parsed_info);
+ if (rc)
+ goto assemble_exit;
+
+ if (!parsed_info->got_user) {
+ /*
+ * Note that the password will not be retrieved from the
+ * USER env variable (ie user%password form) as there is
+ * already a PASSWD environment varaible
+ */
+ if (getenv("USER"))
+ strlcpy(parsed_info->username, getenv("USER"),
+ sizeof(parsed_info->username));
+ else
+ strlcpy(parsed_info->username, getusername(),
+ sizeof(parsed_info->username));
+ parsed_info->got_user = 1;
+ }
+
+ if (!parsed_info->got_password) {
+ /* getpass is obsolete, but there's apparently nothing that replaces it */
+ char *tmp_pass = getpass("Password: ");
+ if (!tmp_pass) {
+ fprintf(stderr, "Error reading password, exiting\n");
+ rc = EX_SYSERR;
+ goto assemble_exit;
+ }
+ rc = set_password(parsed_info, tmp_pass);
+ if (rc)
+ goto assemble_exit;
+ }
+
+ /* copy in ver= string. It's not really needed, but what the hell */
+ strlcat(parsed_info->options, ",ver=", sizeof(parsed_info->options));
+ strlcat(parsed_info->options, OPTIONS_VERSION, sizeof(parsed_info->options));
+
+ /* copy in user= string */
+ if (parsed_info->got_user) {
+ strlcat(parsed_info->options, ",user=",
+ sizeof(parsed_info->options));
+ strlcat(parsed_info->options, parsed_info->username,
+ sizeof(parsed_info->options));
+ }
+
+ if (*parsed_info->domain) {
+ strlcat(parsed_info->options, ",domain=",
+ sizeof(parsed_info->options));
+ strlcat(parsed_info->options, parsed_info->domain,
+ sizeof(parsed_info->options));
+ }
+
+assemble_exit:
+ return rc;
+}
+
int main(int argc, char **argv)
{
int c;
@@ -1218,99 +1322,11 @@ int main(int argc, char **argv)
goto mount_exit;
}
- /* sanity check for unprivileged mounts */
- if (getuid()) {
- rc = check_fstab(thisprogram, mountpoint, orig_dev,
- &orgoptions);
- if (rc)
- goto mount_exit;
-
- /* enable any default user mount flags */
- parsed_info->flags |= CIFS_SETUID_FLAGS;
- }
-
- rc = get_pw_from_env(parsed_info);
+ rc = assemble_mountinfo(parsed_info, thisprogram, mountpoint,
+ orig_dev, orgoptions);
if (rc)
goto mount_exit;
- if (orgoptions) {
- rc = parse_options(orgoptions, parsed_info);
- if (rc)
- goto mount_exit;
- }
-
- if (getuid()) {
- if (!(parsed_info->flags & (MS_USERS | MS_USER))) {
- fprintf(stderr, "%s: permission denied\n", thisprogram);
- rc = EX_USAGE;
- goto mount_exit;
- }
-
- if (geteuid()) {
- fprintf(stderr, "%s: not installed setuid - \"user\" "
- "CIFS mounts not supported.", thisprogram);
- rc = EX_FAIL;
- goto mount_exit;
- }
- }
-
- parsed_info->flags &= ~(MS_USERS | MS_USER);
-
- rc = parse_unc(orig_dev, parsed_info);
- if (rc)
- goto mount_exit;
-
- rc = resolve_host(parsed_info);
- if (rc)
- goto mount_exit;
-
- if (!parsed_info->got_user) {
- /*
- * Note that the password will not be retrieved from the
- * USER env variable (ie user%password form) as there is
- * already a PASSWD environment varaible
- */
- if (getenv("USER"))
- strlcpy(parsed_info->username, getenv("USER"),
- sizeof(parsed_info->username));
- else
- strlcpy(parsed_info->username, getusername(),
- sizeof(parsed_info->username));
- parsed_info->got_user = 1;
- }
-
- if (!parsed_info->got_password) {
- /* getpass is obsolete, but there's apparently nothing that replaces it */
- char *tmp_pass = getpass("Password: ");
- if (!tmp_pass) {
- fprintf(stderr, "Error reading password, exiting\n");
- rc = EX_SYSERR;
- goto mount_exit;
- }
- rc = set_password(parsed_info, tmp_pass);
- if (rc)
- goto mount_exit;
- }
-
- /* copy in ver= string. It's not really needed, but what the hell */
- strlcat(parsed_info->options, ",ver=", sizeof(parsed_info->options));
- strlcat(parsed_info->options, OPTIONS_VERSION, sizeof(parsed_info->options));
-
- /* copy in user= string */
- if (parsed_info->got_user) {
- strlcat(parsed_info->options, ",user=",
- sizeof(parsed_info->options));
- strlcat(parsed_info->options, parsed_info->username,
- sizeof(parsed_info->options));
- }
-
- if (*parsed_info->domain) {
- strlcat(parsed_info->options, ",domain=",
- sizeof(parsed_info->options));
- strlcat(parsed_info->options, parsed_info->domain,
- sizeof(parsed_info->options));
- }
-
options = calloc(options_size, 1);
if (!options) {
fprintf(stderr, "Unable to allocate memory.\n");