Hi,
By passing invalid rtm_flags and rtm_addrs values in the routing
message, I can crash the kernel from user land.
login: uvm_fault(0xfffffe800554b388, 0x4, 0, 1) -> e
fatal page fault in supervisor mode
trap type 6 code 0 rip ffffffff812312d7 cs 8 rflags 246 cr2 4 cpl 5 rsp
ffff8000039de8a0
panic: trap type 6, code=0, pc=ffffffff812312d7
Starting stack trace...
panic() at panic+0xfb
trap() at trap+0x710
--- trap (number 6) ---
arp_rtrequest() at arp_rtrequest+0xc7
rtrequest1() at rtrequest1+0x56d
route_output() at route_output+0x815
raw_usrreq() at raw_usrreq+0x227
route_usrreq() at route_usrreq+0x6e
sosend() at sosend+0x466
dofilewritev() at dofilewritev+0x18b
sys_write() at sys_write+0x8f
syscall() at syscall+0x162
--- syscall (number 4) ---
end of kernel
end trace frame: 0x8439e0, count: 246
acpi_pdirpa+0x400a0a:
End of stack trace.
This diff prevents the crash.
ok?
bluhm
Index: netinet/if_ether.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/if_ether.c,v
retrieving revision 1.107
diff -u -p -u -p -r1.107 if_ether.c
--- netinet/if_ether.c 3 Sep 2013 10:25:32 -0000 1.107
+++ netinet/if_ether.c 14 Oct 2013 13:09:40 -0000
@@ -191,7 +191,7 @@ arp_rtrequest(int req, struct rtentry *r
* such as older version of routed or gated might provide,
* restore cloning bit.
*/
- if ((rt->rt_flags & RTF_HOST) == 0 &&
+ if ((rt->rt_flags & RTF_HOST) == 0 && rt_mask(rt) &&
satosin(rt_mask(rt))->sin_addr.s_addr != 0xffffffff)
rt->rt_flags |= RTF_CLONING;
if (rt->rt_flags & RTF_CLONING) {