Index: core/include/fxcrt/fx_string.h |
diff --git a/core/include/fxcrt/fx_string.h b/core/include/fxcrt/fx_string.h |
index a7cf2e1c16d0817dac55bb350d44082ef5322878..c98a77cfe144dc903bfd258586f4afb3dc68ac04 100644 |
--- a/core/include/fxcrt/fx_string.h |
+++ b/core/include/fxcrt/fx_string.h |
@@ -7,6 +7,7 @@ |
#ifndef _FX_STRING_H_ |
#define _FX_STRING_H_ |
+#include <stdint.h> // For intptr_t. |
#include <algorithm> |
#include "fx_memory.h" |
@@ -168,14 +169,17 @@ private: |
typedef const CFX_ByteStringC& FX_BSTR; |
#define FX_BSTRC(str) CFX_ByteStringC(str, sizeof str-1) |
#define FXBSTR_ID(c1, c2, c3, c4) ((c1 << 24) | (c2 << 16) | (c3 << 8) | (c4)) |
-struct CFX_StringData { |
- |
- long m_nRefs; |
+// To ensure ref counts do not overflow, consider the worst possible case: |
+// the entire address space contains nothing but pointers to this object. |
+// Since the count increments with each new pointer, the largest value is |
+// the number of pointers that can fit into the address space. The size of |
+// the address space itself is a good upper bound on it; we need not go |
+// larger. |
+struct CFX_StringData { |
+ intptr_t m_nRefs; // Would prefer ssize_t, but no windows support. |
FX_STRSIZE m_nDataLength; |
- |
FX_STRSIZE m_nAllocLength; |
- |
FX_CHAR m_String[1]; |
}; |
class CFX_ByteString |
@@ -586,13 +590,9 @@ private: |
typedef const CFX_WideStringC& FX_WSTR; |
#define FX_WSTRC(wstr) CFX_WideStringC(wstr, FX_ArraySize(wstr) - 1) |
struct CFX_StringDataW { |
- |
- long m_nRefs; |
- |
+ intptr_t m_nRefs; // Would prefer ssize_t, but no windows support. |
FX_STRSIZE m_nDataLength; |
- |
FX_STRSIZE m_nAllocLength; |
- |
FX_WCHAR m_String[1]; |
}; |
class CFX_WideString |