1 | /* Copyright (C) 2013-2022 Free Software Foundation, Inc. |
2 | This file is part of the GNU C Library. |
3 | |
4 | The GNU C Library is free software; you can redistribute it and/or |
5 | modify it under the terms of the GNU Lesser General Public |
6 | License as published by the Free Software Foundation; either |
7 | version 2.1 of the License, or (at your option) any later version. |
8 | |
9 | The GNU C Library is distributed in the hope that it will be useful, |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | Lesser General Public License for more details. |
13 | |
14 | You should have received a copy of the GNU Lesser General Public |
15 | License along with the GNU C Library; if not, see |
16 | <https://www.gnu.org/licenses/>. */ |
17 | |
18 | #include <locale.h> |
19 | #include <stdio.h> |
20 | #include <stdint.h> |
21 | #include <stdlib.h> |
22 | #include <string.h> |
23 | |
24 | #include <support/check.h> |
25 | #include <support/test-driver.h> |
26 | |
27 | /* Verify that strcoll does not crash for large strings for which it |
28 | cannot cache weight lookup results. The size is large enough to |
29 | cause integer overflows on 32-bit as well as buffer overflows on |
30 | 64-bit. */ |
31 | #define SIZE 0x40000000ul |
32 | |
33 | int |
34 | do_test (void) |
35 | { |
36 | TEST_VERIFY_EXIT (setlocale (LC_COLLATE, "en_GB.UTF-8" ) != NULL); |
37 | |
38 | char *p = malloc (SIZE); |
39 | if (p == NULL) |
40 | { |
41 | puts (s: "info: could not allocate memory, cannot run test" ); |
42 | return EXIT_UNSUPPORTED; |
43 | } |
44 | |
45 | memset (p, 'x', SIZE - 1); |
46 | p[SIZE - 1] = 0; |
47 | printf (format: "info: strcoll result: %d\n" , strcoll (p, p)); |
48 | return 0; |
49 | } |
50 | |
51 | /* This test can rung for a long time, but it should complete within |
52 | this time on reasonably current hardware. */ |
53 | #define TIMEOUT 300 |
54 | #include <support/test-driver.c> |
55 | |