X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Funistr%2Ftest-u8-strchr.c;h=a78e7f3ad229a138211ed5bc7df5a2fe2b86fce9;hb=25b6b5120113989e0b91de9d0b75d3d625bbc753;hp=5491a71cdfab606ac1e0f861d7066305bbc76b1e;hpb=ad9a24a121ab3154f30d9d38d8243f41566d151e;p=gnulib.git diff --git a/tests/unistr/test-u8-strchr.c b/tests/unistr/test-u8-strchr.c index 5491a71cd..a78e7f3ad 100644 --- a/tests/unistr/test-u8-strchr.c +++ b/tests/unistr/test-u8-strchr.c @@ -1,5 +1,5 @@ /* Test of u8_strchr() function. - Copyright (C) 2010 Free Software Foundation, Inc. + Copyright (C) 2010-2012 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #include "unistr.h" #include +#include #include "zerosize-ptr.h" #include "macros.h" @@ -31,3 +32,118 @@ #define U_STRCHR u8_strchr #define U_SET u8_set #include "test-strchr.h" + +int +main (void) +{ + test_strchr (); + + /* Check that u8_strchr() does not read past the end of the string. */ + { + char *page_boundary = (char *) zerosize_ptr (); + + if (page_boundary != NULL) + { + UNIT *mem; + + mem = (UNIT *) (page_boundary - 1 * sizeof (UNIT)); + mem[0] = 0; + ASSERT (u8_strchr (mem, 0x55) == NULL); + ASSERT (u8_strchr (mem, 0x123) == NULL); + ASSERT (u8_strchr (mem, 0x3456) == NULL); + ASSERT (u8_strchr (mem, 0x23456) == NULL); + + mem = (UNIT *) (page_boundary - 2 * sizeof (UNIT)); + mem[0] = 0x50; + mem[1] = 0; + ASSERT (u8_strchr (mem, 0x55) == NULL); + ASSERT (u8_strchr (mem, 0x123) == NULL); + ASSERT (u8_strchr (mem, 0x3456) == NULL); + ASSERT (u8_strchr (mem, 0x23456) == NULL); + + mem = (UNIT *) (page_boundary - 3 * sizeof (UNIT)); + mem[0] = 0x50; + mem[1] = 0x50; + mem[2] = 0; + ASSERT (u8_strchr (mem, 0x55) == NULL); + ASSERT (u8_strchr (mem, 0x123) == NULL); + ASSERT (u8_strchr (mem, 0x3456) == NULL); + ASSERT (u8_strchr (mem, 0x23456) == NULL); + + mem = (UNIT *) (page_boundary - 3 * sizeof (UNIT)); + mem[0] = 0xC4; mem[1] = 0xA0; /* U+0120 */ + mem[2] = 0; + ASSERT (u8_strchr (mem, 0x55) == NULL); + ASSERT (u8_strchr (mem, 0x123) == NULL); + ASSERT (u8_strchr (mem, 0x3456) == NULL); + ASSERT (u8_strchr (mem, 0x23456) == NULL); + + mem = (UNIT *) (page_boundary - 3 * sizeof (UNIT)); + mem[0] = 0xC5; mem[1] = 0xA3; /* U+0163 */ + mem[2] = 0; + ASSERT (u8_strchr (mem, 0x55) == NULL); + ASSERT (u8_strchr (mem, 0x123) == NULL); + ASSERT (u8_strchr (mem, 0x3456) == NULL); + ASSERT (u8_strchr (mem, 0x23456) == NULL); + + mem = (UNIT *) (page_boundary - 4 * sizeof (UNIT)); + mem[0] = 0x50; + mem[1] = 0x50; + mem[2] = 0x50; + mem[3] = 0; + ASSERT (u8_strchr (mem, 0x55) == NULL); + ASSERT (u8_strchr (mem, 0x123) == NULL); + ASSERT (u8_strchr (mem, 0x3456) == NULL); + ASSERT (u8_strchr (mem, 0x23456) == NULL); + + mem = (UNIT *) (page_boundary - 4 * sizeof (UNIT)); + mem[0] = 0x50; + mem[1] = 0xC5; mem[2] = 0xA3; /* U+0163 */ + mem[3] = 0; + ASSERT (u8_strchr (mem, 0x55) == NULL); + ASSERT (u8_strchr (mem, 0x123) == NULL); + ASSERT (u8_strchr (mem, 0x3456) == NULL); + ASSERT (u8_strchr (mem, 0x23456) == NULL); + ASSERT (u8_strchr (mem, 0x163) == mem + 1); + + mem = (UNIT *) (page_boundary - 4 * sizeof (UNIT)); + mem[0] = 0xE3; mem[1] = 0x91; mem[2] = 0x00; /* U+3450 */ + mem[3] = 0; + ASSERT (u8_strchr (mem, 0x55) == NULL); + ASSERT (u8_strchr (mem, 0x123) == NULL); + ASSERT (u8_strchr (mem, 0x3456) == NULL); + ASSERT (u8_strchr (mem, 0x23456) == NULL); + + mem = (UNIT *) (page_boundary - 4 * sizeof (UNIT)); + mem[0] = 0xE3; mem[1] = 0x92; mem[2] = 0x96; /* U+3496 */ + mem[3] = 0; + ASSERT (u8_strchr (mem, 0x55) == NULL); + ASSERT (u8_strchr (mem, 0x123) == NULL); + ASSERT (u8_strchr (mem, 0x3456) == NULL); + ASSERT (u8_strchr (mem, 0x23456) == NULL); + + mem = (UNIT *) (page_boundary - 5 * sizeof (UNIT)); + mem[0] = 0x50; + mem[1] = 0x50; + mem[2] = 0x50; + mem[3] = 0x50; + mem[4] = 0; + ASSERT (u8_strchr (mem, 0x55) == NULL); + ASSERT (u8_strchr (mem, 0x123) == NULL); + ASSERT (u8_strchr (mem, 0x3456) == NULL); + ASSERT (u8_strchr (mem, 0x23456) == NULL); + + mem = (UNIT *) (page_boundary - 5 * sizeof (UNIT)); + mem[0] = 0x50; + mem[1] = 0xE3; mem[2] = 0x92; mem[3] = 0x96; /* U+3496 */ + mem[4] = 0; + ASSERT (u8_strchr (mem, 0x55) == NULL); + ASSERT (u8_strchr (mem, 0x123) == NULL); + ASSERT (u8_strchr (mem, 0x3456) == NULL); + ASSERT (u8_strchr (mem, 0x23456) == NULL); + ASSERT (u8_strchr (mem, 0x3496) == mem + 1); + } + } + + return 0; +}