#include <string.h>
#include <openssl/params.h>
#include <openssl/param_build.h>
+#include "internal/mem_alloc_utils.h"
#include "internal/param_build_set.h"
#define OSSL_PARAM_ALLOCATED_END 127
static int ossl_param_buf_alloc(OSSL_PARAM_BUF *out, size_t extra_blocks,
int is_secure)
{
- size_t sz = OSSL_PARAM_ALIGN_SIZE * (extra_blocks + out->blocks);
+ size_t num_blocks, sz = 0;
+
+ if (ossl_unlikely(!ossl_size_add(extra_blocks, out->blocks, &num_blocks,
+ OPENSSL_FILE, OPENSSL_LINE)
+ || !ossl_size_mul(num_blocks, OSSL_PARAM_ALIGN_SIZE, &sz,
+ OPENSSL_FILE, OPENSSL_LINE)))
+ return 0;
out->alloc = is_secure ? OPENSSL_secure_zalloc(sz) : OPENSSL_zalloc(sz);
if (out->alloc == NULL)
return true;
}
+/*
+ * Check the result of size1 and size2 addition for overflow
+ * and set error if it is the case.
+ */
+static ossl_inline ossl_unused bool
+ossl_size_add_of(const size_t size1, const size_t size2, size_t *bytes,
+ const char * const file, const int line)
+{
+ *bytes = size1 + size2;
+
+ if (ossl_unlikely(*bytes < size1)) {
+ ossl_report_alloc_err_of(file, line);
+
+ return true;
+ }
+
+ return false;
+}
+
#endif /* OSSL_INTERNAL_CHECK_SIZE_OVERFLOW_H */
num = el->alloc_iovec != 0 ? el->alloc_iovec * 2 : 8;
- iovec = OPENSSL_realloc(el->iovec, sizeof(OSSL_QTX_IOVEC) * num);
+ iovec = OPENSSL_realloc_array(el->iovec, num, sizeof(OSSL_QTX_IOVEC));
if (iovec == NULL)
return 0;