From: Eugene Syromiatnikov Date: Thu, 17 Jul 2025 01:29:35 +0000 (+0200) Subject: crypto/mem.c: factor out memory allocation failure reporting X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=bd1c59739d57ca27162bd582161a5cbddba21999;p=thirdparty%2Fopenssl.git crypto/mem.c: factor out memory allocation failure reporting Signed-off-by: Eugene Syromiatnikov Reviewed-by: Saša Nedvědický Reviewed-by: Matt Caswell Reviewed-by: Paul Dale Reviewed-by: Neil Horman (Merged from https://github.com/openssl/openssl/pull/28059) --- diff --git a/crypto/mem.c b/crypto/mem.c index be5b040669..c37d563f55 100644 --- a/crypto/mem.c +++ b/crypto/mem.c @@ -9,6 +9,7 @@ #include "internal/e_os.h" #include "internal/cryptlib.h" +#include "internal/mem_alloc_utils.h" #include "crypto/cryptlib.h" #include #include @@ -212,15 +213,7 @@ void *CRYPTO_malloc(size_t num, const char *file, int line) if (ossl_likely(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); - } + ossl_report_alloc_err(file, line); return NULL; } diff --git a/include/internal/mem_alloc_utils.h b/include/internal/mem_alloc_utils.h new file mode 100644 index 0000000000..b63977ee53 --- /dev/null +++ b/include/internal/mem_alloc_utils.h @@ -0,0 +1,50 @@ +/* + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * Utility overflow checking and reporting functions + */ + +#ifndef OSSL_INTERNAL_CHECK_SIZE_OVERFLOW_H +# define OSSL_INTERNAL_CHECK_SIZE_OVERFLOW_H + +# include "internal/common.h" + +# include +# include + +/* + * A helper routine to report memory allocation errors. + * Similar to the ERR_raise() macro, but accepts explicit file/line arguments, + * pre-defines the library to ERR_LIB_CRYPTO, and avoids emitting an error + * if both file set to NULL and line set to 0. + */ +static ossl_inline ossl_unused void +ossl_report_alloc_err_ex(const char * const file, const int line, + const int reason) +{ + /* + * 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, reason, NULL); + } +} + +/* Report a memory allocation failure. */ +static inline void +ossl_report_alloc_err(const char * const file, const int line) +{ + ossl_report_alloc_err_ex(file, line, ERR_R_MALLOC_FAILURE); +} + +#endif /* OSSL_INTERNAL_CHECK_SIZE_OVERFLOW_H */