libata: have ata_scsi_rw_xlat() fail invalid passthrough requests
commitb853d7cbd238400d4e6f8767e839c14ed7a06a45
authorJens Axboe <axboe@kernel.dk>
Wed, 7 Aug 2019 18:20:52 +0000 (7 12:20 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 Aug 2019 06:26:41 +0000 (29 08:26 +0200)
tree6c423911cbb0ff36a0ed3a0fb2942477b371cddb
parent9e47a7963485c636a0e75b192c898d72d16bac38
libata: have ata_scsi_rw_xlat() fail invalid passthrough requests

[ Upstream commit 2d7271501720038381d45fb3dcbe4831228fc8cc ]

For passthrough requests, libata-scsi takes what the user passes in
as gospel. This can be problematic if the user fills in the CDB
incorrectly. One example of that is in request sizes. For read/write
commands, the CDB contains fields describing the transfer length of
the request. These should match with the SG_IO header fields, but
libata-scsi currently does no validation of that.

Check that the number of blocks in the CDB for passthrough requests
matches what was mapped into the request. If the CDB asks for more
data then the validated SG_IO header fields, error it.

Reported-by: Krishna Ram Prakash R <krp@gtux.in>
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/ata/libata-scsi.c