Coverage Report

Created: 2026-09-03 06:32

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
38
{
115
38
    if (nalloc_initialized) {
116
0
        return;
117
0
    }
118
38
    nalloc_initialized = true;
119
38
    char *bitmask = getenv("NALLOC_FREQ");
120
38
    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
38
    } else if (prog == NULL || strstr(prog, "nalloc") == NULL) {
130
19
        nalloc_random_bitmask = false;
131
19
        nalloc_bitmask = 0;
132
19
        return;
133
19
    }
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
214M
{
144
214M
    nalloc_random_state =
145
214M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
214M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
214M
}
ssh_client_config_fuzzer.c:nalloc_random_update
Line
Count
Source
143
36.0M
{
144
36.0M
    nalloc_random_state =
145
36.0M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
36.0M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
36.0M
}
ssh_pubkey_fuzzer.c:nalloc_random_update
Line
Count
Source
143
40.2M
{
144
40.2M
    nalloc_random_state =
145
40.2M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
40.2M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
40.2M
}
ssh_known_hosts_fuzzer.c:nalloc_random_update
Line
Count
Source
143
9.15M
{
144
9.15M
    nalloc_random_state =
145
9.15M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
9.15M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
9.15M
}
ssh_privkey_fuzzer.c:nalloc_random_update
Line
Count
Source
143
15.6M
{
144
15.6M
    nalloc_random_state =
145
15.6M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
15.6M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
15.6M
}
ssh_client_fuzzer.c:nalloc_random_update
Line
Count
Source
143
9.45M
{
144
9.45M
    nalloc_random_state =
145
9.45M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
9.45M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
9.45M
}
Unexecuted instantiation: ssh_scp_fuzzer.c:nalloc_random_update
ssh_server_fuzzer.c:nalloc_random_update
Line
Count
Source
143
7.95M
{
144
7.95M
    nalloc_random_state =
145
7.95M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
7.95M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
7.95M
}
ssh_bind_config_fuzzer.c:nalloc_random_update
Line
Count
Source
143
57.2M
{
144
57.2M
    nalloc_random_state =
145
57.2M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
57.2M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
57.2M
}
ssh_sshsig_fuzzer.c:nalloc_random_update
Line
Count
Source
143
19.6M
{
144
19.6M
    nalloc_random_state =
145
19.6M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
19.6M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
19.6M
}
ssh_sftp_attr_fuzzer.c:nalloc_random_update
Line
Count
Source
143
19.5M
{
144
19.5M
    nalloc_random_state =
145
19.5M
        ((uint32_t)((uint32_t)nalloc_random_state << 8)) ^
146
19.5M
        nalloc_crc32_table[((nalloc_random_state >> 24) ^ b) & 0xFF];
147
19.5M
}
148
149
// Start the failure injections, using a buffer as seed
150
static int nalloc_start(const uint8_t *data, size_t size)
151
36.8k
{
152
36.8k
    if (nalloc_random_bitmask) {
153
8.95k
        if (nalloc_random_state & 0x10) {
154
4.49k
            nalloc_bitmask = 0xFFFFFFFF;
155
4.49k
        } else {
156
4.45k
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
4.45k
        }
158
27.8k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
27.8k
        return 2;
161
27.8k
    }
162
8.95k
    nalloc_random_state = 0;
163
160M
    for (size_t i = 0; i < size; i++) {
164
160M
        nalloc_random_update(data[i]);
165
160M
    }
166
8.95k
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
8.95k
    nalloc_runs++;
171
8.95k
    return 1;
172
8.95k
}
ssh_client_config_fuzzer.c:nalloc_start
Line
Count
Source
151
8.94k
{
152
8.94k
    if (nalloc_random_bitmask) {
153
1.75k
        if (nalloc_random_state & 0x10) {
154
874
            nalloc_bitmask = 0xFFFFFFFF;
155
882
        } else {
156
882
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
882
        }
158
7.18k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
7.18k
        return 2;
161
7.18k
    }
162
1.75k
    nalloc_random_state = 0;
163
35.4M
    for (size_t i = 0; i < size; i++) {
164
35.4M
        nalloc_random_update(data[i]);
165
35.4M
    }
166
1.75k
    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.75k
    nalloc_runs++;
171
1.75k
    return 1;
172
1.75k
}
ssh_pubkey_fuzzer.c:nalloc_start
Line
Count
Source
151
3.05k
{
152
3.05k
    if (nalloc_random_bitmask) {
153
796
        if (nalloc_random_state & 0x10) {
154
401
            nalloc_bitmask = 0xFFFFFFFF;
155
401
        } else {
156
395
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
395
        }
158
2.26k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
2.26k
        return 2;
161
2.26k
    }
162
796
    nalloc_random_state = 0;
163
40.2M
    for (size_t i = 0; i < size; i++) {
164
40.2M
        nalloc_random_update(data[i]);
165
40.2M
    }
166
796
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
796
    nalloc_runs++;
171
796
    return 1;
172
796
}
ssh_known_hosts_fuzzer.c:nalloc_start
Line
Count
Source
151
3.45k
{
152
3.45k
    if (nalloc_random_bitmask) {
153
1.06k
        if (nalloc_random_state & 0x10) {
154
521
            nalloc_bitmask = 0xFFFFFFFF;
155
544
        } else {
156
544
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
544
        }
158
2.39k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
2.39k
        return 2;
161
2.39k
    }
162
1.06k
    nalloc_random_state = 0;
163
8.31M
    for (size_t i = 0; i < size; i++) {
164
8.31M
        nalloc_random_update(data[i]);
165
8.31M
    }
166
1.06k
    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.06k
    nalloc_runs++;
171
1.06k
    return 1;
172
1.06k
}
ssh_privkey_fuzzer.c:nalloc_start
Line
Count
Source
151
203
{
152
203
    if (nalloc_random_bitmask) {
153
142
        if (nalloc_random_state & 0x10) {
154
75
            nalloc_bitmask = 0xFFFFFFFF;
155
75
        } else {
156
67
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
67
        }
158
142
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
61
        return 2;
161
61
    }
162
142
    nalloc_random_state = 0;
163
15.6M
    for (size_t i = 0; i < size; i++) {
164
15.6M
        nalloc_random_update(data[i]);
165
15.6M
    }
166
142
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
142
    nalloc_runs++;
171
142
    return 1;
172
142
}
ssh_client_fuzzer.c:nalloc_start
Line
Count
Source
151
4.74k
{
152
4.74k
    if (nalloc_random_bitmask) {
153
689
        if (nalloc_random_state & 0x10) {
154
350
            nalloc_bitmask = 0xFFFFFFFF;
155
350
        } else {
156
339
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
339
        }
158
4.05k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
4.05k
        return 2;
161
4.05k
    }
162
689
    nalloc_random_state = 0;
163
9.18M
    for (size_t i = 0; i < size; i++) {
164
9.18M
        nalloc_random_update(data[i]);
165
9.18M
    }
166
689
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
689
    nalloc_runs++;
171
689
    return 1;
172
689
}
ssh_scp_fuzzer.c:nalloc_start
Line
Count
Source
151
252
{
152
252
    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
252
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
252
        return 2;
161
252
    }
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
9.02k
{
152
9.02k
    if (nalloc_random_bitmask) {
153
901
        if (nalloc_random_state & 0x10) {
154
463
            nalloc_bitmask = 0xFFFFFFFF;
155
463
        } else {
156
438
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
438
        }
158
8.12k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
8.12k
        return 2;
161
8.12k
    }
162
901
    nalloc_random_state = 0;
163
7.59M
    for (size_t i = 0; i < size; i++) {
164
7.59M
        nalloc_random_update(data[i]);
165
7.59M
    }
166
901
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
901
    nalloc_runs++;
171
901
    return 1;
172
901
}
ssh_bind_config_fuzzer.c:nalloc_start
Line
Count
Source
151
2.11k
{
152
2.11k
    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.11k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
0
        return 2;
161
0
    }
