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 #include <config.h>
350cadf2f4SJacques Vidrine 
36c19800e8SDoug Rabson #include <sys/types.h>
370cadf2f4SJacques Vidrine #ifdef HAVE_SYS_MMAN_H
380cadf2f4SJacques Vidrine #include <sys/mman.h>
390cadf2f4SJacques Vidrine #endif
400cadf2f4SJacques Vidrine #include <fcntl.h>
410cadf2f4SJacques Vidrine 
420cadf2f4SJacques Vidrine #include "roken.h"
430cadf2f4SJacques Vidrine #include "resolve.h"
440cadf2f4SJacques Vidrine 
450cadf2f4SJacques Vidrine struct dns_reply*
460cadf2f4SJacques Vidrine parse_reply(const unsigned char *, size_t);
470cadf2f4SJacques Vidrine 
480cadf2f4SJacques Vidrine enum { MAX_BUF = 36};
490cadf2f4SJacques Vidrine 
500cadf2f4SJacques Vidrine static struct testcase {
510cadf2f4SJacques Vidrine     unsigned char buf[MAX_BUF];
520cadf2f4SJacques Vidrine     size_t buf_len;
530cadf2f4SJacques Vidrine } tests[] = {
540cadf2f4SJacques Vidrine     {{0x12, 0x67, 0x84, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
550cadf2f4SJacques Vidrine      0x03, 'f', 'o', 'o', 0x00,
560cadf2f4SJacques Vidrine      0x00, 0x10, 0x00, 0x01,
570cadf2f4SJacques Vidrine      0x03, 'f', 'o', 'o', 0x00,
580cadf2f4SJacques Vidrine      0x00, 0x10, 0x00, 0x01,
590cadf2f4SJacques Vidrine       0x00, 0x00, 0x12, 0x67, 0xff, 0xff}, 36}
600cadf2f4SJacques Vidrine };
610cadf2f4SJacques Vidrine 
620cadf2f4SJacques Vidrine #ifndef MAP_FAILED
630cadf2f4SJacques Vidrine #define MAP_FAILED (-1)
640cadf2f4SJacques Vidrine #endif
650cadf2f4SJacques Vidrine 
660cadf2f4SJacques Vidrine static sig_atomic_t val = 0;
670cadf2f4SJacques Vidrine 
680cadf2f4SJacques Vidrine static RETSIGTYPE
segv_handler(int sig)690cadf2f4SJacques Vidrine segv_handler(int sig)
700cadf2f4SJacques Vidrine {
710cadf2f4SJacques Vidrine     val = 1;
720cadf2f4SJacques Vidrine }
730cadf2f4SJacques Vidrine 
740cadf2f4SJacques Vidrine int
main(int argc,char ** argv)750cadf2f4SJacques Vidrine main(int argc, char **argv)
760cadf2f4SJacques Vidrine {
770cadf2f4SJacques Vidrine #ifndef HAVE_MMAP
780cadf2f4SJacques Vidrine     return 77;			/* signal to automake that this test
790cadf2f4SJacques Vidrine                                    cannot be run */
800cadf2f4SJacques Vidrine #else /* HAVE_MMAP */
810cadf2f4SJacques Vidrine     int ret;
820cadf2f4SJacques Vidrine     int i;
830cadf2f4SJacques Vidrine     struct sigaction sa;
840cadf2f4SJacques Vidrine 
850cadf2f4SJacques Vidrine     sigemptyset (&sa.sa_mask);
860cadf2f4SJacques Vidrine     sa.sa_flags = 0;
870cadf2f4SJacques Vidrine     sa.sa_handler = segv_handler;
880cadf2f4SJacques Vidrine     sigaction (SIGSEGV, &sa, NULL);
890cadf2f4SJacques Vidrine 
900cadf2f4SJacques Vidrine     for (i = 0; val == 0 && i < sizeof(tests)/sizeof(tests[0]); ++i) {
910cadf2f4SJacques Vidrine 	const struct testcase *t = &tests[i];
920cadf2f4SJacques Vidrine 	unsigned char *p1, *p2;
930cadf2f4SJacques Vidrine 	int flags;
940cadf2f4SJacques Vidrine 	int fd;
950cadf2f4SJacques Vidrine 	size_t pagesize = getpagesize();
960cadf2f4SJacques Vidrine 	unsigned char *buf;
970cadf2f4SJacques Vidrine 
980cadf2f4SJacques Vidrine #ifdef MAP_ANON
990cadf2f4SJacques Vidrine 	flags = MAP_ANON;
1000cadf2f4SJacques Vidrine 	fd = -1;
1010cadf2f4SJacques Vidrine #else
1020cadf2f4SJacques Vidrine 	flags = 0;
1030cadf2f4SJacques Vidrine 	fd = open ("/dev/zero", O_RDONLY);
1040cadf2f4SJacques Vidrine 	if(fd < 0)
1050cadf2f4SJacques Vidrine 	    err (1, "open /dev/zero");
1060cadf2f4SJacques Vidrine #endif
1070cadf2f4SJacques Vidrine 	flags |= MAP_PRIVATE;
1080cadf2f4SJacques Vidrine 
1090cadf2f4SJacques Vidrine 	p1 = (unsigned char *)mmap(0, 2 * pagesize, PROT_READ | PROT_WRITE,
1100cadf2f4SJacques Vidrine 		  flags, fd, 0);
1110cadf2f4SJacques Vidrine 	if (p1 == (unsigned char *)MAP_FAILED)
112c19800e8SDoug Rabson 	    err (1, "mmap");
1130cadf2f4SJacques Vidrine 	p2 = p1 + pagesize;
1140cadf2f4SJacques Vidrine 	ret = mprotect ((void *)p2, pagesize, 0);
1150cadf2f4SJacques Vidrine 	if (ret < 0)
1160cadf2f4SJacques Vidrine 	    err (1, "mprotect");
117c19800e8SDoug Rabson 	buf = p2 - t->buf_len;
1180cadf2f4SJacques Vidrine 	memcpy (buf, t->buf, t->buf_len);
1190cadf2f4SJacques Vidrine 	parse_reply (buf, t->buf_len);
1200cadf2f4SJacques Vidrine 	ret = munmap ((void *)p1, 2 * pagesize);
1210cadf2f4SJacques Vidrine 	if (ret < 0)
1220cadf2f4SJacques Vidrine 	    err (1, "munmap");
123c19800e8SDoug Rabson     }
1240cadf2f4SJacques Vidrine     return val;
1250cadf2f4SJacques Vidrine #endif /* HAVE_MMAP */
1260cadf2f4SJacques Vidrine }
1270cadf2f4SJacques Vidrine