Coverage Report

Created: 2026-07-05 06:56

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libssh/tests/fuzz/nallocinc.c
Line
Count
Source
1
/*
2
 MIT License
3
4
 Copyright (c) 2025 Catena cyber
5
6
 Permission is hereby granted, free of charge, to any person obtaining a copy
7
 of this software and associated documentation files (the "Software"), to deal
8
 in the Software without restriction, including without limitation the rights
9
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 copies of the Software, and to permit persons to whom the Software is
11
 furnished to do so, subject to the following conditions:
12
13
 The above copyright notice and this permission notice shall be included in all
14
 copies or substantial portions of the Software.
15
16
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
 SOFTWARE.
23
*/
24
25
/* Nalloc fuzz : framework to make allocations and IO fail while fuzzing */
26
27
/* Environment variables to control nalloc fuzz behavior :
28
 * NALLOC_VERBOSE: set it to log failed allocations with their stacktraces
29
 * NALLOC_FREQ: set it to control how frequently allocations fail
30
 *  value 0 disables nalloc (no allocations fail)
31
 *  value 1..31 : allocations fail always (1) or very rarely (31 -> 1 / 2^31)
32
 *  value 32 : allocations fail at a random rate between 5 and 20 for each run
33
 */
34
#if defined(__clang__) && defined(__has_feature)
35
#if __has_feature(address_sanitizer)
36
#define NALLOC_ASAN 1
37
#endif
38
#endif
39
40
#include <errno.h>
41
#include <stdbool.h>
42
#include <stdint.h>
43
#include <stdio.h>
44
#include <stdlib.h>
45
#include <string.h>
46
47
#ifdef __cplusplus
48
extern "C" {
49
#endif
50
51
static const uint32_t nalloc_crc32_table[] = {
52
    0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
53
    0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
54
    0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
55
    0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
56
    0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
57
    0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
58
    0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
59
    0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
60
    0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
61
    0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
62
    0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
63
    0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
64
    0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
65
    0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
66
    0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
67
    0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
68
    0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
69
    0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
70
    0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
71
    0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
72
    0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
73
    0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
74
    0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
75
    0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
76
    0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
77
    0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
78
    0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
79
    0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
80
    0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
81
    0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
82
    0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
83
    0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
84
    0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
85
    0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
86
    0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
87
    0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
88
    0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
89
    0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
90
    0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
91
    0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
92
    0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
93
    0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
94
    0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4};
95
96
// Nallocfuzz data to take a decision
97
uint32_t nalloc_random_state = 0;
98
__thread unsigned int nalloc_running = 0;
99
bool nalloc_initialized = false;
100
uint32_t nalloc_runs = 0;
101
102
// Nalloc fuzz parameters
103
uint32_t nalloc_bitmask = 0xFF;
104
bool nalloc_random_bitmask = true;
105
uint32_t nalloc_magic = 0x294cee63;
106
bool nalloc_verbose = false;
107
108
#ifdef NALLOC_ASAN
109
extern void __sanitizer_print_stack_trace(void);
110
#endif
111
112
// Generic init, using env variables to get parameters
113
void nalloc_init(const char *prog)
114
37
{
115
37
    if (nalloc_initialized) {
116
0
        return;
117
0
    }
118
37
    nalloc_initialized = true;
119
37
    char *bitmask = getenv("NALLOC_FREQ");
120
37
    if (bitmask) {
121
0
        int shift = atoi(bitmask);
122
0
        if (shift > 0 && shift < 31) {
123
0
            nalloc_bitmask = 1 << shift;
124
0
            nalloc_random_bitmask = false;
125
0
        } else if (shift == 0) {
126
0
            nalloc_random_bitmask = false;
127
0
            nalloc_bitmask = 0;
128
0
        }
129
37
    } else if (prog == NULL || strstr(prog, "nalloc") == NULL) {
130
18
        nalloc_random_bitmask = false;
131
18
        nalloc_bitmask = 0;
132
18
        return;
133
18
    }
134
135
19
    char *verbose = getenv("NALLOC_VERBOSE");
136
19
    if (verbose) {
137
0
        nalloc_verbose = true;
138
0
    }
139
19
}
140
141
// add one byte to the CRC
142
static inline void nalloc_random_update(uint8_t b)
143
237M
{
144
237M
    nalloc_random_state =
145
237M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
237M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
237M
}
ssh_client_config_fuzzer.c:nalloc_random_update
Line
Count
Source
143
33.3M
{
144
33.3M
    nalloc_random_state =
145
33.3M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
33.3M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
33.3M
}
ssh_pubkey_fuzzer.c:nalloc_random_update
Line
Count
Source
143
50.7M
{
144
50.7M
    nalloc_random_state =
145
50.7M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
50.7M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
50.7M
}
ssh_known_hosts_fuzzer.c:nalloc_random_update
Line
Count
Source
143
6.40M
{
144
6.40M
    nalloc_random_state =
145
6.40M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
6.40M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
6.40M
}
ssh_privkey_fuzzer.c:nalloc_random_update
Line
Count
Source
143
15.1M
{
144
15.1M
    nalloc_random_state =
145
15.1M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
15.1M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
15.1M
}
ssh_client_fuzzer.c:nalloc_random_update
Line
Count
Source
143
14.6M
{
144
14.6M
    nalloc_random_state =
145
14.6M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
14.6M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
14.6M
}
Unexecuted instantiation: ssh_scp_fuzzer.c:nalloc_random_update
ssh_server_fuzzer.c:nalloc_random_update
Line
Count
Source
143
21.7M
{
144
21.7M
    nalloc_random_state =
145
21.7M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
21.7M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
21.7M
}
ssh_bind_config_fuzzer.c:nalloc_random_update
Line
Count
Source
143
37.8M
{
144
37.8M
    nalloc_random_state =
145
37.8M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
37.8M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
37.8M
}
ssh_sshsig_fuzzer.c:nalloc_random_update
Line
Count
Source
143
22.6M
{
144
22.6M
    nalloc_random_state =
145
22.6M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
22.6M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
22.6M
}
ssh_sftp_attr_fuzzer.c:nalloc_random_update
Line
Count
Source
143
35.3M
{
144
35.3M
    nalloc_random_state =
145
35.3M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
35.3M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
35.3M
}
148
149
// Start the failure injections, using a buffer as seed
150
static int nalloc_start(const uint8_t *data, size_t size)
151
39.6k
{
152
39.6k
    if (nalloc_random_bitmask) {
153
18.5k
        if (nalloc_random_state & 0x10) {
154
9.30k
            nalloc_bitmask = 0xFFFFFFFF;
155
9.30k
        } else {
156
9.22k
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
9.22k
        }
158
21.1k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
21.1k
        return 2;
161
21.1k
    }
162
18.5k
    nalloc_random_state = 0;
163
202M
    for (size_t i = 0; i < size; i++) {
164
202M
        nalloc_random_update(data[i]);
165
202M
    }
166
18.5k
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
18.5k
    nalloc_runs++;
171
18.5k
    return 1;
172
18.5k
}
ssh_client_config_fuzzer.c:nalloc_start
Line
Count
Source
151
2.60k
{
152
2.60k
    if (nalloc_random_bitmask) {
153
2.60k
        if (nalloc_random_state & 0x10) {
154
1.28k
            nalloc_bitmask = 0xFFFFFFFF;
155
1.31k
        } else {
156
1.31k
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
1.31k
        }
158
2.60k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
0
        return 2;
161
0
    }
162
2.60k
    nalloc_random_state = 0;
163
32.8M
    for (size_t i = 0; i < size; i++) {
164
32.8M
        nalloc_random_update(data[i]);
165
32.8M
    }
166
2.60k
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
2.60k
    nalloc_runs++;
171
2.60k
    return 1;
172
2.60k
}
ssh_pubkey_fuzzer.c:nalloc_start
Line
Count
Source
151
4.56k
{
152
4.56k
    if (nalloc_random_bitmask) {
153
2.10k
        if (nalloc_random_state & 0x10) {
154
1.08k
            nalloc_bitmask = 0xFFFFFFFF;
155
1.08k
        } else {
156
1.01k
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
1.01k
        }
158
2.46k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
2.46k
        return 2;
161
2.46k
    }
162
2.10k
    nalloc_random_state = 0;
163
50.7M
    for (size_t i = 0; i < size; i++) {
164
50.7M
        nalloc_random_update(data[i]);
165
50.7M
    }
166
2.10k
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
2.10k
    nalloc_runs++;
171
2.10k
    return 1;
172
2.10k
}
ssh_known_hosts_fuzzer.c:nalloc_start
Line
Count
Source
151
4.58k
{
152
4.58k
    if (nalloc_random_bitmask) {
153
2.11k
        if (nalloc_random_state & 0x10) {
154
1.04k
            nalloc_bitmask = 0xFFFFFFFF;
155
1.06k
        } else {
156
1.06k
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
1.06k
        }
158
2.46k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
2.46k
        return 2;
161
2.46k
    }
162
2.11k
    nalloc_random_state = 0;
163
6.02M
    for (size_t i = 0; i < size; i++) {
164
6.01M
        nalloc_random_update(data[i]);
165
6.01M
    }
166
2.11k
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
2.11k
    nalloc_runs++;
171
2.11k
    return 1;
172
2.11k
}
ssh_privkey_fuzzer.c:nalloc_start
Line
Count
Source
151
230
{
152
230
    if (nalloc_random_bitmask) {
153
169
        if (nalloc_random_state & 0x10) {
154
84
            nalloc_bitmask = 0xFFFFFFFF;
155
85
        } else {
156
85
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
85
        }
158
169
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
61
        return 2;
161
61
    }
162
169
    nalloc_random_state = 0;
163
15.1M
    for (size_t i = 0; i < size; i++) {
164
15.1M
        nalloc_random_update(data[i]);
165
15.1M
    }
166
169
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
169
    nalloc_runs++;
171
169
    return 1;
172
169
}
ssh_client_fuzzer.c:nalloc_start
Line
Count
Source
151
6.32k
{
152
6.32k
    if (nalloc_random_bitmask) {
153
2.26k
        if (nalloc_random_state & 0x10) {
154
1.14k
            nalloc_bitmask = 0xFFFFFFFF;
155
1.14k
        } else {
156
1.11k
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
1.11k
        }
158
4.05k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
4.05k
        return 2;
161
4.05k
    }
162
2.26k
    nalloc_random_state = 0;
163
13.8M
    for (size_t i = 0; i < size; i++) {
164
13.8M
        nalloc_random_update(data[i]);
165
13.8M
    }
166
2.26k
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
2.26k
    nalloc_runs++;
171
2.26k
    return 1;
172
2.26k
}
ssh_scp_fuzzer.c:nalloc_start
Line
Count
Source
151
273
{
152
273
    if (nalloc_random_bitmask) {
153
0
        if (nalloc_random_state & 0x10) {
154
0
            nalloc_bitmask = 0xFFFFFFFF;
155
0
        } else {
156
0
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
0
        }
158
273
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
273
        return 2;
161
273
    }
162
0
    nalloc_random_state = 0;
163
0
    for (size_t i = 0; i < size; i++) {
164
0
        nalloc_random_update(data[i]);
165
0
    }
166
0
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
0
    nalloc_runs++;
171
0
    return 1;
172
0
}
ssh_server_fuzzer.c:nalloc_start
Line
Count
Source
151
13.4k
{
152
13.4k
    if (nalloc_random_bitmask) {
153
5.21k
        if (nalloc_random_state & 0x10) {
154
2.61k
            nalloc_bitmask = 0xFFFFFFFF;
155
2.61k
        } else {
156
2.60k
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
2.60k
        }
158
8.20k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
8.20k
        return 2;
161
8.20k
    }
162
5.21k
    nalloc_random_state = 0;
163
20.1M
    for (size_t i = 0; i < size; i++) {
164
20.1M
        nalloc_random_update(data[i]);
165
20.1M
    }
166
5.21k
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
5.21k
    nalloc_runs++;
171
5.21k
    return 1;
172
5.21k
}
ssh_bind_config_fuzzer.c:nalloc_start
Line
Count
Source
151
1.64k
{
152
1.64k
    if (nalloc_random_bitmask) {
153
1.64k
        if (nalloc_random_state & 0x10) {
154
841
            nalloc_bitmask = 0xFFFFFFFF;
155
841
        } else {
156
805
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
805
        }
158
1.64k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
0
        return 2;
161
0
    }
162
1.64k
    nalloc_random_state = 0;
163
5.94M
    for (size_t i = 0; i < size; i++) {
164
5.94M
        nalloc_random_update(data[i]);
165
5.94M
    }
166
1.64k
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
1.64k
    nalloc_runs++;
171
1.64k
    return 1;
172
1.64k
}
ssh_sshsig_fuzzer.c:nalloc_start
Line
Count
Source
151
4.62k
{
152
4.62k
    if (nalloc_random_bitmask) {
153
1.64k
        if (nalloc_random_state & 0x10) {
154
836
            nalloc_bitmask = 0xFFFFFFFF;
155
836
        } else {
156
810
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
810
        }
158
2.97k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
2.97k
        return 2;
161
2.97k
    }
162
1.64k
    nalloc_random_state = 0;
163
22.6M
    for (size_t i = 0; i < size; i++) {
164
22.6M
        nalloc_random_update(data[i]);
165
22.6M
    }
166
1.64k
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
1.64k
    nalloc_runs++;
171
1.64k
    return 1;
172
1.64k
}
ssh_sftp_attr_fuzzer.c:nalloc_start
Line
Count
Source
151
1.41k
{
152
1.41k
    if (nalloc_random_bitmask) {
153
761
        if (nalloc_random_state & 0x10) {
154
362
            nalloc_bitmask = 0xFFFFFFFF;
155
399
        } else {
156
399
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
399
        }
158
761
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
652
        return 2;
161
652
    }
162
761
    nalloc_random_state = 0;
163
35.1M
    for (size_t i = 0; i < size; i++) {
164
35.1M
        nalloc_random_update(data[i]);
165
35.1M
    }
166
761
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
761
    nalloc_runs++;
171
761
    return 1;
172
761
}
173
174
// Stop the failure injections
175
static void nalloc_end()
176
39.6k
{
177
39.6k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
39.6k
}
ssh_client_config_fuzzer.c:nalloc_end
Line
Count
Source
176
2.60k
{
177
2.60k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
2.60k
}
ssh_pubkey_fuzzer.c:nalloc_end
Line
Count
Source
176
4.56k
{
177
4.56k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
4.56k
}
ssh_known_hosts_fuzzer.c:nalloc_end
Line
Count
Source
176
4.58k
{
177
4.58k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
4.58k
}
ssh_privkey_fuzzer.c:nalloc_end
Line
Count
Source
176
230
{
177
230
    __sync_fetch_and_sub(&nalloc_running, 1);
178
230
}
ssh_client_fuzzer.c:nalloc_end
Line
Count
Source
176
6.32k
{
177
6.32k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
6.32k
}
ssh_scp_fuzzer.c:nalloc_end
Line
Count
Source
176
273
{
177
273
    __sync_fetch_and_sub(&nalloc_running, 1);
178
273
}
ssh_server_fuzzer.c:nalloc_end
Line
Count
Source
176
13.4k
{
177
13.4k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
13.4k
}
ssh_bind_config_fuzzer.c:nalloc_end
Line
Count
Source
176
1.64k
{
177
1.64k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
1.64k
}
ssh_sshsig_fuzzer.c:nalloc_end
Line
Count
Source
176
4.62k
{
177
4.62k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
4.62k
}
ssh_sftp_attr_fuzzer.c:nalloc_end
Line
Count
Source
176
1.41k
{
177
1.41k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
1.41k
}
179
180
static bool nalloc_backtrace_exclude(size_t size, const char *op)
181
9.86k
{
182
9.86k
    if (nalloc_verbose) {
183
0
        fprintf(stderr, "failed %s(%zu) \n", op, size);
184
#ifdef NALLOC_ASAN
185
        __sanitizer_print_stack_trace();
186
#endif
187
0
    }
188
189
9.86k
    return false;
190
9.86k
}
ssh_client_config_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
1.31k
{
182
1.31k
    if (nalloc_verbose) {
183
0
        fprintf(stderr, "failed %s(%zu) \n", op, size);
184
#ifdef NALLOC_ASAN
185
        __sanitizer_print_stack_trace();
186
#endif
187
0
    }
188
189
    return false;
190
1.31k
}
ssh_pubkey_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
1.63k
{
182
1.63k
    if (nalloc_verbose) {
183
0
        fprintf(stderr, "failed %s(%zu) \n", op, size);
184
#ifdef NALLOC_ASAN
185
        __sanitizer_print_stack_trace();
186
#endif
187
0
    }
188
189
    return false;
190
1.63k
}
ssh_known_hosts_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
1.20k
{
182
1.20k
    if (nalloc_verbose) {
183
0
        fprintf(stderr, "failed %s(%zu) \n", op, size);
184
#ifdef NALLOC_ASAN
185
        __sanitizer_print_stack_trace();
186
#endif
187
0
    }
188
189
    return false;
190
1.20k
}
ssh_privkey_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
110
{
182
110
    if (nalloc_verbose) {
183
0
        fprintf(stderr, "failed %s(%zu) \n", op, size);
184
#ifdef NALLOC_ASAN
185
        __sanitizer_print_stack_trace();
186
#endif
187
0
    }
188
189
    return false;
190
110
}
ssh_client_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
1.11k
{
182
1.11k
    if (nalloc_verbose) {
183
0
        fprintf(stderr, "failed %s(%zu) \n", op, size);
184
#ifdef NALLOC_ASAN
185
        __sanitizer_print_stack_trace();
186
#endif
187
0
    }
188
189
    return false;
190
1.11k
}
Unexecuted instantiation: ssh_scp_fuzzer.c:nalloc_backtrace_exclude
ssh_server_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
2.60k
{
182
2.60k
    if (nalloc_verbose) {
183
0
        fprintf(stderr, "failed %s(%zu) \n", op, size);
184
#ifdef NALLOC_ASAN
185
        __sanitizer_print_stack_trace();
186
#endif
187
0
    }
188
189
    return false;
190
2.60k
}
ssh_bind_config_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
741
{
182
741
    if (nalloc_verbose) {
183
0
        fprintf(stderr, "failed %s(%zu) \n", op, size);
184
#ifdef NALLOC_ASAN
185
        __sanitizer_print_stack_trace();
186
#endif
187
0
    }
188
189
    return false;
190
741
}
ssh_sshsig_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
742
{
182
742
    if (nalloc_verbose) {
183
0
        fprintf(stderr, "failed %s(%zu) \n", op, size);
184
#ifdef NALLOC_ASAN
185
        __sanitizer_print_stack_trace();
186
#endif
187
0
    }
188
189
    return false;
190
742
}
ssh_sftp_attr_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
399
{
182
399
    if (nalloc_verbose) {
183
0
        fprintf(stderr, "failed %s(%zu) \n", op, size);
184
#ifdef NALLOC_ASAN
185
        __sanitizer_print_stack_trace();
186
#endif
187
0
    }
188
189
    return false;
190
399
}
191
192
//
193
static bool nalloc_fail(size_t size, const char *op)
194
43.6M
{
195
    // do not fail before thread init
196
43.6M
    if (nalloc_runs == 0) {
197
9.13M
        return false;
198
9.13M
    }
199
34.4M
    if (__sync_fetch_and_add(&nalloc_running, 1) != 1) {
200
        // do not fail allocations outside of fuzzer input
201
        // and do not fail inside of this function
202
133k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
133k
        return false;
204
133k
    }
205
34.3M
    nalloc_random_update((uint8_t)size);
206
34.3M
    if (size >= 0x100) {
207
1.01M
        nalloc_random_update((uint8_t)(size >> 8));
208
1.01M
        if (size >= 0x10000) {
209
1.31k
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
1.31k
        }
212
1.01M
    }
213
34.3M
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
9.86k
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
9.86k
        __sync_fetch_and_sub(&nalloc_running, 1);
219
9.86k
        return true;
220
9.86k
    }
221
34.3M
    __sync_fetch_and_sub(&nalloc_running, 1);
222
34.3M
    return false;
223
34.3M
}
ssh_client_config_fuzzer.c:nalloc_fail
Line
Count
Source
194
534k
{
195
    // do not fail before thread init
196
534k
    if (nalloc_runs == 0) {
197
23.7k
        return false;
198
23.7k
    }
199
510k
    if (__sync_fetch_and_add(&nalloc_running, 1) != 1) {
200
        // do not fail allocations outside of fuzzer input
201
        // and do not fail inside of this function
202
15.6k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
15.6k
        return false;
204
15.6k
    }
205
495k
    nalloc_random_update((uint8_t)size);
206
495k
    if (size >= 0x100) {
207
18.7k
        nalloc_random_update((uint8_t)(size >> 8));
208
18.7k
        if (size >= 0x10000) {
209
0
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
0
        }
212
18.7k
    }
213
495k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
1.31k
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
1.31k
        __sync_fetch_and_sub(&nalloc_running, 1);
219
1.31k
        return true;
220
1.31k
    }
