[168] in linux-scsi channel archive

home help back first fref pref prev next nref lref last post

sr_ioctl and scsi_ioctl flaws

daemon@ATHENA.MIT.EDU (Heiko Eissfeldt)
Sun May 14 10:32:33 1995

From: heiko@colossus.escape.de (Heiko Eissfeldt)
To: linux-scsi@vger.rutgers.edu
Date: Sun, 14 May 1995 11:48:55 +0200 (MET DST)
Cc: eric@aib.com, drew@COLORADO.Edu

Hi Drew, Eric and Linux users,

I checked the scsi code for verify_area return value checking and
found those lines:
--- scsi_ioctl.c_org	Sun May 14 11:16:36 1995
+++ scsi_ioctl.c	Sun May 14 11:19:36 1995
@@ -42,8 +42,8 @@
 		  slen = strlen(string);
 		  if (len > slen)
 		    len = slen + 1;
-		  verify_area(VERIFY_WRITE, buffer, len);
-		  memcpy_tofs (buffer, string, len);
+		  if (!verify_area(VERIFY_WRITE, buffer, len))
+		    memcpy_tofs (buffer, string, len);
 		}
 	}
 	return temp;
@@ -241,6 +241,7 @@
 */
 int scsi_ioctl (Scsi_Device *dev, int cmd, void *arg)
 {
+	int err;
         char scsi_cmd[12];

 	/* No idea how this happens.... */
@@ -248,10 +249,10 @@
 	
 	switch (cmd) {
 	        case SCSI_IOCTL_GET_IDLUN:
-	                verify_area(VERIFY_WRITE, (void *) arg, sizeof(int));
-			put_fs_long(dev->id + (dev->lun << 8) + 
+	                err = verify_area(VERIFY_WRITE, (void *) arg, sizeof(int));
+			if (!err) put_fs_long(dev->id + (dev->lun << 8) + 
 				    (dev->host->host_no << 16), (unsigned long *) arg);
-			return 0;
+			return err;
 		case SCSI_IOCTL_TAGGED_ENABLE:
 			if(!suser())  return -EACCES;
 			if(!dev->tagged_supported) return -EINVAL;

--- sr_ioctl.c_org	Sun May 14 11:16:24 1995
+++ sr_ioctl.c	Sun May 14 11:21:53 1995
@@ -206,7 +206,9 @@
 			struct cdrom_tocentry tocentry;
 			char * buffer;

-			verify_area (VERIFY_READ, (void *) arg, sizeof (struct cdrom_tocentry));
+			err = verify_area (VERIFY_READ, (void *) arg, sizeof (struct cdrom_tocentry));
+			if (err)
+				return err;
 			memcpy_fromfs (&tocentry, (void *) arg, sizeof (struct cdrom_tocentry));

 			sr_cmd[0] = SCMD_READ_TOC;
@@ -278,7 +280,9 @@
 			  char * buffer, * mask;
 			  struct cdrom_volctrl volctrl;

-			  verify_area (VERIFY_READ, (void *) arg, sizeof (struct cdrom_volctrl));
+			  err = verify_area (VERIFY_READ, (void *) arg, sizeof (struct cdrom_volctrl));
+			  if (err)
+				return err;
 			  memcpy_fromfs (&volctrl, (void *) arg, sizeof (struct cdrom_volctrl));

 			  /* First we get the current params so we can just twiddle the volume */

Cheers, Heiko



home help back first fref pref prev next nref lref last post