mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-02 01:18:26 +03:00
device_id: ignore quotes in device id
A t10 wwid string was found containing a " character which breaks vg metadata parsing. Ignore any quotation marks in device id strings.
This commit is contained in:
parent
57ad78d436
commit
dc99f0def1
@ -438,8 +438,8 @@ int dev_read_sys_wwid(struct cmd_context *cmd, struct device *dev,
|
|||||||
if (!ret || !buf[0])
|
if (!ret || !buf[0])
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* in t10 id, replace series of spaces with one _ */
|
/* in t10 id, replace characters like space and quote */
|
||||||
if (!strncmp(buf, "t10.", 4) && strchr(buf, ' ')) {
|
if (!strncmp(buf, "t10.", 4)) {
|
||||||
if (bufsize < DEV_WWID_SIZE)
|
if (bufsize < DEV_WWID_SIZE)
|
||||||
return 0;
|
return 0;
|
||||||
memcpy(tmpbuf, buf, DEV_WWID_SIZE);
|
memcpy(tmpbuf, buf, DEV_WWID_SIZE);
|
||||||
@ -587,6 +587,8 @@ const char *device_id_system_read(struct cmd_context *cmd, struct device *dev, u
|
|||||||
/* wwids are already munged if needed */
|
/* wwids are already munged if needed */
|
||||||
if (idtype != DEV_ID_TYPE_SYS_WWID) {
|
if (idtype != DEV_ID_TYPE_SYS_WWID) {
|
||||||
for (i = 0; i < strlen(sysbuf); i++) {
|
for (i = 0; i < strlen(sysbuf); i++) {
|
||||||
|
if (sysbuf[i] == '"')
|
||||||
|
continue;
|
||||||
if (isblank(sysbuf[i]) || isspace(sysbuf[i]) || iscntrl(sysbuf[i]))
|
if (isblank(sysbuf[i]) || isspace(sysbuf[i]) || iscntrl(sysbuf[i]))
|
||||||
sysbuf[i] = '_';
|
sysbuf[i] = '_';
|
||||||
}
|
}
|
||||||
|
@ -53,6 +53,12 @@ int format_t10_id(const unsigned char *in, int in_bytes, unsigned char *out, int
|
|||||||
/* skip leading spaces */
|
/* skip leading spaces */
|
||||||
if (!retlen && (in[i] == ' '))
|
if (!retlen && (in[i] == ' '))
|
||||||
continue;
|
continue;
|
||||||
|
/* skip non-ascii non-printable characters */
|
||||||
|
if (!isascii(in[i]) || !isprint(in[i]))
|
||||||
|
continue;
|
||||||
|
/* skip quote */
|
||||||
|
if (in[i] == '"')
|
||||||
|
continue;
|
||||||
/* replace one or more spaces with _ */
|
/* replace one or more spaces with _ */
|
||||||
if (in[i] == ' ') {
|
if (in[i] == ' ') {
|
||||||
in_space = 1;
|
in_space = 1;
|
||||||
|
@ -219,6 +219,30 @@ vgremove $vg
|
|||||||
rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
|
rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
|
||||||
cleanup_sysfs
|
cleanup_sysfs
|
||||||
|
|
||||||
|
# Test t10 wwid containing quote
|
||||||
|
rm $DF
|
||||||
|
aux wipefs_a "$DEV1"
|
||||||
|
mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/
|
||||||
|
echo "t10.ATA_2.5\"_SATA_SSD_1112-A___111111111111" > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
|
||||||
|
lvmdevices --adddev "$DEV1"
|
||||||
|
cat $DF
|
||||||
|
vgcreate $vg "$DEV1"
|
||||||
|
lvcreate -l1 -an $vg
|
||||||
|
cat $DF
|
||||||
|
# check wwid string in metadata output
|
||||||
|
pvs -o+deviceidtype,deviceid "$DEV1" |tee out
|
||||||
|
grep sys_wwid out
|
||||||
|
# the quote is removed after the 5
|
||||||
|
grep 2.5_SATA_SSD out
|
||||||
|
# check wwid string in system.devices
|
||||||
|
grep sys_wwid $DF
|
||||||
|
# the quote is removed after the 5
|
||||||
|
grep 2.5_SATA_SSD $DF
|
||||||
|
lvremove -y $vg
|
||||||
|
vgremove $vg
|
||||||
|
rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
|
||||||
|
cleanup_sysfs
|
||||||
|
|
||||||
# TODO: lvmdevices --adddev <dev> --deviceidtype <type> --deviceid <val>
|
# TODO: lvmdevices --adddev <dev> --deviceidtype <type> --deviceid <val>
|
||||||
# This would let the user specify the second naa wwid.
|
# This would let the user specify the second naa wwid.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user