162
2.11k
    nalloc_random_state = 0;
163
5.45M
    for (size_t i = 0; i < size; i++) {
164
5.44M
        nalloc_random_update(data[i]);
165
5.44M
    }
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_sshsig_fuzzer.c:nalloc_start
Line
Count
Source
151
3.91k
{
152
3.91k
    if (nalloc_random_bitmask) {
153
991
        if (nalloc_random_state & 0x10) {
154
501
            nalloc_bitmask = 0xFFFFFFFF;
155
501
        } else {
156
490
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
490
        }
158
2.92k
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
2.92k
        return 2;
161
2.92k
    }
162
991
    nalloc_random_state = 0;
163
19.6M
    for (size_t i = 0; i < size; i++) {
164
19.6M
        nalloc_random_update(data[i]);
165
19.6M
    }
166
991
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
991
    nalloc_runs++;
171
991
    return 1;
172
991
}
ssh_sftp_attr_fuzzer.c:nalloc_start
Line
Count
Source
151
1.10k
{
152
1.10k
    if (nalloc_random_bitmask) {
153
497
        if (nalloc_random_state & 0x10) {
154
265
            nalloc_bitmask = 0xFFFFFFFF;
155
265
        } else {
156
232
            nalloc_bitmask = 1 << (5 + (nalloc_random_state & 0xF));
157
232
        }
158
612
    } else if (nalloc_bitmask == 0) {
159
        // nalloc disabled
160
612
        return 2;
161
612
    }
162
497
    nalloc_random_state = 0;
163
19.2M
    for (size_t i = 0; i < size; i++) {
164
19.2M
        nalloc_random_update(data[i]);
165
19.2M
    }
166
497
    if (__sync_fetch_and_add(&nalloc_running, 1)) {
167
0
        __sync_fetch_and_sub(&nalloc_running, 1);
168
0
        return 0;
169
0
    }
170
497
    nalloc_runs++;
171
497
    return 1;
172
497
}
173
174
// Stop the failure injections
175
static void nalloc_end()
176
36.8k
{
177
36.8k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
36.8k
}
ssh_client_config_fuzzer.c:nalloc_end
Line
Count
Source
176
8.94k
{
177
8.94k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
8.94k
}
ssh_pubkey_fuzzer.c:nalloc_end
Line
Count
Source
176
3.05k
{
177
3.05k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
3.05k
}
ssh_known_hosts_fuzzer.c:nalloc_end
Line
Count
Source
176
3.45k
{
177
3.45k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
3.45k
}
ssh_privkey_fuzzer.c:nalloc_end
Line
Count
Source
176
203
{
177
203
    __sync_fetch_and_sub(&nalloc_running, 1);
178
203
}
ssh_client_fuzzer.c:nalloc_end
Line
Count
Source
176
4.74k
{
177
4.74k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
4.74k
}
ssh_scp_fuzzer.c:nalloc_end
Line
Count
Source
176
252
{
177
252
    __sync_fetch_and_sub(&nalloc_running, 1);
178
252
}
ssh_server_fuzzer.c:nalloc_end
Line
Count
Source
176
9.02k
{
177
9.02k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
9.02k
}
ssh_bind_config_fuzzer.c:nalloc_end
Line
Count
Source
176
2.11k
{
177
2.11k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
2.11k
}
ssh_sshsig_fuzzer.c:nalloc_end
Line
Count
Source
176
3.91k
{
177
3.91k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
3.91k
}
ssh_sftp_attr_fuzzer.c:nalloc_end
Line
Count
Source
176
1.10k
{
177
1.10k
    __sync_fetch_and_sub(&nalloc_running, 1);
178
1.10k
}
179
180
static bool nalloc_backtrace_exclude(size_t size, const char *op)
181
4.63k
{
182
4.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
4.63k
    return false;
190
4.63k
}
ssh_client_config_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
882
{
182
882
    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
882
}
ssh_pubkey_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
636
{
182
636
    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
636
}
ssh_known_hosts_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
626
{
182
626
    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
626
}
ssh_privkey_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
87
{
182
87
    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
87
}
ssh_client_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
339
{
182
339
    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
339
}
Unexecuted instantiation: ssh_scp_fuzzer.c:nalloc_backtrace_exclude
ssh_server_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
438
{
182
438
    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
438
}
ssh_bind_config_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
958
{
182
958
    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
958
}
ssh_sshsig_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
432
{
182
432
    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
432
}
ssh_sftp_attr_fuzzer.c:nalloc_backtrace_exclude
Line
Count
Source
181
232
{
182
232
    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
232
}
191
192
//
193
static bool nalloc_fail(size_t size, const char *op)
194
63.4M
{
195
    // do not fail before thread init
196
63.4M
    if (nalloc_runs == 0) {
197
10.2M
        return false;
198
10.2M
    }
199
53.1M
    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
58.2k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
58.2k
        return false;
204
58.2k
    }
