xref: /freebsd/crypto/heimdal/lib/roken/parse_reply-test.c (revision 0cadf2f4d7b9f212800448d915003abd40c2e40d)
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