/src/openssl32/crypto/err/err_blocks.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. |
3 | | * |
4 | | * Licensed under the Apache License 2.0 (the "License"). You may not use |
5 | | * this file except in compliance with the License. You can obtain a copy |
6 | | * in the file LICENSE in the source distribution or at |
7 | | * https://www.openssl.org/source/license.html |
8 | | */ |
9 | | |
10 | | #define OSSL_FORCE_ERR_STATE |
11 | | |
12 | | #include <string.h> |
13 | | #include <openssl/err.h> |
14 | | #include "err_local.h" |
15 | | |
16 | | void ERR_new(void) |
17 | 140M | { |
18 | 140M | ERR_STATE *es; |
19 | | |
20 | 140M | es = ossl_err_get_state_int(); |
21 | 140M | if (es == NULL) |
22 | 0 | return; |
23 | | |
24 | | /* Allocate a slot */ |
25 | 140M | err_get_slot(es); |
26 | 140M | err_clear(es, es->top, 0); |
27 | 140M | } |
28 | | |
29 | | void ERR_set_debug(const char *file, int line, const char *func) |
30 | 140M | { |
31 | 140M | ERR_STATE *es; |
32 | | |
33 | 140M | es = ossl_err_get_state_int(); |
34 | 140M | if (es == NULL) |
35 | 0 | return; |
36 | | |
37 | 140M | err_set_debug(es, es->top, file, line, func); |
38 | 140M | } |
39 | | |
40 | | void ERR_set_error(int lib, int reason, const char *fmt, ...) |
41 | 140M | { |
42 | 140M | va_list args; |
43 | | |
44 | 140M | va_start(args, fmt); |
45 | 140M | ERR_vset_error(lib, reason, fmt, args); |
46 | 140M | va_end(args); |
47 | 140M | } |
48 | | |
49 | | void ERR_vset_error(int lib, int reason, const char *fmt, va_list args) |
50 | 140M | { |
51 | 140M | ERR_STATE *es; |
52 | 140M | char *buf = NULL; |
53 | 140M | size_t buf_size = 0; |
54 | 140M | unsigned long flags = 0; |
55 | 140M | size_t i; |
56 | | |
57 | 140M | es = ossl_err_get_state_int(); |
58 | 140M | if (es == NULL) |
59 | 0 | return; |
60 | 140M | i = es->top; |
61 | | |
62 | 140M | if (fmt != NULL) { |
63 | 1.94M | int printed_len = 0; |
64 | 1.94M | char *rbuf = NULL; |
65 | | |
66 | 1.94M | buf = es->err_data[i]; |
67 | 1.94M | buf_size = es->err_data_size[i]; |
68 | | |
69 | | /* |
70 | | * To protect the string we just grabbed from tampering by other |
71 | | * functions we may call, or to protect them from freeing a pointer |
72 | | * that may no longer be valid at that point, we clear away the |
73 | | * data pointer and the flags. We will set them again at the end |
74 | | * of this function. |
75 | | */ |
76 | 1.94M | es->err_data[i] = NULL; |
77 | 1.94M | es->err_data_flags[i] = 0; |
78 | | |
79 | | /* |
80 | | * Try to maximize the space available. If that fails, we use what |
81 | | * we have. |
82 | | */ |
83 | 1.94M | if (buf_size < ERR_MAX_DATA_SIZE |
84 | 1.94M | && (rbuf = OPENSSL_realloc(buf, ERR_MAX_DATA_SIZE)) != NULL) { |
85 | 1.94M | buf = rbuf; |
86 | 1.94M | buf_size = ERR_MAX_DATA_SIZE; |
87 | 1.94M | } |
88 | | |
89 | 1.94M | if (buf != NULL) { |
90 | 1.94M | printed_len = BIO_vsnprintf(buf, buf_size, fmt, args); |
91 | 1.94M | } |
92 | 1.94M | if (printed_len < 0) |
93 | 10.8k | printed_len = 0; |
94 | 1.94M | if (buf != NULL) |
95 | 1.94M | buf[printed_len] = '\0'; |
96 | | |
97 | | /* |
98 | | * Try to reduce the size, but only if we maximized above. If that |
99 | | * fails, we keep what we have. |
100 | | * (According to documentation, realloc leaves the old buffer untouched |
101 | | * if it fails) |
102 | | */ |
103 | 1.94M | if ((rbuf = OPENSSL_realloc(buf, printed_len + 1)) != NULL) { |
104 | 1.94M | buf = rbuf; |
105 | 1.94M | buf_size = printed_len + 1; |
106 | 1.94M | buf[printed_len] = '\0'; |
107 | 1.94M | } |
108 | | |
109 | 1.94M | if (buf != NULL) |
110 | 1.94M | flags = ERR_TXT_MALLOCED | ERR_TXT_STRING; |
111 | 1.94M | } |
112 | | |
113 | 140M | err_clear_data(es, es->top, 0); |
114 | 140M | err_set_error(es, es->top, lib, reason); |
115 | 140M | if (fmt != NULL) |
116 | 1.94M | err_set_data(es, es->top, buf, buf_size, flags); |
117 | 140M | } |