205
53.1M
    nalloc_random_update((uint8_t)size);
206
53.1M
    if (size >= 0x100) {
207
1.06M
        nalloc_random_update((uint8_t)(size >> 8));
208
1.06M
        if (size >= 0x10000) {
209
5.07k
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
5.07k
        }
212
1.06M
    }
213
53.1M
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
4.63k
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
4.63k
        __sync_fetch_and_sub(&nalloc_running, 1);
219
4.63k
        return true;
220
4.63k
    }
221
53.0M
    __sync_fetch_and_sub(&nalloc_running, 1);
222
53.0M
    return false;
223
53.1M
}
ssh_client_config_fuzzer.c:nalloc_fail
Line
Count
Source
194
1.27M
{
195
    // do not fail before thread init
196
1.27M
    if (nalloc_runs == 0) {
197
713k
        return false;
198
713k
    }
199
563k
    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
10.5k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
10.5k
        return false;
204
10.5k
    }
205
553k
    nalloc_random_update((uint8_t)size);
206
553k
    if (size >= 0x100) {
207
15.5k
        nalloc_random_update((uint8_t)(size >> 8));
208
15.5k
        if (size >= 0x10000) {
209
0
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
0
        }
212
15.5k
    }
213
553k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
882
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
882
        __sync_fetch_and_sub(&nalloc_running, 1);
