[Asterisk-cvs] asterisk ChangeLog,1.132,1.133 astmm.c,1.23,1.24

kpfleming kpfleming
Tue Nov 15 21:30:15 CST 2005


Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv30684

Modified Files:
	ChangeLog astmm.c 
Log Message:
issue #5035


Index: ChangeLog
===================================================================
RCS file: /usr/cvsroot/asterisk/ChangeLog,v
retrieving revision 1.132
retrieving revision 1.133
diff -u -d -r1.132 -r1.133
--- ChangeLog	16 Nov 2005 00:56:10 -0000	1.132
+++ ChangeLog	16 Nov 2005 02:20:16 -0000	1.133
@@ -1,5 +1,7 @@
 2005-11-15  Kevin P. Fleming  <kpfleming at 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)

Index: astmm.c
===================================================================
RCS file: /usr/cvsroot/asterisk/astmm.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- astmm.c	24 Oct 2005 20:12:04 -0000	1.23
+++ astmm.c	16 Nov 2005 02:20:16 -0000	1.24
@@ -254,21 +254,20 @@
 
 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[])




More information about the svn-commits mailing list