diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-01-20 19:24:42 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-01-20 19:24:42 +0000 |
commit | 834f1b57898c31c92aa60d7ab9dc6ab8dea0e206 (patch) | |
tree | 604e6ab5b89c6ad12370245015699b0e5991f6f5 /include | |
parent | ae8c68e98db8d72d26fa86c995dbf639d7b57a6c (diff) |
- 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.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@8356 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'include')
-rw-r--r-- | include/asterisk/channel.h | 11 | ||||
-rw-r--r-- | include/asterisk/utils.h | 36 |
2 files changed, 31 insertions, 16 deletions
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index 6121481d0..449b38e0f 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -1174,17 +1174,6 @@ static inline int ast_select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, #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 diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h index 9c09fe8da..070a6af0d 100644 --- a/include/asterisk/utils.h +++ b/include/asterisk/utils.h @@ -261,7 +261,7 @@ void *_ast_malloc(size_t len, const char *file, int lineno, const char *func), 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 @@ void *_ast_calloc(size_t num, size_t len, const char *file, int lineno, const ch 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 @@ void *_ast_realloc(void *p, size_t len, const char *file, int lineno, const char 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 @@ char *_ast_strdup(const char *str, const char *file, int lineno, const char *fun 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 @@ char *_ast_strndup(const char *str, size_t len, const char *file, int lineno, co 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 @@ char *_ast_strndup(const char *str, size_t len, const char *file, int lineno, co } ) +#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 */ |