diff --git a/sys-utils/mount.c b/sys-utils/mount.c index fa1ce15c3..ed814ca49 100644 --- a/sys-utils/mount.c +++ b/sys-utils/mount.c @@ -1030,24 +1030,41 @@ int main(int argc, char **argv) mnt_context_get_target(cxt))) { /* * B) mount -L|-U|--source|--target + * + * non-root may specify source *or* target, but not both */ if (mnt_context_is_restricted(cxt) && mnt_context_get_source(cxt) && mnt_context_get_target(cxt)) exit_non_root(NULL); - } else if (argc == 1) { + } else if (argc == 1 && (!mnt_context_get_source(cxt) || + !mnt_context_get_target(cxt))) { /* * C) mount [-L|-U|--source] + * mount [--target ] * mount * * non-root may specify source *or* target, but not both + * + * It does not matter for libmount if we set source or target + * here (the library is able to swap it), but it matters for + * sanitize_paths(). */ - if (mnt_context_is_restricted(cxt) && - mnt_context_get_source(cxt)) - exit_non_root(NULL); + int istag = mnt_tag_is_valid(argv[0]); - mnt_context_set_target(cxt, argv[0]); + if (istag && mnt_context_get_source(cxt)) + /* -L, -U or --source together with LABEL= or UUID= */ + errx(MOUNT_EX_USAGE, _("source specified more than once")); + else if (istag || mnt_context_get_target(cxt)) + mnt_context_set_source(cxt, argv[0]); + else + mnt_context_set_target(cxt, argv[0]); + + if (mnt_context_is_restricted(cxt) && + mnt_context_get_source(cxt) && + mnt_context_get_target(cxt)) + exit_non_root(NULL); } else if (argc == 2 && !mnt_context_get_source(cxt) && !mnt_context_get_target(cxt)) { @@ -1056,6 +1073,7 @@ int main(int argc, char **argv) */ if (mnt_context_is_restricted(cxt)) exit_non_root(NULL); + mnt_context_set_source(cxt, argv[0]); mnt_context_set_target(cxt, argv[1]);