]> Zhao Yanbai Git Server - minix.git/commitdiff
Disallow unaligned access to I/O ports.
authorPhilip Homburg <philip@cs.vu.nl>
Mon, 23 Apr 2007 13:31:45 +0000 (13:31 +0000)
committerPhilip Homburg <philip@cs.vu.nl>
Mon, 23 Apr 2007 13:31:45 +0000 (13:31 +0000)
kernel/system/do_vdevio.c

index 0d6e3c718b51a1b96b417afab9c5f1cc27a1039a..268d25baa59c2adbcf38037941e5b6181d4dd245 100644 (file)
@@ -119,22 +119,54 @@ register message *m_ptr;  /* pointer to request message */
                outb( pvb[i].port, pvb[i].value); 
       break; 
   case _DIO_WORD:                                        /* word values */
-      if (io_in) for (i=0; i<vec_size; i++)  
+      if (io_in)
+      {
+       for (i=0; i<vec_size; i++)  
+       {
+               port= pvw[i].port;
+               if (port & 1) goto bad;
                pvw[i].value = inw( pvw[i].port);  
-      else       for (i=0; i<vec_size; i++) 
+       }
+      }
+      else
+      {
+       for (i=0; i<vec_size; i++) 
+       {
+               port= pvw[i].port;
+               if (port & 1) goto bad;
                outw( pvw[i].port, pvw[i].value); 
+       }
+      }
       break; 
   default:                                               /* long values */
-      if (io_in) for (i=0; i<vec_size; i++)
-       pvl[i].value = inl(pvl[i].port);  
-      else       for (i=0; i<vec_size; i++)
+      if (io_in)
+      {
+       for (i=0; i<vec_size; i++)
+       {
+               port= pvl[i].port;
+               if (port & 3) goto bad;
+               pvl[i].value = inl(pvl[i].port);  
+       }
+      }
+      else
+      {
+       for (i=0; i<vec_size; i++)
+       {
+               port= pvl[i].port;
+               if (port & 3) goto bad;
                outl( pvb[i].port, pvl[i].value); 
+       }
+      }
   }
   unlock(13);
     
   /* Almost done, copy back results for input requests. */
   if (io_in) phys_copy(vir2phys(vdevio_buf), caller_phys, (phys_bytes) bytes);
   return(OK);
+
+bad:
+       panic("do_vdevio: unaligned port\n", port);
+       return EPERM;
 }
 
 #endif /* USE_VDEVIO */