}
#endif
-static void ERR_STATE_free(ERR_STATE *s)
+static void ERR_STATE_free(ERR_STATE *state)
{
int i;
- if (s == NULL)
+ if (state == NULL)
return;
for (i = 0; i < ERR_NUM_ERRORS; i++) {
- err_clear(s, i, 1);
+ err_clear(state, i, 1);
}
- OPENSSL_free(s);
+ CRYPTO_free(state, OPENSSL_FILE, OPENSSL_LINE);
}
DEFINE_RUN_ONCE_STATIC(do_err_strings_init)
if (!CRYPTO_THREAD_set_local(&err_thread_local, (ERR_STATE*)-1))
return NULL;
- if ((state = OPENSSL_zalloc(sizeof(*state))) == NULL) {
+ /* calling CRYPTO_zalloc(.., NULL, 0) prevents mem alloc error loop */
+ state = CRYPTO_zalloc(sizeof(*state), NULL, 0);
+ if (state == NULL) {
CRYPTO_THREAD_set_local(&err_thread_local, NULL);
return NULL;
}
void *CRYPTO_malloc(size_t num, const char *file, int line)
{
+ void *ptr;
+
INCREMENT(malloc_count);
- if (malloc_impl != CRYPTO_malloc)
- return malloc_impl(num, file, line);
+ if (malloc_impl != CRYPTO_malloc) {
+ ptr = malloc_impl(num, file, line);
+ if (ptr != NULL || num == 0)
+ return ptr;
+ goto err;
+ }
if (num == 0)
return NULL;
allow_customize = 0;
}
- return malloc(num);
+ ptr = malloc(num);
+ if (ptr != NULL)
+ return ptr;
+ err:
+ /*
+ * ossl_err_get_state_int() in err.c uses CRYPTO_zalloc(num, NULL, 0) for
+ * ERR_STATE allocation. Prevent mem alloc error loop while reporting error.
+ */
+ if (file != NULL || line != 0) {
+ ERR_new();
+ ERR_set_debug(file, line, NULL);
+ ERR_set_error(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE, NULL);
+ }
+ return NULL;
}
void *CRYPTO_zalloc(size_t num, const char *file, int line)