[asterisk-commits] trunk - r8356 in /trunk/include/asterisk:
channel.h utils.h
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Fri Jan 20 12:24:44 MST 2006
Author: russell
Date: Fri Jan 20 13:24:42 2006
New Revision: 8356
URL: http://svn.digium.com/view/asterisk?rev=8356&view=rev
Log:
- move ast_strdupa from channel.h to utils.h
- attempt to log an error message if the __builtin_alloca inside of ast_strdupa
fails.
- document the fact that it is known and intended behavior for ast_strdupa to
cause Asterisk to crash if the alloca fails
- use __builtin_expect when checking for allocation failure in all of the
allocation wrappers
New Janitor Project! Anywhere that we check for a successful allocation after
a call to ast_strdupa is unnecessary and should be removed.
Modified:
trunk/include/asterisk/channel.h
trunk/include/asterisk/utils.h
Modified: trunk/include/asterisk/channel.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/channel.h?rev=8356&r1=8355&r2=8356&view=diff
==============================================================================
--- trunk/include/asterisk/channel.h (original)
+++ trunk/include/asterisk/channel.h Fri Jan 20 13:24:42 2006
@@ -1174,17 +1174,6 @@
#endif
}
-#if !defined(ast_strdupa) && defined(__GNUC__)
-# define ast_strdupa(s) \
- (__extension__ \
- ({ \
- __const char *__old = (s); \
- size_t __len = strlen (__old) + 1; \
- char *__new = (char *) __builtin_alloca (__len); \
- (char *) memcpy (__new, __old, __len); \
- }))
-#endif
-
#ifdef DO_CRASH
#define CRASH do { fprintf(stderr, "!! Forcing immediate crash a-la abort !!\n"); *((int *)0) = 0; } while(0)
#else
Modified: trunk/include/asterisk/utils.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/utils.h?rev=8356&r1=8355&r2=8356&view=diff
==============================================================================
--- trunk/include/asterisk/utils.h (original)
+++ trunk/include/asterisk/utils.h Fri Jan 20 13:24:42 2006
@@ -261,7 +261,7 @@
p = malloc(len);
- if (!p)
+ if (__builtin_expect(!p, 0))
ast_log(LOG_ERROR, "Memory Allocation Failure - '%d' bytes in function %s at line %d of %s\n", (int)len, func, lineno, file);
return p;
@@ -286,7 +286,7 @@
p = calloc(num, len);
- if (!p)
+ if (__builtin_expect(!p, 0))
ast_log(LOG_ERROR, "Memory Allocation Failure - '%d' bytes in function %s at line %d of %s\n", (int)len, func, lineno, file);
return p;
@@ -311,7 +311,7 @@
newp = realloc(p, len);
- if (!newp)
+ if (__builtin_expect(!newp, 0))
ast_log(LOG_ERROR, "Memory Allocation Failure - '%d' bytes in function %s at line %d of %s\n", (int)len, func, lineno, file);
return newp;
@@ -341,7 +341,7 @@
if (str) {
newstr = strdup(str);
- if (!newstr)
+ if (__builtin_expect(!newstr, 0))
ast_log(LOG_ERROR, "Memory Allocation Failure - Could not duplicate '%s' in function %s at line %d of %s\n", str, func, lineno, file);
}
@@ -372,7 +372,7 @@
if (str) {
newstr = strndup(str, len);
- if (!newstr)
+ if (__builtin_expect(!newstr, 0))
ast_log(LOG_ERROR, "Memory Allocation Failure - Could not duplicate '%d' bytes of '%s' in function %s at line %d of %s\n", (int)len, str, func, lineno, file);
}
@@ -380,4 +380,30 @@
}
)
+#if !defined(ast_strdupa) && defined(__GNUC__)
+/*!
+ \brief duplicate a string in memory from the stack
+ \param s The string to duplicate
+
+ This macro will duplicate the given string. It returns a pointer to the stack
+ allocatted memory for the new string.
+
+ \note If this function fails to allocate memory on the stack, we do not make
+ any effort to prevent Asterisk from crashing. We will attempt to log an
+ error message, but Asterisk will crash shortly after.
+*/
+#define ast_strdupa(s) \
+ (__extension__ \
+ ({ \
+ const char *__old = (s); \
+ size_t __len = strlen(__old) + 1; \
+ char *__new = __builtin_alloca(__len); \
+ if (__builtin_expect(!__new, 0)) \
+ ast_log(LOG_ERROR, "Stack Allocation Error in" \
+ "function '%s' at line '%d' of '%s'!\n", \
+ __PRETTY_FUNCTION__, __LINE__, __FILE__); \
+ (char *) memcpy (__new, __old, __len); \
+ }))
+#endif
+
#endif /* _ASTERISK_UTILS_H */
More information about the asterisk-commits
mailing list