aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2014-02-19 16:39:39 +0100
committerSverker Eriksson <[email protected]>2014-02-19 16:40:06 +0100
commita40cc981b6b13d9a6514d2c326eb5f4904f80983 (patch)
tree9f7a55f90f6e8eab069a9b259523c5c5511bf5c4
parent8c17e706e212b859f1a248f43c8091e8d541b08e (diff)
parentc4e046b9d46da5e718ddf4ef5c863315dea8d274 (diff)
downloadotp-a40cc981b6b13d9a6514d2c326eb5f4904f80983.tar.gz
otp-a40cc981b6b13d9a6514d2c326eb5f4904f80983.tar.bz2
otp-a40cc981b6b13d9a6514d2c326eb5f4904f80983.zip
Merge branch 'sverk/crypto/nomem-abort'
OTP-11725 * sverk/crypto/nomem-abort: crypto: Abort VM if out of memory
-rw-r--r--lib/crypto/c_src/crypto_callback.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/crypto/c_src/crypto_callback.c b/lib/crypto/c_src/crypto_callback.c
index 81106b4cc2..a08dcec463 100644
--- a/lib/crypto/c_src/crypto_callback.c
+++ b/lib/crypto/c_src/crypto_callback.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2012. All Rights Reserved.
+ * Copyright Ericsson AB 2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -17,6 +17,7 @@
* %CopyrightEnd%
*/
+#include <stdio.h>
#include <string.h>
#include <openssl/opensslconf.h>
@@ -51,13 +52,28 @@ DLLEXPORT struct crypto_callbacks* get_crypto_callbacks(int nlocks);
static ErlNifRWLock** lock_vec = NULL; /* Static locks used by openssl */
+static void nomem(size_t size, const char* op)
+{
+ fprintf(stderr, "Out of memory abort. Crypto failed to %s %zu bytes.\r\n",
+ op, size);
+ abort();
+}
+
static void* crypto_alloc(size_t size)
{
- return enif_alloc(size);
+ void *ret = enif_alloc(size);
+
+ if (!ret && size)
+ nomem(size, "allocate");
+ return ret;
}
static void* crypto_realloc(void* ptr, size_t size)
{
- return enif_realloc(ptr, size);
+ void* ret = enif_realloc(ptr, size);
+
+ if (!ret && size)
+ nomem(size, "reallocate");
+ return ret;
}
static void crypto_free(void* ptr)
{