cp duplicateStringValue()
diff --git a/include/json/value.h b/include/json/value.h
index 14c4129..229aa9e 100644
--- a/include/json/value.h
+++ b/include/json/value.h
@@ -518,7 +518,7 @@
LargestUInt uint_;
double real_;
bool bool_;
- char* string_;
+ char* string_; // actually ptr to unsigned, followed by str
ObjectValues* map_;
} value_;
ValueType type_ : 8;
diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp
index 3378e76..eae87db 100644
--- a/src/lib_json/json_value.cpp
+++ b/src/lib_json/json_value.cpp
@@ -100,6 +100,28 @@
return newString;
}
+/* Record the length as a prefix.
+ */
+static inline char* duplicatePrefixedStringValue(
+ const char* value,
+ unsigned int length = unknown)
+{
+ if (length == unknown)
+ length = (unsigned int)strlen(value);
+
+ // Avoid an integer overflow in the call to malloc below by limiting length
+ // to a sane value.
+ if (length >= (unsigned)Value::maxInt)
+ length = Value::maxInt - 1;
+
+ char* newString = static_cast<char*>(malloc(length + 1));
+ JSON_ASSERT_MESSAGE(newString != 0,
+ "in Json::Value::duplicateStringValue(): "
+ "Failed to allocate string value buffer");
+ memcpy(newString, value, length);
+ newString[length] = 0;
+ return newString;
+}
/** Free the string duplicated by duplicateStringValue().
*/
static inline void releaseStringValue(char* value) { free(value); }