]> eyrie.org Git - kerberos/krb5-strength.git/blob - tests/util/xmalloc-t
Declare fast forward from 3.1-2
[kerberos/krb5-strength.git] / tests / util / xmalloc-t
1 #! /bin/sh
2 #
3 # Test suite for xmalloc and friends.
4 #
5 # The canonical version of this file is maintained in the rra-c-util package,
6 # which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
7 #
8 # Written by Russ Allbery <eagle@eyrie.org>
9 # Copyright 2000-2001, 2006, 2014, 2016, 2019-2020
10 #     Russ Allbery <eagle@eyrie.org>
11 # Copyright 2008-2010, 2012
12 #     The Board of Trustees of the Leland Stanford Junior University
13 #
14 # Permission is hereby granted, free of charge, to any person obtaining a
15 # copy of this software and associated documentation files (the "Software"),
16 # to deal in the Software without restriction, including without limitation
17 # the rights to use, copy, modify, merge, publish, distribute, sublicense,
18 # and/or sell copies of the Software, and to permit persons to whom the
19 # Software is furnished to do so, subject to the following conditions:
20 #
21 # The above copyright notice and this permission notice shall be included in
22 # all copies or substantial portions of the Software.
23 #
24 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
27 # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
30 # DEALINGS IN THE SOFTWARE.
31 #
32 # SPDX-License-Identifier: MIT
33
34 . "$C_TAP_SOURCE/tap/libtap.sh"
35 cd "$C_TAP_BUILD/util"
36
37 # Run an xmalloc test.  Takes the description, the expected exit status, the
38 # output, and the arguments.
39 ok_xmalloc () {
40     local desc w_status w_output output status
41     desc="$1"
42     shift
43     w_status="$1"
44     shift
45     w_output="$1"
46     shift
47     output=`strip_colon_error ./xmalloc "$@" 2>&1`
48     status=$?
49     if [ $status = $w_status ] && [ x"$output" = x"$w_output" ] ; then
50         ok "$desc" true
51     elif [ $status = 2 ] ; then
52         diag "$output"
53         skip "no data limit support"
54     else
55         diag "saw: ($status) $output"
56         diag "not: ($w_status) $w_output"
57         ok "$desc" false
58     fi
59 }
60
61 # Skip this test suite unless maintainer-mode tests are enabled.  All of the
62 # failures in automated testing have been problems with the assumptions around
63 # memory allocation or problems with the test suite, not problems with the
64 # underlying xmalloc code.
65 if [ -z "$AUTHOR_TESTING" ] ; then
66     skip_all 'xmalloc tests only run for author'
67 fi
68
69 # Total tests.
70 plan 41
71
72 # First run the tests expected to succeed.
73 ok_xmalloc "malloc small"       0 "" "m" "21"       "0"
74 ok_xmalloc "malloc large"       0 "" "m" "30000000" "0"
75 ok_xmalloc "malloc zero"        0 "" "m" "0"        "0"
76 ok_xmalloc "realloc small"      0 "" "r" "21"       "0"
77 ok_xmalloc "realloc large"      0 "" "r" "30000000" "0"
78 ok_xmalloc "reallocarray small" 0 "" "y" "20"       "0"
79 ok_xmalloc "reallocarray large" 0 "" "y" "30000000" "0"
80 ok_xmalloc "strdup small"       0 "" "s" "21"       "0"
81 ok_xmalloc "strdup large"       0 "" "s" "30000000" "0"
82 ok_xmalloc "strndup small"      0 "" "n" "21"       "0"
83 ok_xmalloc "strndup large"      0 "" "n" "30000000" "0"
84 ok_xmalloc "calloc small"       0 "" "c" "24"       "0"
85 ok_xmalloc "calloc large"       0 "" "c" "30000000" "0"
86 ok_xmalloc "asprintf small"     0 "" "a" "24"       "0"
87 ok_xmalloc "asprintf large"     0 "" "a" "30000000" "0"
88 ok_xmalloc "vasprintf small"    0 "" "v" "24"       "0"
89 ok_xmalloc "vasprintf large"    0 "" "v" "30000000" "0"
90
91 # Now limit our memory to 30MB and then try the large ones again, all of
92 # which should fail.
93 #
94 # The exact memory limits used here are essentially black magic.  They need to
95 # be large enough to allow the program to be loaded and do small allocations,
96 # but not so large that we can't reasonably expect to allocate that much
97 # memory normally.  The amount of memory required varies a lot based on what
98 # shared libraries are loaded, and if it's too small, all memory allocations
99 # fail.  30MB seems to work reasonably well on both Solaris and Linux, even
100 # when the program is linked with additional libraries.
101 #
102 # We assume that there are enough miscellaneous allocations that an allocation
103 # exactly as large as the limit will always fail.
104 ok_xmalloc "malloc fail" 1 \
105     "failed to malloc 30000000 bytes at xmalloc.c line 42" \
106     "m" "30000000" "30000000"
107 ok_xmalloc "realloc fail" 1 \
108     "failed to realloc 30000000 bytes at xmalloc.c line 71" \
109     "r" "30000000" "30000000"
110 ok_xmalloc "reallocarray fail" 1 \
111     "failed to reallocarray 30000000 bytes at xmalloc.c line 100" \
112     "y" "30000000" "30000000"
113 ok_xmalloc "strdup fail" 1 \
114     "failed to strdup 30000000 bytes at xmalloc.c line 131" \
115     "s" "30000000" "30000000"
116 ok_xmalloc "strndup fail" 1 \
117     "failed to strndup 30000000 bytes at xmalloc.c line 177" \
118     "n" "30000000" "30000000"
119 ok_xmalloc "calloc fail" 1 \
120     "failed to calloc 30000000 bytes at xmalloc.c line 201" \
121     "c" "30000000" "30000000"
122 ok_xmalloc "asprintf fail" 1 \
123     "failed to asprintf 30000000 bytes at xmalloc.c line 225" \
124     "a" "30000000" "30000000"
125 ok_xmalloc "vasprintf fail" 1 \
126     "failed to vasprintf 30000000 bytes at xmalloc.c line 244" \
127     "v" "30000000" "30000000"
128
129 # Check our custom error handler.
130 ok_xmalloc "malloc custom"       1 "malloc 30000000 xmalloc.c 42" \
131     "M" "30000000" "30000000"
132 ok_xmalloc "realloc custom"      1 "realloc 30000000 xmalloc.c 71" \
133     "R" "30000000" "30000000"
134 ok_xmalloc "reallocarray custom" 1 "reallocarray 30000000 xmalloc.c 100" \
135     "Y" "30000000" "30000000"
136 ok_xmalloc "strdup custom"       1 "strdup 30000000 xmalloc.c 131" \
137     "S" "30000000" "30000000"
138 ok_xmalloc "strndup custom"      1 "strndup 30000000 xmalloc.c 177" \
139     "N" "30000000" "30000000"
140 ok_xmalloc "calloc custom"       1 "calloc 30000000 xmalloc.c 201" \
141     "C" "30000000" "30000000"
142 ok_xmalloc "asprintf custom"     1 "asprintf 30000000 xmalloc.c 225" \
143     "A" "30000000" "30000000"
144 ok_xmalloc "vasprintf custom"    1 "vasprintf 30000000 xmalloc.c 244" \
145     "V" "30000000" "30000000"
146
147 # Check the smaller ones again just for grins.
148 ok_xmalloc "malloc retry"       0 "" "m" "21" "30000000"
149 ok_xmalloc "realloc retry"      0 "" "r" "32" "30000000"
150 ok_xmalloc "reallocarray retry" 0 "" "y" "32" "30000000"
151 ok_xmalloc "strdup retry"       0 "" "s" "64" "30000000"
152 ok_xmalloc "strndup retry"      0 "" "n" "20" "30000000"
153 ok_xmalloc "calloc retry"       0 "" "c" "24" "30000000"
154 ok_xmalloc "asprintf retry"     0 "" "a" "30" "30000000"
155 ok_xmalloc "vasprintf retry"    0 "" "v" "35" "30000000"