diff options
author | Sverker Eriksson <[email protected]> | 2014-02-05 12:30:48 +0100 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2014-02-05 12:30:48 +0100 |
commit | c4e046b9d46da5e718ddf4ef5c863315dea8d274 (patch) | |
tree | 8ef32e15061e5ae0fe45cc08347e651efadc8be7 /lib/crypto/c_src/crypto_callback.c | |
parent | fdcdaca338849d7f63d4300e489318f6ee275d82 (diff) | |
download | otp-c4e046b9d46da5e718ddf4ef5c863315dea8d274.tar.gz otp-c4e046b9d46da5e718ddf4ef5c863315dea8d274.tar.bz2 otp-c4e046b9d46da5e718ddf4ef5c863315dea8d274.zip |
crypto: Abort VM if out of memory
Nice crash instead of segv or worse.
Diffstat (limited to 'lib/crypto/c_src/crypto_callback.c')
-rw-r--r-- | lib/crypto/c_src/crypto_callback.c | 22 |
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) { |