221
493k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
495k
}
ssh_pubkey_fuzzer.c:nalloc_fail
Line
Count
Source
194
165k
{
195
    // do not fail before thread init
196
165k
    if (nalloc_runs == 0) {
197
121k
        return false;
198
121k
    }
199
44.4k
    if (__sync_fetch_and_add(&nalloc_running, 1) != 1) {
200
        // do not fail allocations outside of fuzzer input
201
        // and do not fail inside of this function
202
14.7k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
14.7k
        return false;
204
14.7k
    }
205
29.7k
    nalloc_random_update((uint8_t)size);
206
29.7k
    if (size >= 0x100) {
207
5.79k
        nalloc_random_update((uint8_t)(size >> 8));
208
5.79k
        if (size >= 0x10000) {
209
207
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
207
        }
212
5.79k
    }
213
29.7k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
1.63k
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
1.63k
        __sync_fetch_and_sub(&nalloc_running, 1);
219
1.63k
        return true;
220
1.63k
    }
221
28.1k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
29.7k
}
ssh_known_hosts_fuzzer.c:nalloc_fail
Line
Count
Source
194
1.54M
{
195
    // do not fail before thread init
196
1.54M
    if (nalloc_runs == 0) {
197
1.15M
        return false;
198
1.15M
    }
199
390k
    if (__sync_fetch_and_add(&nalloc_running, 1) != 1) {
200
        // do not fail allocations outside of fuzzer input
201
        // and do not fail inside of this function
202
16.9k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
16.9k
        return false;
204
16.9k
    }
205
373k
    nalloc_random_update((uint8_t)size);
206
373k
    if (size >= 0x100) {
207
10.3k
        nalloc_random_update((uint8_t)(size >> 8));
208
10.3k
        if (size >= 0x10000) {
209
0
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
0
        }
212
10.3k
    }
213
373k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
1.20k
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
1.20k
        __sync_fetch_and_sub(&nalloc_running, 1);
219
1.20k
        return true;
220
1.20k
    }
