[libvirt] [PATCH 4/4] virfile: Rework virFileIsSharedFixFUSE
Michal Privoznik
mprivozn at redhat.com
Wed Oct 10 13:57:39 UTC 2018
On 10/10/2018 01:08 PM, Jiri Denemark wrote:
> On Tue, Oct 09, 2018 at 15:48:47 +0200, Michal Privoznik wrote:
>> There are couple of things wrong with the current implementation.
>> The first one is that in the first loop the code tries to build a
>> list of fuse.glusterfs mount points. Well, since the strings are
>> allocated in a temporary buffer and are not duplicated this
>> results in wrong decision made later in the code.
>>
>> The second problem is that the code does not take into account
>> subtree mounts. For instance, if there's a fuse.gluster mounted
>> at /some/path and another FS mounted at /some/path/subdir the
>> code would not recognize this subdir mount.
>>
>> Reported-by: Han Han <hhan at redhat.com>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>> src/util/virfile.c | 58 +++++++++++++----------------------
>> tests/virfiledata/mounts3.txt | 2 ++
>> tests/virfiletest.c | 2 ++
>> 3 files changed, 26 insertions(+), 36 deletions(-)
>>
>> diff --git a/src/util/virfile.c b/src/util/virfile.c
>> index 666d703f99..19f504cc6d 100644
>> --- a/src/util/virfile.c
>> +++ b/src/util/virfile.c
>> @@ -3468,18 +3468,14 @@ static int
>> virFileIsSharedFixFUSE(const char *path,
>> long *f_type)
>> {
>> - char *dirpath = NULL;
>> - const char **mounts = NULL;
>> - size_t nmounts = 0;
>> - char *p;
>> FILE *f = NULL;
>> struct mntent mb;
>> char mntbuf[1024];
>> + char *mntDir = NULL;
>> + char *mntType = NULL;
>> + size_t maxMatching = 0;
>> int ret = -1;
>>
>> - if (VIR_STRDUP(dirpath, path) < 0)
>> - return -1;
>> -
>> if (!(f = setmntent(PROC_MOUNTS, "r"))) {
>> virReportSystemError(errno,
>> _("Unable to open %s"),
>> @@ -3488,43 +3484,33 @@ virFileIsSharedFixFUSE(const char *path,
>> }
>>
>> while (getmntent_r(f, &mb, mntbuf, sizeof(mntbuf))) {
>> - if (STRNEQ("fuse.glusterfs", mb.mnt_type))
>> + const char *p;
>> + size_t len = strlen(mb.mnt_dir);
>> +
>> + if (!(p = STRSKIP(path, mb.mnt_dir)))
>> continue;
>
> I think you wanted to do something clever with the p pointer here to
> avoid false positives on, e.g., /mnt/ble when searching for /mnt/bleak
> path. Otherwise you could have just use STRPREFIX().
>
> The rest of the patch looks OK.
Oh right. I wanted to do this:
diff --git i/src/util/virfile.c w/src/util/virfile.c
index 19f504cc6d..03e14c757f 100644
--- i/src/util/virfile.c
+++ w/src/util/virfile.c
@@ -3490,6 +3490,9 @@ virFileIsSharedFixFUSE(const char *path,
if (!(p = STRSKIP(path, mb.mnt_dir)))
continue;
+ if (*p != '/')
+ continue;
+
if (len > maxMatching) {
len = maxMatching;
VIR_FREE(mntType);
Michal
More information about the libvir-list
mailing list