[asterisk-commits] sgriepentrog: trunk r433063 - in /trunk: ./ build_tools/ include/asterisk/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Mar 17 17:03:38 CDT 2015


Author: sgriepentrog
Date: Tue Mar 17 17:03:37 2015
New Revision: 433063

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=433063
Log:
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

Modified:
    trunk/   (props changed)
    trunk/build_tools/cflags.xml
    trunk/include/asterisk/utils.h

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-13-merged' - no diff available.

Modified: trunk/build_tools/cflags.xml
URL: http://svnview.digium.com/svn/asterisk/trunk/build_tools/cflags.xml?view=diff&rev=433063&r1=433062&r2=433063
==============================================================================
--- trunk/build_tools/cflags.xml (original)
+++ trunk/build_tools/cflags.xml Tue Mar 17 17:03:37 2015
@@ -79,6 +79,10 @@
 		<member name="MALLOC_DEBUG" displayname="Keep Track of Memory Allocations">
 			<support_level>core</support_level>
 		</member>
+		<member name="DEBUG_CHAOS" displayname="Randomly FAIL memory allocations or other operations">
+			<conflict>MALLOC_DEBUG</conflict>
+			<support_level>core</support_level>
+		</member>
 		<member name="BUSYDETECT_TONEONLY" displayname="Enable additional comparision of only the tone duration not the silence part">
 			<conflict>BUSYDETECT_COMPARE_TONE_AND_SILENCE</conflict>
 			<defaultenabled>no</defaultenabled>

Modified: trunk/include/asterisk/utils.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/utils.h?view=diff&rev=433063&r1=433062&r2=433063
==============================================================================
--- trunk/include/asterisk/utils.h (original)
+++ trunk/include/asterisk/utils.h Tue Mar 17 17:03:37 2015
@@ -485,6 +485,32 @@
  */
 #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 *p;
 
+	DEBUG_CHAOS_RETURN(DEBUG_CHAOS_ALLOC_CHANCE, NULL);
+
 	if (!(p = malloc(len))) {
 		MALLOC_FAILURE_MSG;
 	}
@@ -561,6 +589,8 @@
 {
 	void *p;
 
+	DEBUG_CHAOS_RETURN(DEBUG_CHAOS_ALLOC_CHANCE, NULL);
+
 	if (!(p = calloc(num, len))) {
 		MALLOC_FAILURE_MSG;
 	}
@@ -598,6 +628,8 @@
 {
 	void *newp;
 
+	DEBUG_CHAOS_RETURN(DEBUG_CHAOS_ALLOC_CHANCE, NULL);
+
 	if (!(newp = realloc(p, len))) {
 		MALLOC_FAILURE_MSG;
 	}
@@ -625,6 +657,8 @@
 char * attribute_malloc _ast_strdup(const char *str, const char *file, int lineno, const char *func),
 {
 	char *newstr = NULL;
+
+	DEBUG_CHAOS_RETURN(DEBUG_CHAOS_ALLOC_CHANCE, NULL);
 
 	if (str) {
 		if (!(newstr = strdup(str))) {
@@ -656,6 +690,8 @@
 {
 	char *newstr = NULL;
 
+	DEBUG_CHAOS_RETURN(DEBUG_CHAOS_ALLOC_CHANCE, NULL);
+
 	if (str) {
 		if (!(newstr = strndup(str, len))) {
 			MALLOC_FAILURE_MSG;
@@ -696,6 +732,8 @@
 int _ast_vasprintf(char **ret, const char *file, int lineno, const char *func, const char *fmt, va_list ap),
 {
 	int res;
+
+	DEBUG_CHAOS_RETURN(DEBUG_CHAOS_ALLOC_CHANCE, -1);
 
 	if ((res = vasprintf(ret, fmt, ap)) == -1) {
 		MALLOC_FAILURE_MSG;




More information about the asterisk-commits mailing list