221
372k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
373k
}
ssh_privkey_fuzzer.c:nalloc_fail
Line
Count
Source
194
7.79k
{
195
    // do not fail before thread init
196
7.79k
    if (nalloc_runs == 0) {
197
6.30k
        return false;
198
6.30k
    }
199
1.48k
    if (__sync_fetch_and_add(&nalloc_running, 1) != 1) {
200
        // do not fail allocations outside of fuzzer input
201
        // and do not fail inside of this function
202
847
        __sync_fetch_and_sub(&nalloc_running, 1);
203
847
        return false;
204
847
    }
205
636
    nalloc_random_update((uint8_t)size);
206
636
    if (size >= 0x100) {
207
94
        nalloc_random_update((uint8_t)(size >> 8));
208
94
        if (size >= 0x10000) {
209
28
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
28
        }
212
94
    }
213
636
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
110
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
110
        __sync_fetch_and_sub(&nalloc_running, 1);
219
110
        return true;
220
110
    }
221
526
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
636
}
ssh_client_fuzzer.c:nalloc_fail
Line
Count
Source
194
2.90M
{
195
    // do not fail before thread init
196
2.90M
    if (nalloc_runs == 0) {
197
2.36M
        return false;
198
2.36M
    }
199
538k
    if (__sync_fetch_and_add(&nalloc_running, 1) != 1) {
200
        // do not fail allocations outside of fuzzer input
201
        // and do not fail inside of this function
202
13.6k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
13.6k
        return false;
204
13.6k
    }
205
525k
    nalloc_random_update((uint8_t)size);
206
525k
    if (size >= 0x100) {
207
265k
        nalloc_random_update((uint8_t)(size >> 8));
208
265k
        if (size >= 0x10000) {
209
110
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
110
        }
212
265k
    }
213
525k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
1.11k
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
1.11k
        __sync_fetch_and_sub(&nalloc_running, 1);
219
1.11k
        return true;
220
1.11k
    }
