1*347267dcSEnji Cooper /*- 2*347267dcSEnji Cooper * Copyright (c) 2009 David Schultz <das@FreeBSD.org> 3*347267dcSEnji Cooper * All rights reserved. 4*347267dcSEnji Cooper * 5*347267dcSEnji Cooper * Redistribution and use in source and binary forms, with or without 6*347267dcSEnji Cooper * modification, are permitted provided that the following conditions 7*347267dcSEnji Cooper * are met: 8*347267dcSEnji Cooper * 1. Redistributions of source code must retain the above copyright 9*347267dcSEnji Cooper * notice, this list of conditions and the following disclaimer. 10*347267dcSEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 11*347267dcSEnji Cooper * notice, this list of conditions and the following disclaimer in the 12*347267dcSEnji Cooper * documentation and/or other materials provided with the distribution. 13*347267dcSEnji Cooper * 14*347267dcSEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*347267dcSEnji Cooper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*347267dcSEnji Cooper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*347267dcSEnji Cooper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*347267dcSEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*347267dcSEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*347267dcSEnji Cooper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*347267dcSEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*347267dcSEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*347267dcSEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*347267dcSEnji Cooper * SUCH DAMAGE. 25*347267dcSEnji Cooper */ 26*347267dcSEnji Cooper 27*347267dcSEnji Cooper #include <sys/cdefs.h> 28*347267dcSEnji Cooper __FBSDID("$FreeBSD$"); 29*347267dcSEnji Cooper 30*347267dcSEnji Cooper #include <sys/param.h> 31*347267dcSEnji Cooper #include <sys/mman.h> 32*347267dcSEnji Cooper #include <assert.h> 33*347267dcSEnji Cooper #include <stdio.h> 34*347267dcSEnji Cooper #include <stdlib.h> 35*347267dcSEnji Cooper #include <string.h> 36*347267dcSEnji Cooper #include <wchar.h> 37*347267dcSEnji Cooper 38*347267dcSEnji Cooper #include <atf-c.h> 39*347267dcSEnji Cooper 40*347267dcSEnji Cooper static void * 41*347267dcSEnji Cooper makebuf(size_t len, int guard_at_end) 42*347267dcSEnji Cooper { 43*347267dcSEnji Cooper char *buf; 44*347267dcSEnji Cooper size_t alloc_size = roundup2(len, PAGE_SIZE) + PAGE_SIZE; 45*347267dcSEnji Cooper 46*347267dcSEnji Cooper buf = mmap(NULL, alloc_size, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); 47*347267dcSEnji Cooper ATF_CHECK(buf); 48*347267dcSEnji Cooper if (guard_at_end) { 49*347267dcSEnji Cooper ATF_CHECK(munmap(buf + alloc_size - PAGE_SIZE, PAGE_SIZE) == 0); 50*347267dcSEnji Cooper return (buf + alloc_size - PAGE_SIZE - len); 51*347267dcSEnji Cooper } else { 52*347267dcSEnji Cooper ATF_CHECK(munmap(buf, PAGE_SIZE) == 0); 53*347267dcSEnji Cooper return (buf + PAGE_SIZE); 54*347267dcSEnji Cooper } 55*347267dcSEnji Cooper } 56*347267dcSEnji Cooper 57*347267dcSEnji Cooper static void 58*347267dcSEnji Cooper test_wcsnlen(const wchar_t *s) 59*347267dcSEnji Cooper { 60*347267dcSEnji Cooper wchar_t *s1; 61*347267dcSEnji Cooper size_t size, len, bufsize; 62*347267dcSEnji Cooper int i; 63*347267dcSEnji Cooper 64*347267dcSEnji Cooper size = wcslen(s) + 1; 65*347267dcSEnji Cooper for (i = 0; i <= 1; i++) { 66*347267dcSEnji Cooper for (bufsize = 0; bufsize <= size + 10; bufsize++) { 67*347267dcSEnji Cooper s1 = makebuf(bufsize * sizeof(wchar_t), i); 68*347267dcSEnji Cooper wmemcpy(s1, s, bufsize); 69*347267dcSEnji Cooper len = (size > bufsize) ? bufsize : size - 1; 70*347267dcSEnji Cooper ATF_CHECK(wcsnlen(s1, bufsize) == len); 71*347267dcSEnji Cooper } 72*347267dcSEnji Cooper } 73*347267dcSEnji Cooper } 74*347267dcSEnji Cooper 75*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(nul); 76*347267dcSEnji Cooper ATF_TC_BODY(nul, tc) 77*347267dcSEnji Cooper { 78*347267dcSEnji Cooper 79*347267dcSEnji Cooper test_wcsnlen(L""); 80*347267dcSEnji Cooper } 81*347267dcSEnji Cooper 82*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(foo); 83*347267dcSEnji Cooper ATF_TC_BODY(foo, tc) 84*347267dcSEnji Cooper { 85*347267dcSEnji Cooper 86*347267dcSEnji Cooper test_wcsnlen(L"foo"); 87*347267dcSEnji Cooper } 88*347267dcSEnji Cooper 89*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(glorp); 90*347267dcSEnji Cooper ATF_TC_BODY(glorp, tc) 91*347267dcSEnji Cooper { 92*347267dcSEnji Cooper 93*347267dcSEnji Cooper test_wcsnlen(L"glorp"); 94*347267dcSEnji Cooper } 95*347267dcSEnji Cooper 96*347267dcSEnji Cooper ATF_TP_ADD_TCS(tp) 97*347267dcSEnji Cooper { 98*347267dcSEnji Cooper 99*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, nul); 100*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, foo); 101*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, glorp); 102*347267dcSEnji Cooper 103*347267dcSEnji Cooper return (atf_no_error()); 104*347267dcSEnji Cooper } 105