10cadf2f4SJacques Vidrine /* 20cadf2f4SJacques Vidrine * Copyright (c) 2002 Kungliga Tekniska H�gskolan 30cadf2f4SJacques Vidrine * (Royal Institute of Technology, Stockholm, Sweden). 40cadf2f4SJacques Vidrine * All rights reserved. 50cadf2f4SJacques Vidrine * 60cadf2f4SJacques Vidrine * Redistribution and use in source and binary forms, with or without 70cadf2f4SJacques Vidrine * modification, are permitted provided that the following conditions 80cadf2f4SJacques Vidrine * are met: 90cadf2f4SJacques Vidrine * 100cadf2f4SJacques Vidrine * 1. Redistributions of source code must retain the above copyright 110cadf2f4SJacques Vidrine * notice, this list of conditions and the following disclaimer. 120cadf2f4SJacques Vidrine * 130cadf2f4SJacques Vidrine * 2. Redistributions in binary form must reproduce the above copyright 140cadf2f4SJacques Vidrine * notice, this list of conditions and the following disclaimer in the 150cadf2f4SJacques Vidrine * documentation and/or other materials provided with the distribution. 160cadf2f4SJacques Vidrine * 170cadf2f4SJacques Vidrine * 3. Neither the name of the Institute nor the names of its contributors 180cadf2f4SJacques Vidrine * may be used to endorse or promote products derived from this software 190cadf2f4SJacques Vidrine * without specific prior written permission. 200cadf2f4SJacques Vidrine * 210cadf2f4SJacques Vidrine * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 220cadf2f4SJacques Vidrine * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 230cadf2f4SJacques Vidrine * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 240cadf2f4SJacques Vidrine * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 250cadf2f4SJacques Vidrine * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 260cadf2f4SJacques Vidrine * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 270cadf2f4SJacques Vidrine * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 280cadf2f4SJacques Vidrine * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 290cadf2f4SJacques Vidrine * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 300cadf2f4SJacques Vidrine * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 310cadf2f4SJacques Vidrine * SUCH DAMAGE. 320cadf2f4SJacques Vidrine */ 330cadf2f4SJacques Vidrine 340cadf2f4SJacques Vidrine #ifdef HAVE_CONFIG_H 350cadf2f4SJacques Vidrine #include <config.h> 360cadf2f4SJacques Vidrine RCSID("$Id: parse_reply-test.c,v 1.2 2002/09/04 03:25:06 assar Exp $"); 370cadf2f4SJacques Vidrine #endif 380cadf2f4SJacques Vidrine 390cadf2f4SJacques Vidrine #include <sys/types.h> 400cadf2f4SJacques Vidrine #ifdef HAVE_SYS_MMAN_H 410cadf2f4SJacques Vidrine #include <sys/mman.h> 420cadf2f4SJacques Vidrine #endif 430cadf2f4SJacques Vidrine #include <fcntl.h> 440cadf2f4SJacques Vidrine 450cadf2f4SJacques Vidrine #include "roken.h" 460cadf2f4SJacques Vidrine #include "resolve.h" 470cadf2f4SJacques Vidrine 480cadf2f4SJacques Vidrine struct dns_reply* 490cadf2f4SJacques Vidrine parse_reply(const unsigned char *, size_t); 500cadf2f4SJacques Vidrine 510cadf2f4SJacques Vidrine enum { MAX_BUF = 36}; 520cadf2f4SJacques Vidrine 530cadf2f4SJacques Vidrine static struct testcase { 540cadf2f4SJacques Vidrine unsigned char buf[MAX_BUF]; 550cadf2f4SJacques Vidrine size_t buf_len; 560cadf2f4SJacques Vidrine } tests[] = { 570cadf2f4SJacques Vidrine {{0x12, 0x67, 0x84, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 580cadf2f4SJacques Vidrine 0x03, 'f', 'o', 'o', 0x00, 590cadf2f4SJacques Vidrine 0x00, 0x10, 0x00, 0x01, 600cadf2f4SJacques Vidrine 0x03, 'f', 'o', 'o', 0x00, 610cadf2f4SJacques Vidrine 0x00, 0x10, 0x00, 0x01, 620cadf2f4SJacques Vidrine 0x00, 0x00, 0x12, 0x67, 0xff, 0xff}, 36} 630cadf2f4SJacques Vidrine }; 640cadf2f4SJacques Vidrine 650cadf2f4SJacques Vidrine #ifndef MAP_FAILED 660cadf2f4SJacques Vidrine #define MAP_FAILED (-1) 670cadf2f4SJacques Vidrine #endif 680cadf2f4SJacques Vidrine 690cadf2f4SJacques Vidrine static sig_atomic_t val = 0; 700cadf2f4SJacques Vidrine 710cadf2f4SJacques Vidrine static RETSIGTYPE 720cadf2f4SJacques Vidrine segv_handler(int sig) 730cadf2f4SJacques Vidrine { 740cadf2f4SJacques Vidrine val = 1; 750cadf2f4SJacques Vidrine } 760cadf2f4SJacques Vidrine 770cadf2f4SJacques Vidrine int 780cadf2f4SJacques Vidrine main(int argc, char **argv) 790cadf2f4SJacques Vidrine { 800cadf2f4SJacques Vidrine #ifndef HAVE_MMAP 810cadf2f4SJacques Vidrine return 77; /* signal to automake that this test 820cadf2f4SJacques Vidrine cannot be run */ 830cadf2f4SJacques Vidrine #else /* HAVE_MMAP */ 840cadf2f4SJacques Vidrine int ret; 850cadf2f4SJacques Vidrine int i; 860cadf2f4SJacques Vidrine struct sigaction sa; 870cadf2f4SJacques Vidrine 880cadf2f4SJacques Vidrine sigemptyset (&sa.sa_mask); 890cadf2f4SJacques Vidrine sa.sa_flags = 0; 900cadf2f4SJacques Vidrine sa.sa_handler = segv_handler; 910cadf2f4SJacques Vidrine sigaction (SIGSEGV, &sa, NULL); 920cadf2f4SJacques Vidrine 930cadf2f4SJacques Vidrine for (i = 0; val == 0 && i < sizeof(tests)/sizeof(tests[0]); ++i) { 940cadf2f4SJacques Vidrine const struct testcase *t = &tests[i]; 950cadf2f4SJacques Vidrine unsigned char *p1, *p2; 960cadf2f4SJacques Vidrine int flags; 970cadf2f4SJacques Vidrine int fd; 980cadf2f4SJacques Vidrine size_t pagesize = getpagesize(); 990cadf2f4SJacques Vidrine unsigned char *buf; 1000cadf2f4SJacques Vidrine 1010cadf2f4SJacques Vidrine #ifdef MAP_ANON 1020cadf2f4SJacques Vidrine flags = MAP_ANON; 1030cadf2f4SJacques Vidrine fd = -1; 1040cadf2f4SJacques Vidrine #else 1050cadf2f4SJacques Vidrine flags = 0; 1060cadf2f4SJacques Vidrine fd = open ("/dev/zero", O_RDONLY); 1070cadf2f4SJacques Vidrine if(fd < 0) 1080cadf2f4SJacques Vidrine err (1, "open /dev/zero"); 1090cadf2f4SJacques Vidrine #endif 1100cadf2f4SJacques Vidrine flags |= MAP_PRIVATE; 1110cadf2f4SJacques Vidrine 1120cadf2f4SJacques Vidrine p1 = (char *)mmap(0, 2 * pagesize, PROT_READ | PROT_WRITE, 1130cadf2f4SJacques Vidrine flags, fd, 0); 1140cadf2f4SJacques Vidrine if (p1 == (unsigned char *)MAP_FAILED) 1150cadf2f4SJacques Vidrine err (1, "mmap"); 1160cadf2f4SJacques Vidrine p2 = p1 + pagesize; 1170cadf2f4SJacques Vidrine ret = mprotect (p2, pagesize, 0); 1180cadf2f4SJacques Vidrine if (ret < 0) 1190cadf2f4SJacques Vidrine err (1, "mprotect"); 1200cadf2f4SJacques Vidrine buf = p2 - t->buf_len; 1210cadf2f4SJacques Vidrine memcpy (buf, t->buf, t->buf_len); 1220cadf2f4SJacques Vidrine parse_reply (buf, t->buf_len); 1230cadf2f4SJacques Vidrine ret = munmap (p1, 2 * pagesize); 1240cadf2f4SJacques Vidrine if (ret < 0) 1250cadf2f4SJacques Vidrine err (1, "munmap"); 1260cadf2f4SJacques Vidrine } 1270cadf2f4SJacques Vidrine return val; 1280cadf2f4SJacques Vidrine #endif /* HAVE_MMAP */ 1290cadf2f4SJacques Vidrine } 130