1313680Sngie/* $NetBSD: t_compat.c,v 1.4 2016/11/12 15:12:59 kre Exp $ */ 2272343Sngie 3272343Sngie#include <sys/socket.h> 4272343Sngie#include <sys/ioctl.h> 5272343Sngie#include <net/if.h> 6272343Sngie#include <netinet/in.h> 7272343Sngie 8272343Sngie#include <string.h> 9272343Sngie#include <stdio.h> 10272343Sngie#include <stdlib.h> 11272343Sngie 12272343Sngie#include <rump/rump.h> 13272343Sngie#include <rump/rump_syscalls.h> 14272343Sngie 15272343Sngie#include "../config/netconfig.c" 16272343Sngie 17272343Sngie/* 18272343Sngie * Test for stack smashing in compat ioctl handling. Adapted as an 19272343Sngie * atf test from code provided by Onno van der Linden in PR kern/44054 20272343Sngie */ 21272343Sngie 22272343Sngiestruct oifreq { 23272343Sngie char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 24272343Sngie union { 25272343Sngie struct sockaddr ifru_addr; 26272343Sngie struct sockaddr ifru_dstaddr; 27272343Sngie struct sockaddr ifru_broadaddr; 28272343Sngie short ifru_flags; 29272343Sngie int ifru_metric; 30272343Sngie int ifru_mtu; 31272343Sngie int ifru_dlt; 32272343Sngie u_int ifru_value; 33272343Sngie void * ifru_data; 34272343Sngie struct { 35272343Sngie uint32_t b_buflen; 36272343Sngie void *b_buf; 37272343Sngie } ifru_b; 38272343Sngie } ifr_ifru; 39272343Sngie}; 40272343Sngie#define OOSIOCGIFBRDADDR _IOWR('i', 18, struct oifreq) 41272343Sngie 42272343SngieATF_TC(OOSIOCGIFBRDADDR); 43272343SngieATF_TC_HEAD(OOSIOCGIFBRDADDR, tc) 44272343Sngie{ 45272343Sngie 46272343Sngie atf_tc_set_md_var(tc, "descr", "Checks that OOSIOCGIFBRDADDR works " 47272343Sngie "(PR kern/44054)"); 48272343Sngie} 49272343Sngie 50272343SngieATF_TC_BODY(OOSIOCGIFBRDADDR, tc) 51272343Sngie{ 52272343Sngie int fd, ifnum; 53272343Sngie struct oifreq ifreq; 54272343Sngie struct sockaddr_in *sin; 55272343Sngie int rv; 56272343Sngie 57272343Sngie memset(&ifreq,'\0',sizeof ifreq); 58272343Sngie 59272343Sngie rump_init(); 60272343Sngie 61272343Sngie /* create an interface and give it netmask 0xffff0000 */ 62272343Sngie rv = rump_pub_shmif_create("bus", &ifnum); 63272343Sngie if (rv) 64272343Sngie atf_tc_fail("failed to create shmif: %s", strerror(rv)); 65272343Sngie sprintf(ifreq.ifr_name, "shmif%d", ifnum); 66272343Sngie netcfg_rump_if(ifreq.ifr_name, "1.7.64.10", "255.255.0.0"); 67272343Sngie 68313680Sngie atf_tc_expect_fail("PR kern/51610: rump does not include COMPAT_43"); 69313680Sngie 70272343Sngie /* query kernel for iface bcast */ 71272343Sngie RL(fd = rump_sys_socket(AF_INET, SOCK_DGRAM, 0)); 72272343Sngie RL(rump_sys_ioctl(fd, OOSIOCGIFBRDADDR, &ifreq)); 73272343Sngie 74272343Sngie /* make sure we got what we deserve */ 75272343Sngie sin = (struct sockaddr_in *)&ifreq.ifr_broadaddr; 76272343Sngie ATF_REQUIRE_EQ(sin->sin_addr.s_addr, htonl(0x0107ffff)); 77272343Sngie rump_sys_close(fd); 78272343Sngie} 79272343Sngie 80272343SngieATF_TP_ADD_TCS(tp) 81272343Sngie{ 82272343Sngie 83272343Sngie ATF_TP_ADD_TC(tp, OOSIOCGIFBRDADDR); 84272343Sngie return atf_no_error(); 85272343Sngie} 86