1*cdebaff8SEnji Cooper /* $NetBSD: t_compat.c,v 1.4 2016/11/12 15:12:59 kre Exp $ */ 257718be8SEnji Cooper 357718be8SEnji Cooper #include <sys/socket.h> 457718be8SEnji Cooper #include <sys/ioctl.h> 557718be8SEnji Cooper #include <net/if.h> 657718be8SEnji Cooper #include <netinet/in.h> 757718be8SEnji Cooper 857718be8SEnji Cooper #include <string.h> 957718be8SEnji Cooper #include <stdio.h> 1057718be8SEnji Cooper #include <stdlib.h> 1157718be8SEnji Cooper 1257718be8SEnji Cooper #include <rump/rump.h> 1357718be8SEnji Cooper #include <rump/rump_syscalls.h> 1457718be8SEnji Cooper 1557718be8SEnji Cooper #include "../config/netconfig.c" 1657718be8SEnji Cooper 1757718be8SEnji Cooper /* 1857718be8SEnji Cooper * Test for stack smashing in compat ioctl handling. Adapted as an 1957718be8SEnji Cooper * atf test from code provided by Onno van der Linden in PR kern/44054 2057718be8SEnji Cooper */ 2157718be8SEnji Cooper 2257718be8SEnji Cooper struct oifreq { 2357718be8SEnji Cooper char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 2457718be8SEnji Cooper union { 2557718be8SEnji Cooper struct sockaddr ifru_addr; 2657718be8SEnji Cooper struct sockaddr ifru_dstaddr; 2757718be8SEnji Cooper struct sockaddr ifru_broadaddr; 2857718be8SEnji Cooper short ifru_flags; 2957718be8SEnji Cooper int ifru_metric; 3057718be8SEnji Cooper int ifru_mtu; 3157718be8SEnji Cooper int ifru_dlt; 3257718be8SEnji Cooper u_int ifru_value; 3357718be8SEnji Cooper void * ifru_data; 3457718be8SEnji Cooper struct { 3557718be8SEnji Cooper uint32_t b_buflen; 3657718be8SEnji Cooper void *b_buf; 3757718be8SEnji Cooper } ifru_b; 3857718be8SEnji Cooper } ifr_ifru; 3957718be8SEnji Cooper }; 4057718be8SEnji Cooper #define OOSIOCGIFBRDADDR _IOWR('i', 18, struct oifreq) 4157718be8SEnji Cooper 4257718be8SEnji Cooper ATF_TC(OOSIOCGIFBRDADDR); 4357718be8SEnji Cooper ATF_TC_HEAD(OOSIOCGIFBRDADDR, tc) 4457718be8SEnji Cooper { 4557718be8SEnji Cooper 4657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks that OOSIOCGIFBRDADDR works " 4757718be8SEnji Cooper "(PR kern/44054)"); 4857718be8SEnji Cooper } 4957718be8SEnji Cooper 5057718be8SEnji Cooper ATF_TC_BODY(OOSIOCGIFBRDADDR, tc) 5157718be8SEnji Cooper { 5257718be8SEnji Cooper int fd, ifnum; 5357718be8SEnji Cooper struct oifreq ifreq; 5457718be8SEnji Cooper struct sockaddr_in *sin; 5557718be8SEnji Cooper int rv; 5657718be8SEnji Cooper 5757718be8SEnji Cooper memset(&ifreq,'\0',sizeof ifreq); 5857718be8SEnji Cooper 5957718be8SEnji Cooper rump_init(); 6057718be8SEnji Cooper 6157718be8SEnji Cooper /* create an interface and give it netmask 0xffff0000 */ 6257718be8SEnji Cooper rv = rump_pub_shmif_create("bus", &ifnum); 6357718be8SEnji Cooper if (rv) 6457718be8SEnji Cooper atf_tc_fail("failed to create shmif: %s", strerror(rv)); 6557718be8SEnji Cooper sprintf(ifreq.ifr_name, "shmif%d", ifnum); 6657718be8SEnji Cooper netcfg_rump_if(ifreq.ifr_name, "1.7.64.10", "255.255.0.0"); 6757718be8SEnji Cooper 68*cdebaff8SEnji Cooper atf_tc_expect_fail("PR kern/51610: rump does not include COMPAT_43"); 69*cdebaff8SEnji Cooper 7057718be8SEnji Cooper /* query kernel for iface bcast */ 7157718be8SEnji Cooper RL(fd = rump_sys_socket(AF_INET, SOCK_DGRAM, 0)); 7257718be8SEnji Cooper RL(rump_sys_ioctl(fd, OOSIOCGIFBRDADDR, &ifreq)); 7357718be8SEnji Cooper 7457718be8SEnji Cooper /* make sure we got what we deserve */ 7557718be8SEnji Cooper sin = (struct sockaddr_in *)&ifreq.ifr_broadaddr; 7657718be8SEnji Cooper ATF_REQUIRE_EQ(sin->sin_addr.s_addr, htonl(0x0107ffff)); 7757718be8SEnji Cooper rump_sys_close(fd); 7857718be8SEnji Cooper } 7957718be8SEnji Cooper 8057718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 8157718be8SEnji Cooper { 8257718be8SEnji Cooper 8357718be8SEnji Cooper ATF_TP_ADD_TC(tp, OOSIOCGIFBRDADDR); 8457718be8SEnji Cooper return atf_no_error(); 8557718be8SEnji Cooper } 86