提交 8ef562d1 编写于 作者: R Rusty Russell

lguest: fix descriptor corruption in example launcher

1d589bb1 "Add serial number support
for virtio_blk, V4a" extended 'struct virtio_blk_config' to 536 bytes.
Lguest and S/390 both use an 8 bit value for the feature length, and
this change broke them (if the code is naive).
Signed-off-by: NRusty Russell <rusty@rustcorp.com.au>
Cc: John Cooper <john.cooper@redhat.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
上级 f2945262
...@@ -1105,6 +1105,9 @@ static void set_config(struct device *dev, unsigned len, const void *conf) ...@@ -1105,6 +1105,9 @@ static void set_config(struct device *dev, unsigned len, const void *conf)
/* Copy in the config information, and store the length. */ /* Copy in the config information, and store the length. */
memcpy(device_config(dev), conf, len); memcpy(device_config(dev), conf, len);
dev->desc->config_len = len; dev->desc->config_len = len;
/* Size must fit in config_len field (8 bits)! */
assert(dev->desc->config_len == len);
} }
/* This routine does all the creation and setup of a new device, including /* This routine does all the creation and setup of a new device, including
...@@ -1515,7 +1518,8 @@ static void setup_block_file(const char *filename) ...@@ -1515,7 +1518,8 @@ static void setup_block_file(const char *filename)
add_feature(dev, VIRTIO_BLK_F_SEG_MAX); add_feature(dev, VIRTIO_BLK_F_SEG_MAX);
conf.seg_max = cpu_to_le32(VIRTQUEUE_NUM - 2); conf.seg_max = cpu_to_le32(VIRTQUEUE_NUM - 2);
set_config(dev, sizeof(conf), &conf); /* Don't try to put whole struct: we have 8 bit limit. */
set_config(dev, offsetof(struct virtio_blk_config, geometry), &conf);
verbose("device %u: virtblock %llu sectors\n", verbose("device %u: virtblock %llu sectors\n",
++devices.device_num, le64_to_cpu(conf.capacity)); ++devices.device_num, le64_to_cpu(conf.capacity));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册