219
882
        return true;
220
882
    }
221
552k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
553k
}
ssh_pubkey_fuzzer.c:nalloc_fail
Line
Count
Source
194
119k
{
195
    // do not fail before thread init
196
119k
    if (nalloc_runs == 0) {
197
101k
        return false;
198
101k
    }
199
18.6k
    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
5.57k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
5.57k
        return false;
204
5.57k
    }
205
13.0k
    nalloc_random_update((uint8_t)size);
206
13.0k
    if (size >= 0x100) {
207
2.42k
        nalloc_random_update((uint8_t)(size >> 8));
208
2.42k
        if (size >= 0x10000) {
209
131
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
131
        }
212
2.42k
    }
213
13.0k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
636
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
636
        __sync_fetch_and_sub(&nalloc_running, 1);
219
636
        return true;
220
636
    }
221
12.4k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
13.0k
}
ssh_known_hosts_fuzzer.c:nalloc_fail
Line
Count
Source
194
1.98M
{
195
    // do not fail before thread init
196
1.98M
    if (nalloc_runs == 0) {
197
1.16M
        return false;
198
1.16M
    }
199
827k
    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.55k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
8.55k
        return false;
204
8.55k
    }
205
818k
    nalloc_random_update((uint8_t)size);
206
818k
    if (size >= 0x100) {
207
14.8k
        nalloc_random_update((uint8_t)(size >> 8));
208
14.8k
        if (size >= 0x10000) {
209
0
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
0
        }
212
14.8k
    }
