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