221
524k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
525k
}
ssh_scp_fuzzer.c:nalloc_fail
Line
Count
Source
194
359k
{
195
    // do not fail before thread init
196
359k
    if (nalloc_runs == 0) {
197
359k
        return false;
198
359k
    }
199
18.4E
    if (__sync_fetch_and_add(&nalloc_running, 1) != 1) {
200
        // do not fail allocations outside of fuzzer input
201
        // and do not fail inside of this function
202
0
        __sync_fetch_and_sub(&nalloc_running, 1);
203
0
        return false;
204
0
    }
205
18.4E
    nalloc_random_update((uint8_t)size);
206
18.4E
    if (size >= 0x100) {
207
0
        nalloc_random_update((uint8_t)(size >> 8));
208
0
        if (size >= 0x10000) {
209
0
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
0
        }
212
0
    }
213
18.4E
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
0
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
0
        __sync_fetch_and_sub(&nalloc_running, 1);
219
0
        return true;
220
0
    }
221
18.4E
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
18.4E
}
ssh_server_fuzzer.c:nalloc_fail
Line
Count
Source
194
6.13M
{
195
    // do not fail before thread init
196
6.13M
    if (nalloc_runs == 0) {
197
4.87M
        return false;
198
4.87M
    }
199
1.26M
    if (__sync_fetch_and_add(&nalloc_running, 1) != 1) {
200
        // do not fail allocations outside of fuzzer input
201
        // and do not fail inside of this function
202
50.2k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
50.2k
        return false;
204
50.2k
    }
205
1.21M
    nalloc_random_update((uint8_t)size);
206
1.21M
    if (size >= 0x100) {
207
336k
        nalloc_random_update((uint8_t)(size >> 8));
208
336k
        if (size >= 0x10000) {
209
137
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
137
        }
212
336k
    }
213
1.21M
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
2.60k
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
2.60k
        __sync_fetch_and_sub(&nalloc_running, 1);
219
2.60k
        return true;
220
2.60k
    }
