@@ -663,18 +663,14 @@ sg_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
663
663
* is a non-zero input_size, so emit a warning.
664
664
*/
665
665
if (hp -> dxfer_direction == SG_DXFER_TO_FROM_DEV ) {
666
- static char cmd [TASK_COMM_LEN ];
667
- if (strcmp (current -> comm , cmd )) {
668
- printk_ratelimited (KERN_WARNING
669
- "sg_write: data in/out %d/%d bytes "
670
- "for SCSI command 0x%x-- guessing "
671
- "data in;\n program %s not setting "
672
- "count and/or reply_len properly\n" ,
673
- old_hdr .reply_len - (int )SZ_SG_HEADER ,
674
- input_size , (unsigned int ) cmnd [0 ],
675
- current -> comm );
676
- strcpy (cmd , current -> comm );
677
- }
666
+ printk_ratelimited (KERN_WARNING
667
+ "sg_write: data in/out %d/%d bytes "
668
+ "for SCSI command 0x%x-- guessing "
669
+ "data in;\n program %s not setting "
670
+ "count and/or reply_len properly\n" ,
671
+ old_hdr .reply_len - (int )SZ_SG_HEADER ,
672
+ input_size , (unsigned int ) cmnd [0 ],
673
+ current -> comm );
678
674
}
679
675
k = sg_common_write (sfp , srp , cmnd , sfp -> timeout , blocking );
680
676
return (k < 0 ) ? k : count ;
@@ -753,6 +749,29 @@ sg_new_write(Sg_fd *sfp, struct file *file, const char __user *buf,
753
749
return count ;
754
750
}
755
751
752
+ static bool sg_is_valid_dxfer (sg_io_hdr_t * hp )
753
+ {
754
+ switch (hp -> dxfer_direction ) {
755
+ case SG_DXFER_NONE :
756
+ if (hp -> dxferp || hp -> dxfer_len > 0 )
757
+ return false;
758
+ return true;
759
+ case SG_DXFER_TO_DEV :
760
+ case SG_DXFER_FROM_DEV :
761
+ case SG_DXFER_TO_FROM_DEV :
762
+ if (!hp -> dxferp || hp -> dxfer_len == 0 )
763
+ return false;
764
+ return true;
765
+ case SG_DXFER_UNKNOWN :
766
+ if ((!hp -> dxferp && hp -> dxfer_len ) ||
767
+ (hp -> dxferp && hp -> dxfer_len == 0 ))
768
+ return false;
769
+ return true;
770
+ default :
771
+ return false;
772
+ }
773
+ }
774
+
756
775
static int
757
776
sg_common_write (Sg_fd * sfp , Sg_request * srp ,
758
777
unsigned char * cmnd , int timeout , int blocking )
@@ -773,6 +792,9 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp,
773
792
"sg_common_write: scsi opcode=0x%02x, cmd_size=%d\n" ,
774
793
(int ) cmnd [0 ], (int ) hp -> cmd_len ));
775
794
795
+ if (!sg_is_valid_dxfer (hp ))
796
+ return - EINVAL ;
797
+
776
798
k = sg_start_req (srp , cmnd );
777
799
if (k ) {
778
800
SCSI_LOG_TIMEOUT (1 , sg_printk (KERN_INFO , sfp -> parentdp ,
0 commit comments