libmultipath: parse_vpd_pg80: fix whitespace handling
authorMartin Wilck <mwilck@suse.com>
Mon, 24 Jun 2019 09:27:50 +0000 (11:27 +0200)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Wed, 3 Jul 2019 06:32:01 +0000 (08:32 +0200)
According to the SPC spec, the unit serial number is right-aligned
ASCII. Thus leading whitespace must be skipped. Moreover, trailing
whitespace should be discarded before doing the length check.

Fixes: 756ef73b7197 "Separate out vpd parsing functions"
Signed-off-by: Martin Wilck <mwilck@suse.com>
libmultipath/discovery.c

index 931a676..b10afde 100644 (file)
@@ -907,9 +907,18 @@ get_geometry(struct path *pp)
 static int
 parse_vpd_pg80(const unsigned char *in, char *out, size_t out_len)
 {
-       char *p = NULL;
        int len = get_unaligned_be16(&in[2]);
 
+       /*
+        * Strip leading and trailing whitespace
+        */
+       while (len > 0 && in[len + 3] == ' ')
+               --len;
+       while (len > 0 && in[4] == ' ') {
+               ++in;
+               --len;
+       }
+
        if (len >= out_len) {
                condlog(2, "vpd pg80 overflow, %d/%d bytes required",
                        len + 1, (int)out_len);
@@ -919,15 +928,6 @@ parse_vpd_pg80(const unsigned char *in, char *out, size_t out_len)
                memcpy(out, in + 4, len);
                out[len] = '\0';
        }
-       /*
-        * Strip trailing whitspaces
-        */
-       p = out + len - 1;
-       while (p > out && *p == ' ') {
-               *p = '\0';
-               p--;
-               len --;
-       }
        return len;
 }