Prechádzať zdrojové kódy

r12006@catbus: nickm | 2007-02-28 16:06:24 -0500
On mingw, use "%I64u" to printf/scanf 64-bit integers, instead of the usual GCC "%llu". This prevents a bug when saving 64-bit int configuration values on mingw; the high-order 32 bits would get truncated. If the value was then reloaded, disaster would occur. (Fixes bug 400 and maybe also bug 397.) Backport candidate.


svn:r9691

Nick Mathewson 18 rokov pred
rodič
commit
e2b1a77c3e
2 zmenil súbory, kde vykonal 11 pridanie a 2 odobranie
  1. 5 0
      ChangeLog
  2. 6 2
      src/common/compat.h

+ 5 - 0
ChangeLog

@@ -24,6 +24,11 @@ Changes in version 0.1.2.9-??? - 2007-??-??
       of 2 as indicating that the server is completely bad; it sometimes
       of 2 as indicating that the server is completely bad; it sometimes
       means that the server is just bad for the request in question. (may fix
       means that the server is just bad for the request in question. (may fix
       the last of bug 326.)
       the last of bug 326.)
+    - On mingw, use "%I64u" to printf/scanf 64-bit integers, instead of the
+      usual GCC "%llu".  This prevents a bug when saving 64-bit int
+      configuration values on mingw; the high-order 32 bits would get
+      truncated.  If the value was then reloaded, disaster would
+      occur. (Fixes bug 400 and maybe also bug 397.)
 
 
 
 
 Changes in version 0.1.2.8-beta - 2007-02-26
 Changes in version 0.1.2.8-beta - 2007-02-26

+ 6 - 2
src/common/compat.h

@@ -123,15 +123,19 @@ size_t strlcpy(char *dst, const char *src, size_t siz) ATTR_NONNULL((1,2));
 #ifdef _MSC_VER
 #ifdef _MSC_VER
 #define U64_PRINTF_ARG(a) (a)
 #define U64_PRINTF_ARG(a) (a)
 #define U64_SCANF_ARG(a) (a)
 #define U64_SCANF_ARG(a) (a)
-#define U64_FORMAT "%I64u"
 #define U64_LITERAL(n) (n ## ui64)
 #define U64_LITERAL(n) (n ## ui64)
 #else
 #else
 #define U64_PRINTF_ARG(a) ((long long unsigned int)(a))
 #define U64_PRINTF_ARG(a) ((long long unsigned int)(a))
 #define U64_SCANF_ARG(a) ((long long unsigned int*)(a))
 #define U64_SCANF_ARG(a) ((long long unsigned int*)(a))
-#define U64_FORMAT "%llu"
 #define U64_LITERAL(n) (n ## llu)
 #define U64_LITERAL(n) (n ## llu)
 #endif
 #endif
 
 
+#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
+#define U64_FORMAT "%I64u"
+#else
+#define U64_FORMAT "%llu"
+#endif
+
 /** Represents an mmaped file. Allocated via tor_mmap_file; freed with
 /** Represents an mmaped file. Allocated via tor_mmap_file; freed with
  * tor_munmap_file. */
  * tor_munmap_file. */
 typedef struct tor_mmap_t {
 typedef struct tor_mmap_t {