libmount: don't canonicalize target
Note that mountpoint (target_ paths in /proc/mounts and /proc/self/mountinfo are always canonicalized by kernel. * for umount we don't have to canonicalize target by default if the mountpoint is found in /proc/self/mountinfo * in mnt_table_find_target() is unnecessary to canonicalize target paths if the table of the filesystems is read from /proc/self/mountinfo Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=820707 Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
3b56eea7c9
commit
fa705b5441
|
@ -604,8 +604,6 @@ int mnt_context_prepare_umount(struct libmnt_context *cxt)
|
|||
rc = mnt_context_merge_mflags(cxt);
|
||||
if (!rc)
|
||||
rc = evaluate_permissions(cxt);
|
||||
if (!rc)
|
||||
rc = mnt_context_prepare_target(cxt);
|
||||
|
||||
if (!rc && !cxt->helper) {
|
||||
|
||||
|
|
|
@ -1208,7 +1208,8 @@ int mnt_fs_get_attribute(struct libmnt_fs *fs, const char *name,
|
|||
* Possible are three attempts:
|
||||
* 1) compare @target with @fs->target
|
||||
* 2) realpath(@target) with @fs->target
|
||||
* 3) realpath(@target) with realpath(@fs->target).
|
||||
* 3) realpath(@target) with realpath(@fs->target) if @fs is not from
|
||||
* /proc/self/mountinfo.
|
||||
*
|
||||
* The 2nd and 3rd attempts are not performed when @cache is NULL.
|
||||
*
|
||||
|
@ -1231,7 +1232,7 @@ int mnt_fs_match_target(struct libmnt_fs *fs, const char *target,
|
|||
rc = (cn && strcmp(cn, fs->target) == 0);
|
||||
|
||||
/* 3) - canonicalized and canonicalized */
|
||||
if (!rc && cn) {
|
||||
if (!rc && cn && !mnt_fs_is_kernel(fs)) {
|
||||
char *tcn = mnt_resolve_path(fs->target, cache);
|
||||
rc = (tcn && strcmp(cn, tcn) == 0);
|
||||
}
|
||||
|
|
|
@ -456,13 +456,18 @@ struct libmnt_fs *mnt_table_find_target(struct libmnt_table *tb, const char *pat
|
|||
return fs;
|
||||
}
|
||||
|
||||
/* non-canonicaled path in struct libmnt_table */
|
||||
/* non-canonicaled path in struct libmnt_table
|
||||
* -- note that mountpoint in /proc/self/mountinfo is already
|
||||
* canonicalized by kernel
|
||||
*/
|
||||
mnt_reset_iter(&itr, direction);
|
||||
while(mnt_table_next_fs(tb, &itr, &fs) == 0) {
|
||||
char *p;
|
||||
|
||||
if (!fs->target || mnt_fs_is_swaparea(fs) ||
|
||||
(*fs->target == '/' && *(fs->target + 1) == '\0'))
|
||||
if (!fs->target
|
||||
|| mnt_fs_is_swaparea(fs)
|
||||
|| mnt_fs_is_kernel(fs)
|
||||
|| (*fs->target == '/' && *(fs->target + 1) == '\0'))
|
||||
continue;
|
||||
|
||||
p = mnt_resolve_path(fs->target, tb->cache);
|
||||
|
|
Loading…
Reference in New Issue