libmultipath: add size argument to dm_get_uuid()
authorMartin Wilck <mwilck@suse.com>
Mon, 24 Jun 2019 09:27:35 +0000 (11:27 +0200)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Wed, 3 Jul 2019 06:31:06 +0000 (08:31 +0200)
The length of the uuid field in libdm is DM_UUID_LEN, which happens
to be one byte more than our WWID_SIZE. Handle this cleanly.

Signed-off-by: Martin Wilck <mwilck@suse.com>
libmultipath/configure.c
libmultipath/devmapper.c
libmultipath/devmapper.h
libmultipath/wwids.c
multipathd/main.c

index 52afa37..c8dd69b 100644 (file)
@@ -1451,7 +1451,7 @@ int get_refwwid(enum mpath_cmds cmd, char *dev, enum devtypes dev_type,
 
                conf = get_multipath_config();
                pthread_cleanup_push(put_multipath_config, conf);
-               if (((dm_get_uuid(dev, tmpwwid)) == 0)
+               if (((dm_get_uuid(dev, tmpwwid, WWID_SIZE)) == 0)
                    && (strlen(tmpwwid))) {
                        refwwid = tmpwwid;
                        goto check;
index 2e79667..0f0c3a3 100644 (file)
@@ -13,7 +13,9 @@
 #include <unistd.h>
 #include <errno.h>
 #include <sys/sysmacros.h>
+#include <linux/dm-ioctl.h>
 
+#include "util.h"
 #include "checkers.h"
 #include "vector.h"
 #include "structs.h"
@@ -554,7 +556,7 @@ out:
 }
 
 static int
-dm_get_prefixed_uuid(const char *name, char *uuid)
+dm_get_prefixed_uuid(const char *name, char *uuid, int uuid_len)
 {
        struct dm_task *dmt;
        const char *uuidtmp;
@@ -572,7 +574,7 @@ dm_get_prefixed_uuid(const char *name, char *uuid)
 
        uuidtmp = dm_task_get_uuid(dmt);
        if (uuidtmp)
-               strcpy(uuid, uuidtmp);
+               strlcpy(uuid, uuidtmp, uuid_len);
        else
                uuid[0] = '\0';
 
@@ -582,14 +584,18 @@ uuidout:
        return r;
 }
 
-int dm_get_uuid(const char *name, char *uuid)
+int dm_get_uuid(const char *name, char *uuid, int uuid_len)
 {
-       if (dm_get_prefixed_uuid(name, uuid))
+       char tmp[DM_UUID_LEN];
+
+       if (dm_get_prefixed_uuid(name, tmp, sizeof(tmp)))
                return 1;
 
-       if (!strncmp(uuid, UUID_PREFIX, UUID_PREFIX_LEN))
-               memmove(uuid, uuid + UUID_PREFIX_LEN,
-                       strlen(uuid + UUID_PREFIX_LEN) + 1);
+       if (!strncmp(tmp, UUID_PREFIX, UUID_PREFIX_LEN))
+               strlcpy(uuid, tmp + UUID_PREFIX_LEN, uuid_len);
+       else
+               uuid[0] = '\0';
+
        return 0;
 }
 
@@ -597,12 +603,12 @@ static int
 is_mpath_part(const char *part_name, const char *map_name)
 {
        char *p;
-       char part_uuid[WWID_SIZE], map_uuid[WWID_SIZE];
+       char part_uuid[DM_UUID_LEN], map_uuid[DM_UUID_LEN];
 
-       if (dm_get_prefixed_uuid(part_name, part_uuid))
+       if (dm_get_prefixed_uuid(part_name, part_uuid, sizeof(part_uuid)))
                return 0;
 
-       if (dm_get_prefixed_uuid(map_name, map_uuid))
+       if (dm_get_prefixed_uuid(map_name, map_uuid, sizeof(map_uuid)))
                return 0;
 
        if (strncmp(part_uuid, "part", 4) != 0)
@@ -1066,7 +1072,7 @@ struct multipath *dm_get_multipath(const char *name)
        if (dm_get_map(name, &mpp->size, NULL))
                goto out;
 
-       dm_get_uuid(name, mpp->wwid);
+       dm_get_uuid(name, mpp->wwid, WWID_SIZE);
        dm_get_info(name, &mpp->dmi);
 
        return mpp;
index db75526..7557a86 100644 (file)
@@ -63,7 +63,7 @@ int dm_get_major_minor (const char *name, int *major, int *minor);
 char * dm_mapname(int major, int minor);
 int dm_remove_partmaps (const char * mapname, int need_sync,
                        int deferred_remove);
-int dm_get_uuid(const char *name, char *uuid);
+int dm_get_uuid(const char *name, char *uuid, int uuid_len);
 int dm_get_info (const char * mapname, struct dm_info ** dmi);
 int dm_rename (const char * old, char * new, char * delim, int skip_kpartx);
 int dm_reassign(const char * mapname);
index 53e7951..ef74812 100644 (file)
@@ -294,7 +294,8 @@ should_multipath(struct path *pp1, vector pathvec, vector mpvec)
                char tmp_wwid[WWID_SIZE];
                struct multipath *mp = find_mp_by_wwid(mpvec, pp1->wwid);
 
-               if (mp != NULL && dm_get_uuid(mp->alias, tmp_wwid) == 0 &&
+               if (mp != NULL &&
+                   dm_get_uuid(mp->alias, tmp_wwid, WWID_SIZE) == 0 &&
                    !strncmp(tmp_wwid, pp1->wwid, WWID_SIZE)) {
                        condlog(3, "wwid %s is already multipathed, keeping it",
                                pp1->wwid);
index ad81832..7a5cd11 100644 (file)
@@ -407,7 +407,7 @@ set_multipath_wwid (struct multipath * mpp)
        if (strlen(mpp->wwid))
                return;
 
-       dm_get_uuid(mpp->alias, mpp->wwid);
+       dm_get_uuid(mpp->alias, mpp->wwid, WWID_SIZE);
 }
 
 static void set_no_path_retry(struct multipath *mpp)