mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 15:11:31 +00:00
nvme-pci: fix out of bounds access in nvme_cqe_pending
There is an out of bounds array access in nvme_cqe_peding(). When enable irq_thread for nvme interrupt, there is racing between the nvmeq->cq_head updating and reading. nvmeq->cq_head is updated in nvme_update_cq_head(), if nvmeq->cq_head equals nvmeq->q_depth and before its value set to zero, nvme_cqe_pending() uses its value as an array index, the index will be out of bounds. Signed-off-by: Hongbo Yao <yaohongbo@huawei.com> [hch: slight coding style update] Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
8fae268b40
commit
dcca166272
@ -1020,9 +1020,11 @@ static void nvme_complete_cqes(struct nvme_queue *nvmeq, u16 start, u16 end)
|
|||||||
|
|
||||||
static inline void nvme_update_cq_head(struct nvme_queue *nvmeq)
|
static inline void nvme_update_cq_head(struct nvme_queue *nvmeq)
|
||||||
{
|
{
|
||||||
if (++nvmeq->cq_head == nvmeq->q_depth) {
|
if (nvmeq->cq_head == nvmeq->q_depth - 1) {
|
||||||
nvmeq->cq_head = 0;
|
nvmeq->cq_head = 0;
|
||||||
nvmeq->cq_phase = !nvmeq->cq_phase;
|
nvmeq->cq_phase = !nvmeq->cq_phase;
|
||||||
|
} else {
|
||||||
|
nvmeq->cq_head++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user