Branch data Line data Source code
1 : : /*
2 : : * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 : : *
4 : : * Licensed under the Apache License, Version 2.0 (the "License").
5 : : * You may not use this file except in compliance with the License.
6 : : * A copy of the License is located at
7 : : *
8 : : * http://aws.amazon.com/apache2.0
9 : : *
10 : : * or in the "license" file accompanying this file. This file is distributed
11 : : * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12 : : * express or implied. See the License for the specific language governing
13 : : * permissions and limitations under the License.
14 : : */
15 : :
16 : : #pragma once
17 : :
18 : : #include <stdbool.h>
19 : : #include <stdio.h>
20 : : #include <string.h>
21 : :
22 : : #include "api/s2n.h"
23 : : #include "utils/s2n_ensure.h"
24 : :
25 : : /*
26 : : * To easily retrieve error types, we split error values into two parts.
27 : : * The upper 6 bits describe the error type and the lower bits describe the value within the category.
28 : : * [ Error Type Bits(31-26) ][ Value Bits(25-0) ]
29 : : */
30 : 635699 : #define S2N_ERR_NUM_VALUE_BITS 26
31 : :
32 : : /* Start value for each error type. */
33 : : #define S2N_ERR_T_OK_START (S2N_ERR_T_OK << S2N_ERR_NUM_VALUE_BITS)
34 : : #define S2N_ERR_T_IO_START (S2N_ERR_T_IO << S2N_ERR_NUM_VALUE_BITS)
35 : : #define S2N_ERR_T_CLOSED_START (S2N_ERR_T_CLOSED << S2N_ERR_NUM_VALUE_BITS)
36 : : #define S2N_ERR_T_BLOCKED_START (S2N_ERR_T_BLOCKED << S2N_ERR_NUM_VALUE_BITS)
37 : : #define S2N_ERR_T_ALERT_START (S2N_ERR_T_ALERT << S2N_ERR_NUM_VALUE_BITS)
38 : : #define S2N_ERR_T_PROTO_START (S2N_ERR_T_PROTO << S2N_ERR_NUM_VALUE_BITS)
39 : : #define S2N_ERR_T_INTERNAL_START (S2N_ERR_T_INTERNAL << S2N_ERR_NUM_VALUE_BITS)
40 : : #define S2N_ERR_T_USAGE_START (S2N_ERR_T_USAGE << S2N_ERR_NUM_VALUE_BITS)
41 : :
42 : : /* Order of values in this enum is important. New error values should be placed at the end of their respective category.
43 : : * For example, a new TLS protocol related error belongs in the S2N_ERR_T_PROTO category. It should be placed
44 : : * immediately before S2N_ERR_T_INTERNAL_START(the first value of he next category).
45 : : */
46 : : typedef enum {
47 : : /* S2N_ERR_T_OK */
48 : : S2N_ERR_OK = S2N_ERR_T_OK_START,
49 : : S2N_ERR_T_OK_END,
50 : :
51 : : /* S2N_ERR_T_IO */
52 : : S2N_ERR_IO = S2N_ERR_T_IO_START,
53 : : S2N_ERR_T_IO_END,
54 : :
55 : : /* S2N_ERR_T_CLOSED */
56 : : S2N_ERR_CLOSED = S2N_ERR_T_CLOSED_START,
57 : : S2N_ERR_T_CLOSED_END,
58 : :
59 : : /* S2N_ERR_T_BLOCKED */
60 : : S2N_ERR_IO_BLOCKED = S2N_ERR_T_BLOCKED_START,
61 : : S2N_ERR_ASYNC_BLOCKED,
62 : : S2N_ERR_EARLY_DATA_BLOCKED,
63 : : S2N_ERR_APP_DATA_BLOCKED,
64 : : S2N_ERR_T_BLOCKED_END,
65 : :
66 : : /* S2N_ERR_T_ALERT */
67 : : S2N_ERR_ALERT = S2N_ERR_T_ALERT_START,
68 : : S2N_ERR_T_ALERT_END,
69 : :
70 : : /* S2N_ERR_T_PROTO */
71 : : S2N_ERR_ENCRYPT = S2N_ERR_T_PROTO_START,
72 : : S2N_ERR_DECRYPT,
73 : : S2N_ERR_BAD_MESSAGE,
74 : : S2N_ERR_UNEXPECTED_CERT_REQUEST,
75 : : S2N_ERR_MISSING_CERT_REQUEST,
76 : : S2N_ERR_MISSING_CLIENT_CERT,
77 : : S2N_ERR_KEY_INIT,
78 : : S2N_ERR_KEY_DESTROY,
79 : : S2N_ERR_DH_SERIALIZING,
80 : : S2N_ERR_DH_SHARED_SECRET,
81 : : S2N_ERR_DH_WRITING_PUBLIC_KEY,
82 : : S2N_ERR_DH_FAILED_SIGNING,
83 : : S2N_ERR_DH_COPYING_PARAMETERS,
84 : : S2N_ERR_DH_GENERATING_PARAMETERS,
85 : : S2N_ERR_CIPHER_NOT_SUPPORTED,
86 : : S2N_ERR_NO_APPLICATION_PROTOCOL,
87 : : S2N_ERR_FALLBACK_DETECTED,
88 : : S2N_ERR_HASH_DIGEST_FAILED,
89 : : S2N_ERR_HASH_INIT_FAILED,
90 : : S2N_ERR_HASH_UPDATE_FAILED,
91 : : S2N_ERR_HASH_COPY_FAILED,
92 : : S2N_ERR_HASH_WIPE_FAILED,
93 : : S2N_ERR_HASH_NOT_READY,
94 : : S2N_ERR_ALLOW_MD5_FOR_FIPS_FAILED,
95 : : S2N_ERR_DECODE_CERTIFICATE,
96 : : S2N_ERR_DECODE_PRIVATE_KEY,
97 : : S2N_ERR_INVALID_HELLO_RETRY,
98 : : S2N_ERR_INVALID_SIGNATURE_ALGORITHM,
99 : : S2N_ERR_INVALID_SIGNATURE_SCHEME,
100 : : S2N_ERR_NO_VALID_SIGNATURE_SCHEME,
101 : : S2N_ERR_CBC_VERIFY,
102 : : S2N_ERR_DH_COPYING_PUBLIC_KEY,
103 : : S2N_ERR_SIGN,
104 : : S2N_ERR_VERIFY_SIGNATURE,
105 : : S2N_ERR_ECDHE_GEN_KEY,
106 : : S2N_ERR_ECDHE_SHARED_SECRET,
107 : : S2N_ERR_ECDHE_UNSUPPORTED_CURVE,
108 : : S2N_ERR_ECDHE_INVALID_PUBLIC_KEY,
109 : : S2N_ERR_ECDHE_INVALID_PUBLIC_KEY_FIPS,
110 : : S2N_ERR_ECDSA_UNSUPPORTED_CURVE,
111 : : S2N_ERR_ECDHE_SERIALIZING,
112 : : S2N_ERR_KEM_UNSUPPORTED_PARAMS,
113 : : S2N_ERR_SHUTDOWN_RECORD_TYPE,
114 : : S2N_ERR_SHUTDOWN_CLOSED,
115 : : S2N_ERR_NON_EMPTY_RENEGOTIATION_INFO,
116 : : S2N_ERR_RECORD_LIMIT,
117 : : S2N_ERR_CERT_UNTRUSTED,
118 : : S2N_ERR_CERT_REVOKED,
119 : : S2N_ERR_CERT_NOT_YET_VALID,
120 : : S2N_ERR_CERT_EXPIRED,
121 : : S2N_ERR_CERT_TYPE_UNSUPPORTED,
122 : : S2N_ERR_CERT_INVALID,
123 : : S2N_ERR_CERT_MAX_CHAIN_DEPTH_EXCEEDED,
124 : : S2N_ERR_CERT_REJECTED,
125 : : S2N_ERR_CERT_UNHANDLED_CRITICAL_EXTENSION,
126 : : S2N_ERR_CRL_LOOKUP_FAILED,
127 : : S2N_ERR_CRL_SIGNATURE,
128 : : S2N_ERR_CRL_ISSUER,
129 : : S2N_ERR_CRL_UNHANDLED_CRITICAL_EXTENSION,
130 : : S2N_ERR_CRL_INVALID_THIS_UPDATE,
131 : : S2N_ERR_CRL_INVALID_NEXT_UPDATE,
132 : : S2N_ERR_CRL_NOT_YET_VALID,
133 : : S2N_ERR_CRL_EXPIRED,
134 : : S2N_ERR_INVALID_MAX_FRAG_LEN,
135 : : S2N_ERR_MAX_FRAG_LEN_MISMATCH,
136 : : S2N_ERR_PROTOCOL_VERSION_UNSUPPORTED,
137 : : S2N_ERR_BAD_KEY_SHARE,
138 : : S2N_ERR_CANCELLED,
139 : : S2N_ERR_PROTOCOL_DOWNGRADE_DETECTED,
140 : : S2N_ERR_MAX_INNER_PLAINTEXT_SIZE,
141 : : S2N_ERR_RECORD_STUFFER_SIZE,
142 : : S2N_ERR_FRAGMENT_LENGTH_TOO_LARGE,
143 : : S2N_ERR_FRAGMENT_LENGTH_TOO_SMALL,
144 : : S2N_ERR_RECORD_STUFFER_NEEDS_DRAINING,
145 : : S2N_ERR_MISSING_EXTENSION,
146 : : S2N_ERR_UNSUPPORTED_EXTENSION,
147 : : S2N_ERR_DUPLICATE_EXTENSION,
148 : : S2N_ERR_MAX_EARLY_DATA_SIZE,
149 : : S2N_ERR_EARLY_DATA_TRIAL_DECRYPT,
150 : : S2N_ERR_NO_RENEGOTIATION,
151 : : S2N_ERR_KTLS_KEYUPDATE,
152 : : S2N_ERR_T_PROTO_END,
153 : :
154 : : /* S2N_ERR_T_INTERNAL */
155 : : S2N_ERR_MADVISE = S2N_ERR_T_INTERNAL_START,
156 : : S2N_ERR_ALLOC,
157 : : S2N_ERR_MLOCK,
158 : : S2N_ERR_MUNLOCK,
159 : : S2N_ERR_FSTAT,
160 : : S2N_ERR_OPEN,
161 : : S2N_ERR_MMAP,
162 : : S2N_ERR_ATEXIT,
163 : : S2N_ERR_NOMEM,
164 : : S2N_ERR_NULL,
165 : : S2N_ERR_SAFETY,
166 : : S2N_ERR_INITIALIZED,
167 : : S2N_ERR_NOT_INITIALIZED,
168 : : S2N_ERR_RANDOM_UNINITIALIZED,
169 : : S2N_ERR_OPEN_RANDOM,
170 : : S2N_ERR_RESIZE_STATIC_STUFFER,
171 : : S2N_ERR_RESIZE_TAINTED_STUFFER,
172 : : S2N_ERR_STUFFER_OUT_OF_DATA,
173 : : S2N_ERR_STUFFER_IS_FULL,
174 : : S2N_ERR_STUFFER_NOT_FOUND,
175 : : S2N_ERR_STUFFER_HAS_UNPROCESSED_DATA,
176 : : S2N_ERR_HASH_INVALID_ALGORITHM,
177 : : S2N_ERR_PRF_INVALID_ALGORITHM,
178 : : S2N_ERR_PRF_INVALID_SEED,
179 : : S2N_ERR_PRF_DERIVE,
180 : : S2N_ERR_P_HASH_INVALID_ALGORITHM,
181 : : S2N_ERR_P_HASH_INIT_FAILED,
182 : : S2N_ERR_P_HASH_UPDATE_FAILED,
183 : : S2N_ERR_P_HASH_FINAL_FAILED,
184 : : S2N_ERR_P_HASH_WIPE_FAILED,
185 : : S2N_ERR_HMAC_INVALID_ALGORITHM,
186 : : S2N_ERR_HKDF_OUTPUT_SIZE,
187 : : S2N_ERR_HKDF,
188 : : S2N_ERR_ALERT_PRESENT,
189 : : S2N_ERR_HANDSHAKE_STATE,
190 : : S2N_ERR_SHUTDOWN_PAUSED,
191 : : S2N_ERR_SIZE_MISMATCH,
192 : : S2N_ERR_DRBG,
193 : : S2N_ERR_DRBG_REQUEST_SIZE,
194 : : S2N_ERR_KEY_CHECK,
195 : : S2N_ERR_CIPHER_TYPE,
196 : : S2N_ERR_MAP_DUPLICATE,
197 : : S2N_ERR_MAP_IMMUTABLE,
198 : : S2N_ERR_MAP_MUTABLE,
199 : : S2N_ERR_MAP_INVALID_MAP_SIZE,
200 : : S2N_ERR_INITIAL_HMAC,
201 : : S2N_ERR_INVALID_NONCE_TYPE,
202 : : S2N_ERR_UNIMPLEMENTED,
203 : : S2N_ERR_HANDSHAKE_UNREACHABLE,
204 : : S2N_ERR_READ,
205 : : S2N_ERR_WRITE,
206 : : S2N_ERR_BAD_FD,
207 : : S2N_ERR_RDRAND_FAILED,
208 : : S2N_ERR_FAILED_CACHE_RETRIEVAL,
209 : : S2N_ERR_X509_TRUST_STORE,
210 : : S2N_ERR_UNKNOWN_PROTOCOL_VERSION,
211 : : S2N_ERR_NULL_CN_NAME,
212 : : S2N_ERR_NULL_SANS,
213 : : S2N_ERR_CLIENT_HELLO_VERSION,
214 : : S2N_ERR_CLIENT_PROTOCOL_VERSION,
215 : : S2N_ERR_SERVER_PROTOCOL_VERSION,
216 : : S2N_ERR_ACTUAL_PROTOCOL_VERSION,
217 : : S2N_ERR_POLLING_FROM_SOCKET,
218 : : S2N_ERR_RECV_STUFFER_FROM_CONN,
219 : : S2N_ERR_SEND_STUFFER_TO_CONN,
220 : : S2N_ERR_PRECONDITION_VIOLATION,
221 : : S2N_ERR_POSTCONDITION_VIOLATION,
222 : : S2N_ERR_INTEGER_OVERFLOW,
223 : : S2N_ERR_ARRAY_INDEX_OOB,
224 : : S2N_ERR_FREE_STATIC_BLOB,
225 : : S2N_ERR_RESIZE_STATIC_BLOB,
226 : : S2N_ERR_RECORD_LENGTH_TOO_LARGE,
227 : : S2N_ERR_SET_DUPLICATE_VALUE,
228 : : S2N_ERR_INVALID_PARSED_EXTENSIONS,
229 : : S2N_ERR_ASYNC_CALLBACK_FAILED,
230 : : S2N_ERR_ASYNC_MORE_THAN_ONE,
231 : : S2N_ERR_PQ_CRYPTO,
232 : : S2N_ERR_INVALID_CERT_STATE,
233 : : S2N_ERR_INVALID_EARLY_DATA_STATE,
234 : : S2N_ERR_PKEY_CTX_INIT,
235 : : S2N_ERR_FORK_DETECTION_INIT,
236 : : S2N_ERR_RETRIEVE_FORK_GENERATION_NUMBER,
237 : : S2N_ERR_LIBCRYPTO_VERSION_NUMBER_MISMATCH,
238 : : S2N_ERR_LIBCRYPTO_VERSION_NAME_MISMATCH,
239 : : S2N_ERR_INTERNAL_LIBCRYPTO_ERROR,
240 : : S2N_ERR_OSSL_PROVIDER,
241 : : S2N_ERR_BAD_HEX,
242 : : S2N_ERR_TEST_ASSERTION,
243 : : S2N_ERR_CONFIG_NULL_BEFORE_CH_CALLBACK,
244 : : S2N_ERR_ZERO_LIFETIME_TICKET,
245 : : S2N_ERR_T_INTERNAL_END,
246 : :
247 : : /* S2N_ERR_T_USAGE */
248 : : S2N_ERR_NO_ALERT = S2N_ERR_T_USAGE_START,
249 : : S2N_ERR_SERVER_MODE,
250 : : S2N_ERR_CLIENT_MODE,
251 : : S2N_ERR_CLIENT_MODE_DISABLED,
252 : : S2N_ERR_TOO_MANY_CERTIFICATES,
253 : : S2N_ERR_TOO_MANY_SIGNATURE_SCHEMES,
254 : : S2N_ERR_CLIENT_AUTH_NOT_SUPPORTED_IN_FIPS_MODE,
255 : : S2N_ERR_INVALID_BASE64,
256 : : S2N_ERR_INVALID_HEX,
257 : : S2N_ERR_INVALID_PEM,
258 : : S2N_ERR_DH_PARAMS_CREATE,
259 : : S2N_ERR_DH_TOO_SMALL,
260 : : S2N_ERR_DH_PARAMETER_CHECK,
261 : : S2N_ERR_INVALID_PKCS3,
262 : : S2N_ERR_NO_CERTIFICATE_IN_PEM,
263 : : S2N_ERR_SERVER_NAME_TOO_LONG,
264 : : S2N_ERR_NUM_DEFAULT_CERTIFICATES,
265 : : S2N_ERR_MULTIPLE_DEFAULT_CERTIFICATES_PER_AUTH_TYPE,
266 : : S2N_ERR_INVALID_CIPHER_PREFERENCES,
267 : : S2N_ERR_INVALID_APPLICATION_PROTOCOL,
268 : : S2N_ERR_KEY_MISMATCH,
269 : : S2N_ERR_SEND_SIZE,
270 : : S2N_ERR_CORK_SET_ON_UNMANAGED,
271 : : S2N_ERR_UNRECOGNIZED_EXTENSION,
272 : : S2N_ERR_EXTENSION_NOT_RECEIVED,
273 : : S2N_ERR_INVALID_SCT_LIST,
274 : : S2N_ERR_INVALID_OCSP_RESPONSE,
275 : : S2N_ERR_UPDATING_EXTENSION,
276 : : S2N_ERR_INVALID_SERIALIZED_SESSION_STATE,
277 : : S2N_ERR_SERIALIZED_SESSION_STATE_TOO_LONG,
278 : : S2N_ERR_SESSION_ID_TOO_LONG,
279 : : S2N_ERR_CLIENT_AUTH_NOT_SUPPORTED_IN_SESSION_RESUMPTION_MODE,
280 : : S2N_ERR_INVALID_TICKET_KEY_LENGTH,
281 : : S2N_ERR_INVALID_TICKET_KEY_NAME_OR_NAME_LENGTH,
282 : : S2N_ERR_TICKET_KEY_NOT_UNIQUE,
283 : : S2N_ERR_TICKET_KEY_LIMIT,
284 : : S2N_ERR_NO_TICKET_ENCRYPT_DECRYPT_KEY,
285 : : S2N_ERR_ENCRYPT_DECRYPT_KEY_SELECTION_FAILED,
286 : : S2N_ERR_KEY_USED_IN_SESSION_TICKET_NOT_FOUND,
287 : : S2N_ERR_SENDING_NST,
288 : : S2N_ERR_INVALID_DYNAMIC_THRESHOLD,
289 : : S2N_ERR_INVALID_ARGUMENT,
290 : : S2N_ERR_NOT_IN_UNIT_TEST,
291 : : S2N_ERR_NOT_IN_TEST,
292 : : S2N_ERR_UNSUPPORTED_CPU,
293 : : S2N_ERR_SESSION_ID_TOO_SHORT,
294 : : S2N_ERR_CONNECTION_CACHING_DISALLOWED,
295 : : S2N_ERR_SESSION_TICKET_NOT_SUPPORTED,
296 : : S2N_ERR_OCSP_NOT_SUPPORTED,
297 : : S2N_ERR_INVALID_SIGNATURE_ALGORITHMS_PREFERENCES,
298 : : S2N_ERR_RSA_PSS_NOT_SUPPORTED,
299 : : S2N_ERR_INVALID_ECC_PREFERENCES,
300 : : S2N_ERR_DEPRECATED_SECURITY_POLICY,
301 : : S2N_ERR_INVALID_SECURITY_POLICY,
302 : : S2N_ERR_INVALID_KEM_PREFERENCES,
303 : : S2N_ERR_ASYNC_ALREADY_PERFORMED,
304 : : S2N_ERR_ASYNC_NOT_PERFORMED,
305 : : S2N_ERR_ASYNC_WRONG_CONNECTION,
306 : : S2N_ERR_ASYNC_ALREADY_APPLIED,
307 : : S2N_ERR_UNSUPPORTED_WITH_QUIC,
308 : : S2N_ERR_DUPLICATE_PSK_IDENTITIES,
309 : : S2N_ERR_OFFERED_PSKS_TOO_LONG,
310 : : S2N_ERR_INVALID_SESSION_TICKET,
311 : : S2N_ERR_REENTRANCY,
312 : : S2N_ERR_INVALID_STATE,
313 : : S2N_ERR_EARLY_DATA_NOT_ALLOWED,
314 : : S2N_ERR_NO_CERT_FOUND,
315 : : S2N_ERR_CERT_NOT_VALIDATED,
316 : : S2N_ERR_NO_PRIVATE_KEY,
317 : : S2N_ERR_PSK_MODE,
318 : : S2N_ERR_X509_EXTENSION_VALUE_NOT_FOUND,
319 : : S2N_ERR_INVALID_X509_EXTENSION_TYPE,
320 : : S2N_ERR_INSUFFICIENT_MEM_SIZE,
321 : : S2N_ERR_KEYING_MATERIAL_EXPIRED,
322 : : S2N_ERR_SECRET_SCHEDULE_STATE,
323 : : S2N_ERR_CERT_OWNERSHIP,
324 : : S2N_ERR_HANDSHAKE_NOT_COMPLETE,
325 : : S2N_ERR_KTLS_MANAGED_IO,
326 : : S2N_ERR_KTLS_UNSUPPORTED_PLATFORM,
327 : : S2N_ERR_KTLS_UNSUPPORTED_CONN,
328 : : S2N_ERR_KTLS_ENABLE,
329 : : S2N_ERR_KTLS_BAD_CMSG,
330 : : S2N_ERR_KTLS_RENEG,
331 : : S2N_ERR_ATOMIC,
332 : : S2N_ERR_KTLS_KEY_LIMIT,
333 : : S2N_ERR_SECURITY_POLICY_INCOMPATIBLE_CERT,
334 : : S2N_ERR_INVALID_SERIALIZED_CONNECTION,
335 : : S2N_ERR_TOO_MANY_CAS,
336 : : S2N_ERR_API_UNSUPPORTED_BY_LIBCRYPTO,
337 : : S2N_ERR_FIPS_MODE_UNSUPPORTED,
338 : : S2N_ERR_T_USAGE_END,
339 : : } s2n_error;
340 : :
341 : : #define S2N_DEBUG_STR_LEN 128
342 : :
343 : : struct s2n_debug_info {
344 : : const char *debug_str;
345 : : const char *source;
346 : : };
347 : :
348 : : extern __thread struct s2n_debug_info _s2n_debug_info;
349 : :
350 : 3858206 : #define TO_STRING(s) #s
351 : 3858206 : #define STRING_(s) TO_STRING(s)
352 : 3858206 : #define STRING__LINE__ STRING_(__LINE__)
353 : :
354 : : /* gets the basename of a file path */
355 : : /* _S2N_EXTRACT_BASENAME("Error encountered in /path/to/my/file.c") -> "file.c" */
356 : : #if !(defined(CBMC) || defined(__TIMING_CONTRACTS__))
357 :>1844*10^16 : #define _S2N_RSPLIT(subject, c) (strrchr((subject), c) ? strrchr((subject), c) + 1 : (subject))
358 : 3858206 : #define _S2N_EXTRACT_BASENAME(path) _S2N_RSPLIT((path) + strlen(_S2N_DEBUG_LINE_PREFIX), '/')
359 : : #else
360 : : #define _S2N_EXTRACT_BASENAME(path) path
361 : : #endif
362 : :
363 : 3858206 : #define _S2N_DEBUG_LINE_PREFIX "Error encountered in "
364 : 3858206 : #define _S2N_DEBUG_LINE _S2N_DEBUG_LINE_PREFIX __FILE__ ":" STRING__LINE__
365 : :
366 : : #define _S2N_ERROR(x) \
367 : 3858206 : do { \
368 : 3858206 : _s2n_debug_info.debug_str = _S2N_DEBUG_LINE; \
369 : 3858206 : _s2n_debug_info.source = _S2N_EXTRACT_BASENAME(_s2n_debug_info.debug_str); \
370 : 3858206 : s2n_errno = (x); \
371 : 3858206 : s2n_calculate_stacktrace(); \
372 : 3858206 : } while (0)
373 : : #define S2N_ERROR_PRESERVE_ERRNO() \
374 : 350773 : do { \
375 : 350773 : return -1; \
376 : 350773 : } while (0)
377 : 310713 : #define S2N_ERROR_IS_BLOCKING(x) (s2n_error_get_type(x) == S2N_ERR_T_BLOCKED)
378 : :
379 : : /* DEPRECATED: use POSIX_BAIL instead */
380 : : #define S2N_ERROR(x) \
381 : 3193310 : do { \
382 : 3193310 : _S2N_ERROR((x)); \
383 : 3193310 : return -1; \
384 : 3193310 : } while (0)
385 : :
386 : : /* DEPRECATED: use PTR_BAIL instead */
387 : : #define S2N_ERROR_PTR(x) \
388 : : do { \
389 : : _S2N_ERROR((x)); \
390 : : return NULL; \
391 : : } while (0)
392 : :
393 : : /* DEPRECATED: use POSIX_ENSURE instead */
394 : : #define S2N_ERROR_IF(cond, x) \
395 : 35579482 : do { \
396 : 63569276 : if (cond) { \
397 : 3193310 : S2N_ERROR(x); \
398 : 3193310 : } \
399 : 35579482 : } while (0)
400 : :
401 : : /** Calculate and print stacktraces */
402 : : struct s2n_stacktrace {
403 : : char **trace;
404 : : int trace_size;
405 : : };
406 : :
407 : : bool s2n_stack_traces_enabled();
408 : : int s2n_stack_traces_enabled_set(bool newval);
409 : :
410 : : int s2n_calculate_stacktrace(void);
411 : : int s2n_print_stacktrace(FILE *fptr);
412 : : int s2n_free_stacktrace(void);
413 : : int s2n_get_stacktrace(struct s2n_stacktrace *trace);
414 : : void s2n_debug_info_reset(void);
|