aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2018-05-21 14:21:14 -0400
committerJens Axboe <axboe@kernel.dk>2018-05-21 14:21:14 -0400
commitf7068114d45ec55996b9040e98111afa56e010fe (patch)
tree32c53bcae79c32537ffe622d7654d69f60ebd6f7
parent1c1a2ee1b53b006754073eefc65d2b2cedb5264b (diff)
sr: pass down correctly sized SCSI sense buffer
We're casting the CDROM layer request_sense to the SCSI sense buffer, but the former is 64 bytes and the latter is 96 bytes. As we generally allocate these on the stack, we end up blowing up the stack. Fix this by wrapping the scsi_execute() call with a properly sized sense buffer, and copying back the bits for the CDROM layer. Cc: stable@vger.kernel.org Reported-by: Piotr Gabriel Kosinski <pg.kosinski@gmail.com> Reported-by: Daniel Shapira <daniel@twistlock.com> Tested-by: Kees Cook <keescook@chromium.org> Fixes: 82ed4db499b8 ("block: split scsi_request out of struct request") Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--drivers/scsi/sr_ioctl.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/scsi/sr_ioctl.c b/drivers/scsi/sr_ioctl.c
index 2a21f2d48592..35fab1e18adc 100644
--- a/drivers/scsi/sr_ioctl.c
+++ b/drivers/scsi/sr_ioctl.c
@@ -188,9 +188,13 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
188 struct scsi_device *SDev; 188 struct scsi_device *SDev;
189 struct scsi_sense_hdr sshdr; 189 struct scsi_sense_hdr sshdr;
190 int result, err = 0, retries = 0; 190 int result, err = 0, retries = 0;
191 unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE], *senseptr = NULL;
191 192
192 SDev = cd->device; 193 SDev = cd->device;
193 194
195 if (cgc->sense)
196 senseptr = sense_buffer;
197
194 retry: 198 retry:
195 if (!scsi_block_when_processing_errors(SDev)) { 199 if (!scsi_block_when_processing_errors(SDev)) {
196 err = -ENODEV; 200 err = -ENODEV;
@@ -198,10 +202,12 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
198 } 202 }
199 203
200 result = scsi_execute(SDev, cgc->cmd, cgc->data_direction, 204 result = scsi_execute(SDev, cgc->cmd, cgc->data_direction,
201 cgc->buffer, cgc->buflen, 205 cgc->buffer, cgc->buflen, senseptr, &sshdr,
202 (unsigned char *)cgc->sense, &sshdr,
203 cgc->timeout, IOCTL_RETRIES, 0, 0, NULL); 206 cgc->timeout, IOCTL_RETRIES, 0, 0, NULL);
204 207
208 if (cgc->sense)
209 memcpy(cgc->sense, sense_buffer, sizeof(*cgc->sense));
210
205 /* Minimal error checking. Ignore cases we know about, and report the rest. */ 211 /* Minimal error checking. Ignore cases we know about, and report the rest. */
206 if (driver_byte(result) != 0) { 212 if (driver_byte(result) != 0) {
207 switch (sshdr.sense_key) { 213 switch (sshdr.sense_key) {