221
1.20M
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
1.21M
}
ssh_bind_config_fuzzer.c:nalloc_fail
Line
Count
Source
194
31.5M
{
195
    // do not fail before thread init
196
31.5M
    if (nalloc_runs == 0) {
197
15.0k
        return false;
198
15.0k
    }
199
31.5M
    if (__sync_fetch_and_add(&nalloc_running, 1) != 1) {
200
        // do not fail allocations outside of fuzzer input
201
        // and do not fail inside of this function
202
9.87k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
9.87k
        return false;
204
9.87k
    }
205
31.5M
    nalloc_random_update((uint8_t)size);
206
31.5M
    if (size >= 0x100) {
207
373k
        nalloc_random_update((uint8_t)(size >> 8));
208
373k
        if (size >= 0x10000) {
209
356
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
356
        }
212
373k
    }
213
31.5M
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
741
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
741
        __sync_fetch_and_sub(&nalloc_running, 1);
219
741
        return true;
220
741
    }
221
31.4M
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
31.5M
}
ssh_sshsig_fuzzer.c:nalloc_fail
Line
Count
Source
194
146k
{
195
    // do not fail before thread init
196
146k
    if (nalloc_runs == 0) {
197
123k
        return false;
198
123k
    }
199
23.2k
    if (__sync_fetch_and_add(&nalloc_running, 1) != 1) {
200
        // do not fail allocations outside of fuzzer input
201
        // and do not fail inside of this function
202
8.22k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
8.22k
        return false;
204
8.22k
    }
205
15.0k
    nalloc_random_update((uint8_t)size);
206
15.0k
    if (size >= 0x100) {
207
1.03k
        nalloc_random_update((uint8_t)(size >> 8));
208
1.03k
        if (size >= 0x10000) {
209
163
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
163
        }
212
1.03k
    }
213
15.0k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
742
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
742
        __sync_fetch_and_sub(&nalloc_running, 1);
219
742
        return true;
220
742
    }
