|
@@ -207,6 +207,15 @@ int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd,
|
|
|
*/
|
|
|
blk_execute_rq(req->q, NULL, req, 1);
|
|
|
|
|
|
+ /*
|
|
|
+ * Some devices (USB mass-storage in particular) may transfer
|
|
|
+ * garbage data together with a residue indicating that the data
|
|
|
+ * is invalid. Prevent the garbage from being misinterpreted
|
|
|
+ * and prevent security leaks by zeroing out the excess data.
|
|
|
+ */
|
|
|
+ if (unlikely(req->data_len > 0 && req->data_len <= bufflen))
|
|
|
+ memset(buffer + (bufflen - req->data_len), 0, req->data_len);
|
|
|
+
|
|
|
ret = req->errors;
|
|
|
out:
|
|
|
blk_put_request(req);
|