6893171 Errors with USCSI preventing users from accessing cdda2wav
authorandrew.rutz@sun.com
Sat, 30 Jan 2010 11:41:05 -0500
changeset 11598 e9303ae80b5d
parent 11597 02f4d1c6900b
child 11599 dd472370bf36
6893171 Errors with USCSI preventing users from accessing cdda2wav
usr/src/uts/common/io/sata/impl/sata.c
--- a/usr/src/uts/common/io/sata/impl/sata.c	Fri Jan 29 15:25:00 2010 -0800
+++ b/usr/src/uts/common/io/sata/impl/sata.c	Sat Jan 30 11:41:05 2010 -0500
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -8603,11 +8603,32 @@
 	 */
 
 	/* Check the size of cdb */
-	cdblen = scsi_cdb_size[GETGROUP(cdbp)];
-	if (cdblen > sdinfo->satadrv_atapi_cdb_len) {
+
+	switch (GETGROUP(cdbp)) {
+	case CDB_GROUPID_3:   /* Reserved, per SPC-4 */
+		/*
+		 * opcodes 0x7e and 0x7f identify variable-length CDBs and
+		 * therefore require special handling.  Return failure, for now.
+		 */
+		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
+		return (TRAN_BADPKT);
+
+	case CDB_GROUPID_6:   /* Vendor-specific, per SPC-4 */
+	case CDB_GROUPID_7:   /* Vendor-specific, per SPC-4 */
+		/* obtain length from the scsi_pkt */
+		cdblen = scsipkt->pkt_cdblen;
+		break;
+
+	default:
+		/* CDB's length is statically known, per SPC-4 */
+		cdblen = scsi_cdb_size[GETGROUP(cdbp)];
+		break;
+	}
+
+	if (cdblen <= 0 || cdblen > sdinfo->satadrv_atapi_cdb_len) {
 		sata_log(NULL, CE_WARN,
 		    "sata: invalid ATAPI cdb length %d",
-		    scsipkt->pkt_cdblen);
+		    cdblen);
 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
 		return (TRAN_BADPKT);
 	}