[libvirt] [PATCH] virfile: Take symlink into account in virFileIsSharedFixFUSE
Erik Skultety
eskultet at redhat.com
Fri Oct 19 10:18:30 UTC 2018
On Thu, Oct 18, 2018 at 05:04:37PM +0200, Michal Privoznik wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=1640465
>
> Weirdly enough, there can be symlinks in the path we are trying
> to fix. If it is the case our clever algorithm that finds matches
> against mount table won't work. Canonicalize path at the
> beginning then.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> cfg.mk | 2 +-
> src/util/virfile.c | 17 ++++++++++++++---
> tests/virfilemock.c | 33 ++++++++++++++++++++++++++++++++-
> tests/virfiletest.c | 1 +
> 4 files changed, 48 insertions(+), 5 deletions(-)
>
> diff --git a/cfg.mk b/cfg.mk
> index 4790d0b7e7..d0183c02ff 100644
> --- a/cfg.mk
> +++ b/cfg.mk
> @@ -1229,7 +1229,7 @@ exclude_file_name_regexp--sc_prohibit_select = \
> ^cfg\.mk$$
>
> exclude_file_name_regexp--sc_prohibit_canonicalize_file_name = \
> - ^cfg\.mk$$
> + ^(cfg\.mk|tests/virfilemock\.c)$$
>
> exclude_file_name_regexp--sc_prohibit_raw_allocation = \
> ^(docs/hacking\.html\.in|src/util/viralloc\.[ch]|examples/.*|tests/(securityselinuxhelper|(vircgroup|nss)mock|commandhelper)\.c|tools/wireshark/src/packet-libvirt\.c)$$
> diff --git a/src/util/virfile.c b/src/util/virfile.c
> index e09992e41a..4747a26ad3 100644
> --- a/src/util/virfile.c
> +++ b/src/util/virfile.c
> @@ -3473,9 +3473,19 @@ virFileIsSharedFixFUSE(const char *path,
> char mntbuf[1024];
> char *mntDir = NULL;
> char *mntType = NULL;
> + char *canonPath = NULL;
> size_t maxMatching = 0;
> int ret = -1;
>
> + if (!(canonPath = virFileCanonicalizePath(path))) {
> + virReportSystemError(errno,
> + _("unable to canonicalize %s"),
> + path);
> + return -1;
> + }
> +
> + VIR_DEBUG("Path %s after canonicalization %s", path, canonPath);
s/canonicalization/canonicalization: /
or if you preferred, you could be brave and have a message like this:
("Path canonicalization: %s->%s", path, canonPath) which imho creates a better
contrast, but it's your call.
> +
> if (!(f = setmntent(PROC_MOUNTS, "r"))) {
> virReportSystemError(errno,
> _("Unable to open %s"),
> @@ -3487,7 +3497,7 @@ virFileIsSharedFixFUSE(const char *path,
> const char *p;
> size_t len = strlen(mb.mnt_dir);
>
> - if (!(p = STRSKIP(path, mb.mnt_dir)))
> + if (!(p = STRSKIP(canonPath, mb.mnt_dir)))
> continue;
>
> if (*(p - 1) != '/' && *p != '/' && *p != '\0')
> @@ -3504,13 +3514,14 @@ virFileIsSharedFixFUSE(const char *path,
> }
>
> if (STREQ_NULLABLE(mntType, "fuse.glusterfs")) {
> - VIR_DEBUG("Found gluster FUSE mountpoint=%s for path=%s. "
It's debug, I think it's perfectly fine to leave the "path=" part in there,
just swap the corresponding source var for canonPath.
Reviewed-by: Erik Skultety <eskultet at redhat.com>
More information about the libvir-list
mailing list