ref: ba7b07d51ad65d9a2d38e08799525c7716c77825
parent: 4f2cdcf74bddc52179e205ac98774c4a6d194ed0
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Sep 8 21:41:35 EDT 2018
devarch: restrict i/o port access to 64K, disallow msr 32-bit wrap arround (thanks aiju)
--- a/sys/src/9/pc/devarch.c
+++ b/sys/src/9/pc/devarch.c
@@ -309,8 +309,11 @@
}
static void
-checkport(int start, int end)
+checkport(uint start, uint end)
{
+ if(end < start || end > 0x10000)
+ error(Ebadarg);
+
/* standard vga regs are OK */
if(start >= 0x2b0 && end <= 0x2df+1)
return;
@@ -356,12 +359,12 @@
{
char buf[32], *p;
uint port, end;
- int i;
ushort *sp;
ulong *lp;
vlong *vp;
IOMap *m;
Rdwrfn *fn;
+ int i;
port = offset;
end = port+n;
@@ -394,6 +397,8 @@
case Qmsr:
if(n & 7)
error(Ebadarg);
+ if((uint)n/8 > -port)
+ error(Ebadarg);
end = port+(n/8);
for(vp = a; port < end; port++)
if(rdmsr(port, vp++) < 0)
@@ -464,6 +469,8 @@
case Qmsr:
if(n & 7)
+ error(Ebadarg);
+ if((uint)n/8 > -port)
error(Ebadarg);
end = port+(n/8);
for(vp = a; port < end; port++)