• Sudhakar Panneerselvam's avatar
    scsi: target: Fix NULL pointer dereference · 9e95fb80
    Sudhakar Panneerselvam authored
    NULL pointer dereference happens when the following conditions are met:
    
    1) A SCSI command is received for a non-existing LU or cdb initialization
       fails in target_setup_cmd_from_cdb().
    
    2) Tracing is enabled.
    
    The following call sequences lead to NULL pointer dereference:
    
    1) iscsit_setup_scsi_cmd
         transport_lookup_cmd_lun <-- lookup fails.
              or
         target_setup_cmd_from_cdb() <-- cdb initialization fails
       iscsit_process_scsi_cmd
         iscsit_sequence_cmd
           transport_send_check_condition_and_sense
             trace_target_cmd_complete <-- NULL dereference
    
    2) target_submit_cmd_map_sgls
         transport_lookup_cmd_lun <-- lookup fails
              or
         target_setup_cmd_from_cdb() <-- cdb initialization fails
           transport_send_check_condition_and_sense
             trace_target_cmd_complete <-- NULL dereference
    
    In the above sequence, cmd->t_task_cdb is uninitialized which when
    referenced in trace_target_cmd_complete() causes NULL pointer dereference.
    
    The fix is to use the helper, target_cmd_init_cdb() and call it after
    transport_init_se_cmd() is called, so that cmd->t_task_cdb can be
    initialized and hence can be referenced in trace_target_cmd_complete().
    
    Link: https://lore.kernel.org/r/1591559913-8388-4-git-send-email-sudhakar.panneerselvam@oracle.comReviewed-by: default avatarMike Christie <michael.christie@oracle.com>
    Signed-off-by: default avatarSudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    9e95fb80
iscsi_target.c 126 KB