Index: nspr/pr/src/io/prprf.c |
diff --git a/nspr/pr/src/io/prprf.c b/nspr/pr/src/io/prprf.c |
index aa7852ffad12b3732e8919ead7feebbeeb5f93f4..a2eb4171a846aaf5a39a06ff0a2feddafdfab169 100644 |
--- a/nspr/pr/src/io/prprf.c |
+++ b/nspr/pr/src/io/prprf.c |
@@ -18,6 +18,10 @@ |
#include "prlog.h" |
#include "prmem.h" |
+#ifdef _MSC_VER |
+#define snprintf _snprintf |
+#endif |
+ |
/* |
** WARNING: This code may *NOT* call PR_LOG (because PR_LOG calls it) |
*/ |
@@ -304,7 +308,7 @@ static int cvt_ll(SprintfState *ss, PRInt64 num, int width, int prec, int radix, |
** Convert a double precision floating point number into its printable |
** form. |
** |
-** XXX stop using sprintf to convert floating point |
+** XXX stop using snprintf to convert floating point |
*/ |
static int cvt_f(SprintfState *ss, double d, const char *fmt0, const char *fmt1) |
{ |
@@ -312,15 +316,14 @@ static int cvt_f(SprintfState *ss, double d, const char *fmt0, const char *fmt1) |
char fout[300]; |
int amount = fmt1 - fmt0; |
- PR_ASSERT((amount > 0) && (amount < sizeof(fin))); |
- if (amount >= sizeof(fin)) { |
- /* Totally bogus % command to sprintf. Just ignore it */ |
+ if (amount <= 0 || amount >= sizeof(fin)) { |
+ /* Totally bogus % command to snprintf. Just ignore it */ |
return 0; |
} |
memcpy(fin, fmt0, amount); |
fin[amount] = 0; |
- /* Convert floating point using the native sprintf code */ |
+ /* Convert floating point using the native snprintf code */ |
#ifdef DEBUG |
{ |
const char *p = fin; |
@@ -330,14 +333,11 @@ static int cvt_f(SprintfState *ss, double d, const char *fmt0, const char *fmt1) |
} |
} |
#endif |
- sprintf(fout, fin, d); |
- |
- /* |
- ** This assert will catch overflow's of fout, when building with |
- ** debugging on. At least this way we can track down the evil piece |
- ** of calling code and fix it! |
- */ |
- PR_ASSERT(strlen(fout) < sizeof(fout)); |
+ memset(fout, 0, sizeof(fout)); |
+ snprintf(fout, sizeof(fout), fin, d); |
+ /* Explicitly null-terminate fout because on Windows snprintf doesn't |
+ * append a null-terminator if the buffer is too small. */ |
+ fout[sizeof(fout) - 1] = '\0'; |
return (*ss->stuff)(ss, fout, strlen(fout)); |
} |