summaryrefslogtreecommitdiff
path: root/drivers/virtio/virtio_pci_modern_dev.c
diff options
context:
space:
mode:
authorhuangjie.albert <huangjie.albert@bytedance.com>2022-06-17 05:04:11 +0300
committerMichael S. Tsirkin <mst@redhat.com>2022-06-24 09:49:48 +0300
commita7722890fdfb2aaeb6b02d68bb0f1e411e58d539 (patch)
tree5ddd1a6ac74b914e42fb4b8c4f9ab2b10cd546b6 /drivers/virtio/virtio_pci_modern_dev.c
parent0e0348ac3f0a6e6606f1aa5acb1803ada913aa3d (diff)
downloadlinux-a7722890fdfb2aaeb6b02d68bb0f1e411e58d539.tar.xz
virtio_ring : keep used_wrap_counter in vq->last_used_idx
the used_wrap_counter and the vq->last_used_idx may get out of sync if they are separate assignment,and interrupt might use an incorrect value to check for the used index. for example:OOB access ksoftirqd may consume the packet and it will call: virtnet_poll -->virtnet_receive -->virtqueue_get_buf_ctx -->virtqueue_get_buf_ctx_packed and in virtqueue_get_buf_ctx_packed: vq->last_used_idx += vq->packed.desc_state[id].num; if (unlikely(vq->last_used_idx >= vq->packed.vring.num)) { vq->last_used_idx -= vq->packed.vring.num; vq->packed.used_wrap_counter ^= 1; } if at the same time, there comes a vring interrupt,in vring_interrupt: we will call: vring_interrupt -->more_used -->more_used_packed -->is_used_desc_packed in is_used_desc_packed, the last_used_idx maybe >= vq->packed.vring.num. so this could case a memory out of bounds bug. this patch is to keep the used_wrap_counter in vq->last_used_idx so we can get the correct value to check for used index in interrupt. v3->v4: - use READ_ONCE/WRITE_ONCE to get/set vq->last_used_idx v2->v3: - add inline function to get used_wrap_counter and last_used - when use vq->last_used_idx, only read once if vq->last_used_idx is read twice, the values can be inconsistent. - use last_used_idx & ~(-(1 << VRING_PACKED_EVENT_F_WRAP_CTR)) to get the all bits below VRING_PACKED_EVENT_F_WRAP_CTR v1->v2: - reuse the VRING_PACKED_EVENT_F_WRAP_CTR - Remove parameter judgment in is_used_desc_packed, because it can't be illegal Signed-off-by: huangjie.albert <huangjie.albert@bytedance.com> Message-Id: <20220617020411.80367-1-huangjie.albert@bytedance.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'drivers/virtio/virtio_pci_modern_dev.c')
0 files changed, 0 insertions, 0 deletions