From e5339f347a0470ad6a8e521e7e07e115cc1b7809 Mon Sep 17 00:00:00 2001 From: Utkarsh Mani Tripathi Date: Mon, 18 Nov 2019 15:56:34 +0530 Subject: [PATCH] Add nil pointer check for InSDBBuffer - Gotgt was crashing for few opcodes (sg_inq (sg3-utils)) because InSDBBuffer was not initialized for such opcodes (Need help) Signed-off-by: Utkarsh Mani Tripathi --- pkg/scsi/sbc.go | 8 +++++-- pkg/scsi/scsi.go | 2 +- pkg/scsi/spc.go | 60 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/pkg/scsi/sbc.go b/pkg/scsi/sbc.go index 627234c..1cb2c78 100644 --- a/pkg/scsi/sbc.go +++ b/pkg/scsi/sbc.go @@ -533,7 +533,9 @@ overflow: cmd.InSDBBuffer.Resid = 8 return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, key, asc) return api.SAMStatCheckCondition } @@ -679,7 +681,9 @@ func SBCGetLbaStatus(host int, cmd *api.SCSICommand) api.SAMStat { } return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, key, asc) return api.SAMStatCheckCondition } diff --git a/pkg/scsi/scsi.go b/pkg/scsi/scsi.go index 119bfa6..4e52e8e 100644 --- a/pkg/scsi/scsi.go +++ b/pkg/scsi/scsi.go @@ -96,7 +96,7 @@ func (s *SCSITargetService) AddCommandQueue(tid int, scmd *api.SCSICommand) erro result := scmd.Device.PerformCommand(tid, scmd) if result != api.SAMStatGood { scmd.Result = result.Stat - log.Warnf("%v", result.Err) + log.Warnf("opcode: %xh err: %v", scmd.OpCode, result.Err) } return nil } diff --git a/pkg/scsi/spc.go b/pkg/scsi/spc.go index 942ce74..1f3a5cc 100644 --- a/pkg/scsi/spc.go +++ b/pkg/scsi/spc.go @@ -454,7 +454,9 @@ func SPCReportLuns(host int, cmd *api.SCSICommand) api.SAMStat { copy(cmd.InSDBBuffer.Buffer, buf.Bytes()) return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition } @@ -467,7 +469,9 @@ func SPCStartStop(host int, cmd *api.SCSICommand) api.SAMStat { return api.SAMStatReservationConflict } - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } scb := cmd.SCB pwrcnd = scb[4] & 0xf0 if pwrcnd != 0 { @@ -662,7 +666,9 @@ func SPCSendDiagnostics(host int, cmd *api.SCSICommand) api.SAMStat { return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition } @@ -748,7 +754,9 @@ func SPCReportSupportedOperationCodes(host int, cmd *api.SCSICommand) api.SAMSta return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition } @@ -764,7 +772,9 @@ func SPCServiceAction(host int, cmd *api.SCSICommand) api.SAMStat { fnop := serviceAction.(*SCSIServiceAction) return fnop.CommandPerformFunc(host, cmd) } - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition } @@ -797,7 +807,9 @@ func SPCPRReadKeys(host int, cmd *api.SCSICommand) api.SAMStat { cmd.InSDBBuffer.Resid = uint32(additionLength) return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition } @@ -853,7 +865,9 @@ func SPCPRReadReservation(host int, cmd *api.SCSICommand) api.SAMStat { return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition } @@ -891,7 +905,9 @@ func SPCPRReportCapabilities(host int, cmd *api.SCSICommand) api.SAMStat { cmd.InSDBBuffer.Resid = uint32(actualLength) return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition } @@ -970,7 +986,9 @@ func SPCPRRegister(host int, cmd *api.SCSICommand) api.SAMStat { return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition } @@ -1032,7 +1050,9 @@ func SPCPRReserve(host int, cmd *api.SCSICommand) api.SAMStat { scsiResOp.Save(tgtName, devUUID) return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition } @@ -1082,7 +1102,9 @@ func SPCPRRelease(host int, cmd *api.SCSICommand) api.SAMStat { } if curRes.Scope != resScope || curRes.Type != resType { - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_RELEASE_OF_PERSISTENT_RESERVATION) return api.SAMStatCheckCondition } @@ -1113,7 +1135,9 @@ func SPCPRRelease(host int, cmd *api.SCSICommand) api.SAMStat { scsiResOp.Save(tgtName, devUUID) return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition } @@ -1167,7 +1191,9 @@ func SPCPRClear(host int, cmd *api.SCSICommand) api.SAMStat { scsiResOp.Save(tgtName, devUUID) return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition } @@ -1267,7 +1293,9 @@ func SPCPRPreempt(host int, cmd *api.SCSICommand) api.SAMStat { scsiResOp.Save(tgtName, devUUID) return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition } @@ -1353,7 +1381,9 @@ found: scsiResOp.Save(tgtName, devUUID) return api.SAMStatGood sense: - cmd.InSDBBuffer.Resid = 0 + if cmd.InSDBBuffer != nil { + cmd.InSDBBuffer.Resid = 0 + } BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CDB) return api.SAMStatCheckCondition }