mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
xen/scsifront: check for a NULL shadow entry on a backend response
scsifront_do_response() validates the rqid in a backend response against
VSCSIIF_MAX_REQS before using it to index info->shadow[], but then
dereferences the entry to test ->inflight without checking that the slot
is populated. Shadow slots are NULL before a command is submitted (the
host private area is zeroed at allocation) and are reset to NULL in
_scsifront_put_rqid() once a request completes, so an in-range rqid that
does not correspond to an outstanding request makes the frontend
dereference a NULL pointer.
A malicious or buggy backend can thus crash the guest by returning a
response whose rqid is in range but not in flight -- for example a
spurious response before any command has been issued, or a duplicate of
one already completed. The ring has only VSCSIIF_MAX_REQS (16) slots, so
before the first command every in-range rqid selects a NULL slot.
Reject a response whose shadow slot is not populated.
Fixes: 6d1c2f48f3 ("xen/scsifront: harden driver against malicious backend")
Cc: stable@vger.kernel.org
Signed-off-by: Yehyeong Lee <yhlee@isslab.korea.ac.kr>
Reviewed-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Message-ID: <20261005123555.253995-1-yhlee@isslab.korea.ac.kr>
This commit is contained in:
parent
71d59fc2a5
commit
992df081bc
|
|
@ -367,6 +367,7 @@ static void scsifront_do_response(struct vscsifrnt_info *info,
|
|||
struct vscsifrnt_shadow *shadow;
|
||||
|
||||
if (ring_rsp->rqid >= VSCSIIF_MAX_REQS ||
|
||||
!info->shadow[ring_rsp->rqid] ||
|
||||
!info->shadow[ring_rsp->rqid]->inflight) {
|
||||
scsifront_set_error(info, "illegal rqid returned by backend!");
|
||||
return;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user