213
818k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
626
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
626
        __sync_fetch_and_sub(&nalloc_running, 1);
219
626
        return true;
220
626
    }
221
818k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
818k
}
ssh_privkey_fuzzer.c:nalloc_fail
Line
Count
Source
194
7.34k
{
195
    // do not fail before thread init
196
7.34k
    if (nalloc_runs == 0) {
197
6.06k
        return false;
198
6.06k
    }
199
1.27k
    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
712
        __sync_fetch_and_sub(&nalloc_running, 1);
203
712
        return false;
204
712
    }
205
567
    nalloc_random_update((uint8_t)size);
206
567
    if (size >= 0x100) {
207
84
        nalloc_random_update((uint8_t)(size >> 8));
208
84
        if (size >= 0x10000) {
209
26
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
26
        }
212
84
    }
213
567
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
87
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
87
        __sync_fetch_and_sub(&nalloc_running, 1);
219
87
        return true;
220
87
    }
221
480
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
567
}
ssh_client_fuzzer.c:nalloc_fail
Line
Count
Source
194
2.79M
{
195
    // do not fail before thread init
196
2.79M
    if (nalloc_runs == 0) {
197
2.61M
        return false;
198
2.61M
    }
199
179k
    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
4.14k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
4.14k
        return false;
204
4.14k
    }
205
175k
    nalloc_random_update((uint8_t)size);
206
175k
    if (size >= 0x100) {
207
95.6k
        nalloc_random_update((uint8_t)(size >> 8));
208
95.6k
        if (size >= 0x10000) {
209
49
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
49
        }
212
95.6k
    }
213
175k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
339
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
339
        __sync_fetch_and_sub(&nalloc_running, 1);
219
339
        return true;
220
339
    }
221
174k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
175k
}
ssh_scp_fuzzer.c:nalloc_fail
Line
Count
Source
194
339k
{
195
    // do not fail before thread init
196
339k
    if (nalloc_runs == 0) {
197
339k
        return false;
198
339k
    }
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
5.40M
{
195
    // do not fail before thread init
196
5.40M
    if (nalloc_runs == 0) {
197
5.14M
        return false;
198
5.14M
    }
199
260k
    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.58k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
8.58k
        return false;
204
8.58k
    }
205
251k
    nalloc_random_update((uint8_t)size);
206
251k
    if (size >= 0x100) {
207
112k
        nalloc_random_update((uint8_t)(size >> 8));
208
112k
        if (size >= 0x10000) {
209
49
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
49
        }
212
112k
    }
213
251k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
438
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
438
        __sync_fetch_and_sub(&nalloc_running, 1);
219
438
        return true;
220
438
    }
221
251k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
251k
}
ssh_bind_config_fuzzer.c:nalloc_fail
Line
Count
Source
194
51.0M
{
195
    // do not fail before thread init
196
51.0M
    if (nalloc_runs == 0) {
197
19.3k
        return false;
198
19.3k
    }
199
51.0M
    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
12.6k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
12.6k
        return false;
204
12.6k
    }
205
51.0M
    nalloc_random_update((uint8_t)size);
206
51.0M
    if (size >= 0x100) {
207
820k
        nalloc_random_update((uint8_t)(size >> 8));
208
820k
        if (size >= 0x10000) {
209
4.53k
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
4.53k
        }
212
820k
    }
213
51.0M
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
958
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
958
        __sync_fetch_and_sub(&nalloc_running, 1);
219
958
        return true;
220
958
    }
221
51.0M
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
51.0M
}
ssh_sshsig_fuzzer.c:nalloc_fail
Line
Count
Source
194
131k
{
195
    // do not fail before thread init
196
131k
    if (nalloc_runs == 0) {
197
117k
        return false;
198
117k
    }
199
14.3k
    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
4.95k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
4.95k
        return false;
204
4.95k
    }
205
9.43k
    nalloc_random_update((uint8_t)size);
