aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-11-16 02:20:16 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-11-16 02:20:16 +0000
commit21a0359fab067eb9ab1808f268a4c9a1e08c8635 (patch)
treeb3d64be02c95c7c681ddbe923a0e55a5b4aa3b5d
parente7e1a85da61dab679f0bf1a688e5be109f48d248 (diff)
issue #5035
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@7110 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-xChangeLog2
-rwxr-xr-xastmm.c29
2 files changed, 16 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index e6a0d94f7..370dfbaa8 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
2005-11-15 Kevin P. Fleming <kpfleming@limerick.digium.com>
+ * astmm.c (__ast_vasprintf): don't re-use the ap list without copying it; that's not safe on some platforms (issue #5035)
+
* doc/README.backtrace: add note about properly building Asterisk to be able to produce backtraces; wrap text and remove DOS line endings
* channels/chan_sip.c (add_codec_to_sdp): add 'annexb=no' to G.729A SDP (issue #5539)
diff --git a/astmm.c b/astmm.c
index d1692de27..3f94e05fa 100755
--- a/astmm.c
+++ b/astmm.c
@@ -254,21 +254,20 @@ char *__ast_strndup(const char *s, size_t n, const char *file, int lineno, const
int __ast_vasprintf(char **strp, const char *fmt, va_list ap, const char *file, int lineno, const char *func)
{
- int n, size = strlen(fmt) + 1;
- if ((*strp = __ast_alloc_region(size, FUNC_VASPRINTF, file, lineno, func)) == NULL)
- return -1;
- for (;;) {
- n = vsnprintf(*strp, size, fmt, ap);
- if (n > -1 && n < size)
- return n;
- if (n > -1) { /* glibc 2.1 */
- size = n+1;
- } else { /* glibc 2.0 */
- size *= 2;
- }
- if ((*strp = __ast_realloc(*strp, size, file, lineno, func)) == NULL)
- return -1;
- }
+ int size;
+ va_list ap2;
+ char s;
+
+ *strp = NULL;
+ va_copy(ap2, ap);
+ size = vsnprintf(&s, 1, fmt, ap2);
+ va_end(ap2);
+ *strp = __ast_alloc_region(size + 1, FUNC_VASPRINTF, file, lineno, func);
+ if (!*strp)
+ return -1;
+ vsnprintf(*strp, size + 1, fmt, ap);
+
+ return size;
}
static int handle_show_memory(int fd, int argc, char *argv[])