]> git.ipfire.org Git - thirdparty/sarg.git/commitdiff
Work around a bug in mingw's snprintf
authorFrederic Marchal <fmarchal@users.sourceforge.net>
Sat, 26 Jan 2013 19:16:07 +0000 (20:16 +0100)
committerFrederic Marchal <fmarchal@users.sourceforge.net>
Sat, 26 Jan 2013 19:16:07 +0000 (20:16 +0100)
snprintf doesn't limit the output string to the requested size (or at least
not strictly). The formatted numbers displayed in the report were wrong.

util.c

diff --git a/util.c b/util.c
index 92dfd60e4f53fcc3000758b4f132ca1de0bc5043..e3a5dd6d23809067270c1b25843fdb1d928caadb 100644 (file)
--- a/util.c
+++ b/util.c
@@ -594,55 +594,58 @@ char *fixnum(long long int value, int n)
        char *pret;
        register int i, j, k;
        int numlen;
-       static char abbrev[30];
+       static char abbrev[30]="";
 
        my_lltoa(value, num, sizeof(num), 0);
 
        if(DisplayedValues==DISPLAY_ABBREV) {
                numlen = strlen(num);
                if(numlen <= 3)
-                       sprintf(abbrev,"%s",num);
-               if(numlen == 4 || numlen == 7 || numlen == 10 || numlen == 13) {
-                       snprintf(abbrev,2,"%s",num);
-                       strncat(abbrev,".",1);
-                       strncat(abbrev,num+1,2);
+                       strcpy(abbrev,num);
+               else if(numlen == 4 || numlen == 7 || numlen == 10 || numlen == 13) {
+                       memcpy(abbrev,num,1);
+                       abbrev[1]='.';
+                       strncpy(abbrev+2,num+1,2);
+                       abbrev[4]='\0';
                        if(!n) return(abbrev);
                        if(numlen == 4)
-                               strncat(abbrev,"K",1);
+                               strcat(abbrev,"K");
                        else if(numlen == 7)
-                               strncat(abbrev,"M",1);
+                               strcat(abbrev,"M");
                        else if(numlen == 10)
-                               strncat(abbrev,"G",1);
+                               strcat(abbrev,"G");
                        else if(numlen == 13)
-                               strncat(abbrev,"T",1);
+                               strcat(abbrev,"T");
                }
-               if(numlen == 5 || numlen == 8 || numlen == 11 || numlen == 14) {
-                       snprintf(abbrev,3,"%s",num);
-                       strncat(abbrev,".",1);
-                       strncat(abbrev,num+2,2);
+               else if(numlen == 5 || numlen == 8 || numlen == 11 || numlen == 14) {
+                       memcpy(abbrev,num,2);
+                       abbrev[2]='.';
+                       strncpy(abbrev+3,num+2,2);
+                       abbrev[5]='\0';
                        if(!n) return(abbrev);
                        if(numlen == 5)
-                               strncat(abbrev,"K",1);
+                               strcat(abbrev,"K");
                        else if(numlen == 8)
-                               strncat(abbrev,"M",1);
+                               strcat(abbrev,"M");
                        else if(numlen == 11)
-                               strncat(abbrev,"G",1);
+                               strcat(abbrev,"G");
                        else if(numlen == 14)
-                               strncat(abbrev,"T",1);
+                               strcat(abbrev,"T");
                }
-               if(numlen == 6 || numlen == 9 || numlen == 12 || numlen == 15) {
-                       snprintf(abbrev,4,"%s",num);
-                       strncat(abbrev,".",1);
-                       strncat(abbrev,num+3,2);
+               else if(numlen == 6 || numlen == 9 || numlen == 12 || numlen == 15) {
+                       memcpy(abbrev,num,3);
+                       abbrev[3]='.';
+                       strncpy(abbrev+4,num+3,2);
+                       abbrev[6]='\0';
                        if(!n) return(abbrev);
                        if(numlen == 6)
-                               strncat(abbrev,"K",1);
+                               strcat(abbrev,"K");
                        else if(numlen == 9)
-                               strncat(abbrev,"M",1);
+                               strcat(abbrev,"M");
                        else if(numlen == 12)
-                               strncat(abbrev,"G",1);
+                               strcat(abbrev,"G");
                        else if(numlen == 15)
-                               strncat(abbrev,"T",1);
+                               strcat(abbrev,"T");
                }
 
                return(abbrev);