summaryrefslogtreecommitdiff
path: root/include/asterisk/utils.h
diff options
context:
space:
mode:
authorScott Griepentrog <sgriepentrog@digium.com>2015-03-17 22:03:37 +0000
committerScott Griepentrog <sgriepentrog@digium.com>2015-03-17 22:03:37 +0000
commitf25b2653293d0d96479d3d83795f40828f0b7bb7 (patch)
treee5d152dcafb84793b3682913e9a35a4b3098a11b /include/asterisk/utils.h
parent62cf2a2c02076e14792e5ded90942bc2b1b86961 (diff)
core: Introduce chaos into memory allocations
Locate potential crashes by exercising seldom used code paths. This patch introduces a new define DEBUG_CHAOS, and mechanism to randomly return an error condition from functions that will seldom do so. Functions that handle the allocation of memory get the first treatment. Review: https://reviewboard.asterisk.org/r/4463/ ........ Merged revisions 433060 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@433063 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'include/asterisk/utils.h')
-rw-r--r--include/asterisk/utils.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h
index 1dc351d0a..e4c4c8bea 100644
--- a/include/asterisk/utils.h
+++ b/include/asterisk/utils.h
@@ -485,6 +485,32 @@ long int ast_random(void);
*/
#define ast_random_double() (((double)ast_random()) / RAND_MAX)
+/*!
+ * \brief DEBUG_CHAOS returns failure randomly
+ *
+ * DEBUG_CHAOS_RETURN(failure); can be used to fake
+ * failure of functions such as memory allocation,
+ * for the purposes of testing failure handling.
+ */
+#ifdef DEBUG_CHAOS
+#ifndef DEBUG_CHAOS_ALLOC_CHANCE
+#define DEBUG_CHAOS_ALLOC_CHANCE 100000
+#endif
+/* Could #define DEBUG_CHAOS_ENABLE ast_fully_booted */
+#ifndef DEBUG_CHAOS_ENABLE
+#define DEBUG_CHAOS_ENABLE 1
+#endif
+#define DEBUG_CHAOS_RETURN(CHANCE, FAILURE) \
+ do { \
+ if ((DEBUG_CHAOS_ENABLE) && (ast_random() % CHANCE == 0)) { \
+ return FAILURE; \
+ } \
+ } while (0)
+#else
+#define DEBUG_CHAOS_RETURN(c,f)
+#endif
+
+
#ifndef __AST_DEBUG_MALLOC
#define ast_std_malloc malloc
#define ast_std_calloc calloc
@@ -537,6 +563,8 @@ void * attribute_malloc _ast_malloc(size_t len, const char *file, int lineno, co
{
void *p;
+ DEBUG_CHAOS_RETURN(DEBUG_CHAOS_ALLOC_CHANCE, NULL);
+
if (!(p = malloc(len))) {
MALLOC_FAILURE_MSG;
}
@@ -561,6 +589,8 @@ void * attribute_malloc _ast_calloc(size_t num, size_t len, const char *file, in
{
void *p;
+ DEBUG_CHAOS_RETURN(DEBUG_CHAOS_ALLOC_CHANCE, NULL);
+
if (!(p = calloc(num, len))) {
MALLOC_FAILURE_MSG;
}
@@ -598,6 +628,8 @@ void * attribute_malloc _ast_realloc(void *p, size_t len, const char *file, int
{
void *newp;
+ DEBUG_CHAOS_RETURN(DEBUG_CHAOS_ALLOC_CHANCE, NULL);
+
if (!(newp = realloc(p, len))) {
MALLOC_FAILURE_MSG;
}
@@ -626,6 +658,8 @@ char * attribute_malloc _ast_strdup(const char *str, const char *file, int linen
{
char *newstr = NULL;
+ DEBUG_CHAOS_RETURN(DEBUG_CHAOS_ALLOC_CHANCE, NULL);
+
if (str) {
if (!(newstr = strdup(str))) {
MALLOC_FAILURE_MSG;
@@ -656,6 +690,8 @@ char * attribute_malloc _ast_strndup(const char *str, size_t len, const char *fi
{
char *newstr = NULL;
+ DEBUG_CHAOS_RETURN(DEBUG_CHAOS_ALLOC_CHANCE, NULL);
+
if (str) {
if (!(newstr = strndup(str, len))) {
MALLOC_FAILURE_MSG;
@@ -697,6 +733,8 @@ int _ast_vasprintf(char **ret, const char *file, int lineno, const char *func, c
{
int res;
+ DEBUG_CHAOS_RETURN(DEBUG_CHAOS_ALLOC_CHANCE, -1);
+
if ((res = vasprintf(ret, fmt, ap)) == -1) {
MALLOC_FAILURE_MSG;
}