[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34274] trunk/blender/source/blender/ blenlib/intern/BLI_dynstr.c: BLI_dynstr_vappendf() was crashing with strings above 256 chars, this happens with some long reports.

Campbell Barton ideasman42 at gmail.com
Wed Jan 12 06:49:34 CET 2011


Revision: 34274
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34274
Author:   campbellbarton
Date:     2011-01-12 05:49:33 +0000 (Wed, 12 Jan 2011)
Log Message:
-----------
BLI_dynstr_vappendf() was crashing with strings above 256 chars, this happens with some long reports.
Problem was using va_list value more then once, fix by using va_copy().

Note, va_copy() is c99 spec but only alternative I can see is to turn BLI_dynstr_vappendf() into a macro which calls va_start/end inline.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/intern/BLI_dynstr.c

Modified: trunk/blender/source/blender/blenlib/intern/BLI_dynstr.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/BLI_dynstr.c	2011-01-12 03:41:12 UTC (rev 34273)
+++ trunk/blender/source/blender/blenlib/intern/BLI_dynstr.c	2011-01-12 05:49:33 UTC (rev 34274)
@@ -101,15 +101,21 @@
 void BLI_dynstr_vappendf(DynStr *ds, const char *format, va_list args)
 {
 	char *message, fixedmessage[256];
-	int len= 256, maxlen= 65536, retval;
+	int len= sizeof(fixedmessage);
+	const int maxlen= 65536;
+	int retval;
 
 	while(1) {
+		va_list args_cpy;
 		if(len == sizeof(fixedmessage))
 			message= fixedmessage;
 		else
 			message= MEM_callocN(sizeof(char)*(len+1), "BLI_dynstr_appendf");
 
-		retval= vsnprintf(message, len, format, args);
+		/* cant reuse the same args, so work on a copy */
+		va_copy(args_cpy, args);
+		retval= vsnprintf(message, len, format, args_cpy);
+		va_end(args_cpy);
 
 		if(retval == -1) {
 			/* -1 means not enough space, but on windows it may also mean




More information about the Bf-blender-cvs mailing list