xref: /netbsd-src/tests/lib/libc/string/t_memmem.c (revision 43d7e2f9be16e42b081a43bab55292a6fbf21fc8)
1*43d7e2f9Schristos /*	$NetBSD: t_memmem.c,v 1.6 2020/11/27 16:50:02 christos Exp $ */
23ca5a7dbSpgoyette 
33ca5a7dbSpgoyette /*-
43ca5a7dbSpgoyette  * Copyright (c) 2005 The NetBSD Foundation, Inc.
53ca5a7dbSpgoyette  * All rights reserved.
63ca5a7dbSpgoyette  *
73ca5a7dbSpgoyette  * This code is derived from software contributed to The NetBSD Foundation
83ca5a7dbSpgoyette  * by Perry E. Metzger of Metzger, Dowdeswell & Co. LLC.
93ca5a7dbSpgoyette  *
103ca5a7dbSpgoyette  * Redistribution and use in source and binary forms, with or without
113ca5a7dbSpgoyette  * modification, are permitted provided that the following conditions
123ca5a7dbSpgoyette  * are met:
133ca5a7dbSpgoyette  * 1. Redistributions of source code must retain the above copyright
143ca5a7dbSpgoyette  *    notice, this list of conditions and the following disclaimer.
153ca5a7dbSpgoyette  * 2. Redistributions in binary form must reproduce the above copyright
163ca5a7dbSpgoyette  *    notice, this list of conditions and the following disclaimer in the
173ca5a7dbSpgoyette  *    documentation and/or other materials provided with the distribution.
183ca5a7dbSpgoyette  *
193ca5a7dbSpgoyette  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
203ca5a7dbSpgoyette  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
213ca5a7dbSpgoyette  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
223ca5a7dbSpgoyette  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
233ca5a7dbSpgoyette  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
243ca5a7dbSpgoyette  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
253ca5a7dbSpgoyette  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
263ca5a7dbSpgoyette  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
273ca5a7dbSpgoyette  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
283ca5a7dbSpgoyette  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
293ca5a7dbSpgoyette  * POSSIBILITY OF SUCH DAMAGE.
303ca5a7dbSpgoyette  */
313ca5a7dbSpgoyette 
323ca5a7dbSpgoyette #include <atf-c.h>
333ca5a7dbSpgoyette 
343ca5a7dbSpgoyette #include <stdio.h>
353ca5a7dbSpgoyette #include <stdlib.h>
363ca5a7dbSpgoyette #include <string.h>
377e431be0Schristos #include <sys/mman.h>
383ca5a7dbSpgoyette 
393ca5a7dbSpgoyette char p0[] = "";
403ca5a7dbSpgoyette int lp0 = 0;
413ca5a7dbSpgoyette char p1[] = "0123";
423ca5a7dbSpgoyette int lp1 = 4;
433ca5a7dbSpgoyette char p2[] = "456";
443ca5a7dbSpgoyette int lp2 = 3;
453ca5a7dbSpgoyette char p3[] = "789";
463ca5a7dbSpgoyette int lp3 = 3;
473ca5a7dbSpgoyette char p4[] = "abc";
483ca5a7dbSpgoyette int lp4 = 3;
493ca5a7dbSpgoyette char p5[] = "0";
503ca5a7dbSpgoyette int lp5 = 1;
513ca5a7dbSpgoyette char p6[] = "9";
523ca5a7dbSpgoyette int lp6 = 1;
533ca5a7dbSpgoyette char p7[] = "654";
543ca5a7dbSpgoyette int lp7 = 3;
5564565cf3Schristos char p8[] = "89abc";
5664565cf3Schristos int lp8 = 5;
573ca5a7dbSpgoyette 
583ca5a7dbSpgoyette char b0[] = "";
593ca5a7dbSpgoyette int lb0 = 0;
603ca5a7dbSpgoyette char b1[] = "0";
613ca5a7dbSpgoyette int lb1 = 1;
623ca5a7dbSpgoyette char b2[] = "0123456789";
633ca5a7dbSpgoyette int lb2 = 10;
643ca5a7dbSpgoyette 
653ca5a7dbSpgoyette #define expect(b)							\
663ca5a7dbSpgoyette 	if (!(b)) {							\
673ca5a7dbSpgoyette 		fprintf(stderr, "failed on line %d\n", __LINE__);	\
683ca5a7dbSpgoyette 		atf_tc_fail("Check stderr for test id/line");		\
693ca5a7dbSpgoyette 	}
703ca5a7dbSpgoyette 
711c3ef2c7Sjruoho ATF_TC(memmem_basic);
ATF_TC_HEAD(memmem_basic,tc)721c3ef2c7Sjruoho ATF_TC_HEAD(memmem_basic, tc)
733ca5a7dbSpgoyette {
743ca5a7dbSpgoyette 
753ca5a7dbSpgoyette 	atf_tc_set_md_var(tc, "descr", "Test memmem results");
763ca5a7dbSpgoyette }
773ca5a7dbSpgoyette 
ATF_TC_BODY(memmem_basic,tc)781c3ef2c7Sjruoho ATF_TC_BODY(memmem_basic, tc)
793ca5a7dbSpgoyette {
803ca5a7dbSpgoyette 
813ca5a7dbSpgoyette 	expect(memmem(b2, lb2, p0, lp0) == b2);
823ca5a7dbSpgoyette 	expect(memmem(b0, lb0, p0, lp0) == b0);
833ca5a7dbSpgoyette 	expect(memmem(b0, lb0, p1, lp1) == NULL);
843ca5a7dbSpgoyette 	expect(memmem(b1, lb1, p1, lp1) == NULL);
853ca5a7dbSpgoyette 
863ca5a7dbSpgoyette 	expect(memmem(b2, lb2, p1, lp1) == b2);
873ca5a7dbSpgoyette 	expect(memmem(b2, lb2, p2, lp2) == (b2 + 4));
883ca5a7dbSpgoyette 	expect(memmem(b2, lb2, p3, lp3) == (b2 + 7));
893ca5a7dbSpgoyette 
903ca5a7dbSpgoyette 	expect(memmem(b2, lb2, p5, lp5) == b2);
913ca5a7dbSpgoyette 	expect(memmem(b2, lb2, p6, lp6) == (b2 + 9));
923ca5a7dbSpgoyette 
933ca5a7dbSpgoyette 	expect(memmem(b2, lb2, p4, lp4) == NULL);
943ca5a7dbSpgoyette 	expect(memmem(b2, lb2, p7, lp7) == NULL);
9564565cf3Schristos 	expect(memmem(b2, lb2, p8, lp8) == NULL);
963ca5a7dbSpgoyette }
973ca5a7dbSpgoyette 
987e431be0Schristos ATF_TC(memmem_oob);
ATF_TC_HEAD(memmem_oob,tc)997e431be0Schristos ATF_TC_HEAD(memmem_oob, tc)
1007e431be0Schristos {
1017e431be0Schristos 	atf_tc_set_md_var(tc, "descr", "Test memmem out of bounds read");
1027e431be0Schristos }
1037e431be0Schristos 
ATF_TC_BODY(memmem_oob,tc)1047e431be0Schristos ATF_TC_BODY(memmem_oob, tc)
1057e431be0Schristos {
1067e431be0Schristos 	static const char str[] = "abcde";
1077e431be0Schristos 	size_t pg = getpagesize();
108*43d7e2f9Schristos 	char *src = mmap(NULL, 2 * pg, PROT_READ|PROT_WRITE,
1097e431be0Schristos 	    MAP_ANON|MAP_PRIVATE, -1, (off_t)0);
1107e431be0Schristos 	ATF_CHECK(src != MAP_FAILED);
1117e431be0Schristos 	char *guard = mmap(src + pg, pg,
1127e431be0Schristos 	    PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, (off_t)0);
113*43d7e2f9Schristos printf("%p\n", guard);
1147e431be0Schristos 	for (size_t i = 2; i < 5; i++) {
1157e431be0Schristos 		char *search = src + pg - i;
1167e431be0Schristos 		char match[sizeof(str)];
1177e431be0Schristos 		search[-1] = str[0];
1187e431be0Schristos 		search[0] = str[0];
1197e431be0Schristos 		search[1] = str[0];
1207e431be0Schristos 		memcpy(match, str, i);
1217e431be0Schristos 		ATF_CHECK(memmem(search, i, match, i) != search);
1227e431be0Schristos 	}
1237e431be0Schristos 	munmap(guard, pg);
1247e431be0Schristos 	munmap(src, pg);
1257e431be0Schristos }
1267e431be0Schristos 
1277e431be0Schristos 
ATF_TP_ADD_TCS(tp)1283ca5a7dbSpgoyette ATF_TP_ADD_TCS(tp)
1293ca5a7dbSpgoyette {
1303ca5a7dbSpgoyette 
1311c3ef2c7Sjruoho 	ATF_TP_ADD_TC(tp, memmem_basic);
1327e431be0Schristos 	ATF_TP_ADD_TC(tp, memmem_oob);
1333ca5a7dbSpgoyette 
1343ca5a7dbSpgoyette 	return atf_no_error();
1353ca5a7dbSpgoyette }
136