206
9.43k
    if (size >= 0x100) {
207
776
        nalloc_random_update((uint8_t)(size >> 8));
208
776
        if (size >= 0x10000) {
209
111
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
111
        }
212
776
    }
213
9.43k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
432
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
432
        __sync_fetch_and_sub(&nalloc_running, 1);
219
432
        return true;
220
432
    }
221
9.00k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
9.43k
}
ssh_sftp_attr_fuzzer.c:nalloc_fail
Line
Count
Source
194
335k
{
195
    // do not fail before thread init
196
335k
    if (nalloc_runs == 0) {
197
62.7k
        return false;
198
62.7k
    }
199
272k
    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
2.48k
        __sync_fetch_and_sub(&nalloc_running, 1);
203
2.48k
        return false;
204
2.48k
    }
205
270k
    nalloc_random_update((uint8_t)size);
206
270k
    if (size >= 0x100) {
207
1.48k
        nalloc_random_update((uint8_t)(size >> 8));
208
1.48k
        if (size >= 0x10000) {
209
178
            nalloc_random_update((uint8_t)(size >> 16));
210
            // bigger may already fail or oom
211
178
        }
212
1.48k
    }
213
270k
    if (((nalloc_random_state ^ nalloc_magic) & nalloc_bitmask) == 0) {
214
232
        if (nalloc_backtrace_exclude(size, op)) {
215
0
            __sync_fetch_and_sub(&nalloc_running, 1);
216
0
            return false;
217
0
        }
218
232
        __sync_fetch_and_sub(&nalloc_running, 1);
219
232
        return true;
220
232
    }
221
269k
    __sync_fetch_and_sub(&nalloc_running, 1);
222
    return false;
223
270k
}
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
60.0M
#define nalloc_malloc(s)             __libc_malloc(s)
259
2.61M
#define nalloc_calloc(s, n)          __libc_calloc(s, n)
260
685k
#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
3.05k
#define nalloc_write(f, b, s)   __write(f, b, s)
265
31.9k
#define nalloc_recv(f, b, s, x) __recv(f, b, s, x)
266
37.1k
#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
3.05k
{
281
3.05k
    if (nalloc_fail(count, "write")) {
282
0
        errno = EIO;
283
0
        return -1;
284
0
    }
285
3.05k
    return nalloc_write(fd, buf, count);
286
3.05k
}
287
288
ssize_t recv(int fd, void *buf, size_t count, int flags)
289
31.9k
{
290
31.9k
    if (nalloc_fail(count, "recv")) {
291
0
        errno = EIO;
292
0
        return -1;
293
0
    }
294
31.9k
    return nalloc_recv(fd, buf, count, flags);
295
31.9k
}
296
297
ssize_t send(int fd, const void *buf, size_t count, int flags)
298
37.1k
{
299
37.1k
    if (nalloc_fail(count, "send")) {
300
0
        errno = EIO;
301
0
        return -1;
302
0
    }
303
37.1k
    return nalloc_send(fd, buf, count, flags);
304
37.1k
}
305
306
void *calloc(size_t nmemb, size_t size)
307
2.61M
{
308
2.61M
    if (nalloc_fail(size, "calloc")) {
309
2.53k
        errno = ENOMEM;
310
2.53k
        return NULL;
311
2.53k
    }
312
2.61M
    return nalloc_calloc(nmemb, size);
313
2.61M
}
314
315
void *malloc(size_t size)
316
60.0M
{
317
60.0M
    if (nalloc_fail(size, "malloc")) {
318
1.98k
        errno = ENOMEM;
319
1.98k
        return NULL;
320
1.98k
    }
321
60.0M
    return nalloc_malloc(size);
322
60.0M
}
323
324
void *realloc(void *ptr, size_t size)
325
685k
{
326
685k
    if (nalloc_fail(size, "realloc")) {
327
108
        errno = ENOMEM;
328
108
        return NULL;
329
108
    }
330
685k
    return nalloc_realloc(ptr, size);
331
685k
}
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