Skip to contentSkip to conversation

PATCH: 2.6.7-rc3 drivers/scsi/megaraid.c: user/kernel pointer bugs

PATCH Robert T. Johnson 2 participants 2 messages Jun 9, 2004 – Jun 10, 2004

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Since arg is a user pointer, so are uioc_mimd and uiocp, and hence umc is a user pointer. Thus reading umc->xferaddr requires dereferencing a user pointer, which isn't safe. Let me know if you have any questions or I've made an error.

Best,
Rob

drivers/scsi/megaraid.c renamed from drivers/scsi/megaraid.c.orig +4 -2
@@ -3815,7 +3815,8 @@ mega_n_to_m(void *arg, megacmd_t *mc)
 
 			umc = MBOX_P(uiocp);
 
-			upthru = (mega_passthru *)umc->xferaddr;
+			if (get_user(upthru, (mega_passthru **)&umc->xferaddr))
+				return (-EFAULT);
 
 			if( put_user(mc->status, (u8 *)&upthru->scsistatus) )
 				return (-EFAULT);
@@ -3831,7 +3832,8 @@ mega_n_to_m(void *arg, megacmd_t *mc)
 
 			umc = (megacmd_t *)uioc_mimd->mbox;
 
-			upthru = (mega_passthru *)umc->xferaddr;
+			if (get_user(upthru, (mega_passthru **)&umc->xferaddr))
+				return (-EFAULT);
 
 			if( put_user(mc->status, (u8 *)&upthru->scsistatus) )
 				return (-EFAULT);
#1 lore raw
Quoted 4 lines · Robert T. Johnson

Since arg is a user pointer, so are uioc_mimd and uiocp, and hence umc is a user pointer. Thus reading umc->xferaddr requires dereferencing a user pointer, which isn't safe. Let me know if you have any questions or I've made an error.

ACK.