From: Michael Brown Date: Sun, 26 Mar 2017 08:21:14 +0000 (+0300) Subject: [scsi] Avoid duplicate call to scsicmd_close() on TEST UNIT READY failure X-Git-Tag: v1.20.1~241 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6bc4a8ac918b2dc5a460b3d2032055d8f7a478ff;p=thirdparty%2Fipxe.git [scsi] Avoid duplicate call to scsicmd_close() on TEST UNIT READY failure When the TEST UNIT READY command receives an error response, the shutdown of the command's block data interface will result in scsidev_ready() closing the SCSI device. This will subsequently result in a duplicate call to scsicmd_close(), leading to an assertion failure when list_del() is called for the second time. Fix by removing the command from the list of outstanding commands before shutting down the command's interfaces. Signed-off-by: Michael Brown --- diff --git a/src/drivers/block/scsi.c b/src/drivers/block/scsi.c index cb4bb94c4..d51b5cfa5 100644 --- a/src/drivers/block/scsi.c +++ b/src/drivers/block/scsi.c @@ -392,11 +392,13 @@ static void scsicmd_close ( struct scsi_command *scsicmd, int rc ) { scsidev, scsicmd->tag, strerror ( rc ) ); } + /* Remove from list of commands */ + list_del ( &scsicmd->list ); + /* Shut down interfaces */ intfs_shutdown ( rc, &scsicmd->scsi, &scsicmd->block, NULL ); - /* Remove from list of commands and drop list's reference */ - list_del ( &scsicmd->list ); + /* Drop list's reference */ scsicmd_put ( scsicmd ); }