==== blenlib ====
authorAndrea Weikert <elubie@gmx.net>
Mon, 19 Mar 2007 19:34:04 +0000 (19:34 +0000)
committerAndrea Weikert <elubie@gmx.net>
Mon, 19 Mar 2007 19:34:04 +0000 (19:34 +0000)
- added replacement BLI_snprintf for snprintf to avoid MSVC specific #defines for snprintf.
- BLI_snprintf also ensures trailing zero, so helps preventing buffer overflows

source/blender/blenlib/BLI_blenlib.h
source/blender/blenlib/intern/util.c
source/blender/src/editdeform.c

index 7b60aa178a784814a586eafb2f9d03eb0140a3b7..464b851413f7c28ae7821c0bc4c218e7458da222 100644 (file)
@@ -69,6 +69,8 @@
        because fillfacebase and fillvertbase are used outside */
 #include "DNA_listBase.h" 
 
+#include <stdlib.h>
+
 extern ListBase fillfacebase;
 extern ListBase fillvertbase;
 /**
@@ -196,6 +198,11 @@ char* BLI_strdupn(char *str, int len);
         */
 char* BLI_strncpy(char *dst, const char *src, int maxncpy);
 
+       /* 
+        * Replacement for snprintf
+        */
+int BLI_snprintf(char *buffer, size_t count, const char *format, ...);
+
        /**
         * Compare two strings
         * 
index e4fc9cc92f9e7ee787dbd1c695d1191981741d93..2aa1b852ed3b07fcb5cd34ae834fac744b57d926 100644 (file)
@@ -40,6 +40,7 @@
 #include <ctype.h>
 #include <string.h>
 #include <stdlib.h>
+#include <stdarg.h>
 
 #include "MEM_guardedalloc.h"
 
 
 #ifdef WIN32
 #include "BLI_winstuff.h"
+
+/* for duplicate_defgroup */
+#if !(defined vsnprintf)
+#define vsnprintf _vsnprintf
+#endif
+
 #endif
 
 
@@ -640,6 +647,24 @@ char *BLI_strncpy(char *dst, const char *src, int maxncpy) {
        return dst;
 }
 
+int BLI_snprintf(char *buffer, size_t count, const char *format, ...)
+{
+       int n;
+       va_list arg;
+
+       va_start(arg, format);
+       n = vsnprintf(buffer, count, format, arg);
+       
+       if (n != -1 && n < count) {
+               buffer[n] = '\0';
+       } else {
+               buffer[count-1] = '\0';
+       }
+       
+       va_end(arg);
+       return n;
+}
+
 int BLI_streq(char *a, char *b) {
        return (strcmp(a, b)==0);
 }
index 9b4b69130b82146e8f6e35e7c1ef4442b824742f..29324c28bf0f26430194a557690f877974131487 100644 (file)
@@ -217,14 +217,14 @@ void duplicate_defgroup ( Object *ob )
        if (!dg)
                return;
 
-       snprintf (name, 32, "%s_copy", dg->name);
+       BLI_snprintf (name, 32, "%s_copy", dg->name);
        while (get_named_vertexgroup (ob, name)) {
                if ((strlen (name) + 6) > 32) {
                        error ("Error: the name for the new group is > 32 characters");
                        return;
                }
                strcpy (s, name);
-               snprintf (name, 32, "%s_copy", s);
+               BLI_snprintf (name, 32, "%s_copy", s);
        }
 
        cdg = copy_defgroup (dg);