221
14.2k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
15.0k
}
ssh_sftp_attr_fuzzer.c:nalloc_fail
Line
Count
Source
194
277k
{
195
    // do not fail before thread init
196
277k
    if (nalloc_runs == 0) {
197
83.8k
        return false;
198
83.8k
    }
199
194k
    if (__sync_fetch_and_add(&nalloc_running, 1) != 1) {
200
        // do not fail allocations outside of fuzzer input
201
        // and do not fail inside of this function
202
3.80k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
3.80k
        return false;
204
3.80k
    }
205
190k
    nalloc_random_update((uint8_t)size);
206
190k
    if (size >= 0x100) {
207
2.11k
        nalloc_random_update((uint8_t)(size >> 8));
208
2.11k
        if (size >= 0x10000) {
209
314
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
314
        }
212
2.11k
    }
213
190k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
399
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
399
        __sync_fetch_and_sub(&nalloc_running, 1);
219
399
        return true;
220
399
    }
221
189k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
190k
}
224
225
// ASAN interceptor for libc routines
226
#ifdef NALLOC_ASAN
227
extern void *__interceptor_malloc(size_t);
228
extern void *__interceptor_calloc(size_t, size_t);
229
extern void *__interceptor_realloc(void *, size_t);
230
extern void *__interceptor_reallocarray(void *, size_t, size_t);
231
232
extern ssize_t __interceptor_read(int, void *, size_t);
233
extern ssize_t __interceptor_write(int, const void *, size_t);
234
extern ssize_t __interceptor_recv(int, void *, size_t, int);
235
extern ssize_t __interceptor_send(int, const void *, size_t, int);
236
237
#define nalloc_malloc(s)             __interceptor_malloc(s)
238
#define nalloc_calloc(s, n)          __interceptor_calloc(s, n)
239
#define nalloc_realloc(p, s)         __interceptor_realloc(p, s)
240
#define nalloc_reallocarray(p, s, n) __interceptor_reallocarray(p, s, n)
241
242
#define nalloc_read(f, b, s)    __interceptor_read(f, b, s)
243
#define nalloc_write(f, b, s)   __interceptor_write(f, b, s)
244
#define nalloc_recv(f, b, s, x) __interceptor_recv(f, b, s, x)
245
#define nalloc_send(f, b, s, x) __interceptor_send(f, b, s, x)
246
247
#else
248
extern void *__libc_malloc(size_t);
249
extern void *__libc_calloc(size_t, size_t);
250
extern void *__libc_realloc(void *, size_t);
251
extern void *__libc_reallocarray(void *, size_t, size_t);
252
253
extern ssize_t __read(int, void *, size_t);
254
extern ssize_t __write(int, const void *, size_t);
255
extern ssize_t __recv(int, void *, size_t, int);
256
extern ssize_t __send(int, const void *, size_t, int);
257
258
40.2M
#define nalloc_malloc(s)             __libc_malloc(s)
259
2.62M
#define nalloc_calloc(s, n)          __libc_calloc(s, n)
260
661k
#define nalloc_realloc(p, s)         __libc_realloc(p, s)
261
0
#define nalloc_reallocarray(p, s, n) __libc_reallocarray(p, s, n)
262
263
0
#define nalloc_read(f, b, s)    __read(f, b, s)
264
4.56k
#define nalloc_write(f, b, s)   __write(f, b, s)
265
36.1k
#define nalloc_recv(f, b, s, x) __recv(f, b, s, x)
266
46.6k
#define nalloc_send(f, b, s, x) __send(f, b, s, x)
267
#endif
268
269
// nalloc standard function overwrites with pseudo-random failures
270
ssize_t read(int fd, void *buf, size_t count)
271
0
{
272
0
    if (nalloc_fail(count, "read")) {
273
0
        errno = EIO;
274
0
        return -1;
275
0
    }
276
0
    return nalloc_read(fd, buf, count);
277
0
}
278
279
ssize_t write(int fd, const void *buf, size_t count)
280
4.56k
{
281
4.56k
    if (nalloc_fail(count, "write")) {
282
0
        errno = EIO;
283
0
        return -1;
284
0
    }
285
4.56k
    return nalloc_write(fd, buf, count);
286
4.56k
}
287
288
ssize_t recv(int fd, void *buf, size_t count, int flags)
289
36.1k
{
290
36.1k
    if (nalloc_fail(count, "recv")) {
291
0
        errno = EIO;
292
0
        return -1;
293
0
    }
294
36.1k
    return nalloc_recv(fd, buf, count, flags);
295
36.1k
}
296
297
ssize_t send(int fd, const void *buf, size_t count, int flags)
298
46.6k
{
299
46.6k
    if (nalloc_fail(count, "send")) {
300
0
        errno = EIO;
301
0
        return -1;
302
0
    }
303
46.6k
    return nalloc_send(fd, buf, count, flags);
304
46.6k
}
305
306
void *calloc(size_t nmemb, size_t size)
307
2.62M
{
308
2.62M
    if (nalloc_fail(size, "calloc")) {
309
6.00k
        errno = ENOMEM;
310
6.00k
        return NULL;
311
6.00k
    }
312
2.62M
    return nalloc_calloc(nmemb, size);
313
2.62M
}
314
315
void *malloc(size_t size)
316
40.2M
{
317
40.2M
    if (nalloc_fail(size, "malloc")) {
318
3.66k
        errno = ENOMEM;
319
3.66k
        return NULL;
320
3.66k
    }
321
40.2M
    return nalloc_malloc(size);
322
40.2M
}
323
324
void *realloc(void *ptr, size_t size)
325
662k
{
326
662k
    if (nalloc_fail(size, "realloc")) {
327
194
        errno = ENOMEM;
328
194
        return NULL;
329
194
    }
330
661k
    return nalloc_realloc(ptr, size);
331
662k
}
332
333
void *reallocarray(void *ptr, size_t nmemb, size_t size)
334
0
{
335
0
    if (nalloc_fail(size, "reallocarray")) {
336
0
        errno = ENOMEM;
337
0
        return NULL;
338
0
    }
339
0
    return nalloc_reallocarray(ptr, nmemb, size);
340
0
}
341
342
#ifdef __cplusplus
343
} // extern "C" {
344
#endif