diff --git a/src/SerializedObject.cpp b/src/SerializedObject.cpp index 2b9ee828e6..7ff7482648 100644 --- a/src/SerializedObject.cpp +++ b/src/SerializedObject.cpp @@ -836,18 +836,18 @@ std::auto_ptr STObject::parseJson(const Json::Value& object, SField::r { case STI_UINT8: if (value.isString()) - data.push_back(new STUInt8(field, lexical_cast_s(value.asString()))); + data.push_back(new STUInt8(field, lexical_cast_st(value.asString()))); else if (value.isInt()) { if (value.asInt() < 0 || value.asInt() > 255) throw std::runtime_error("value out of rand"); - data.push_back(new STUInt8(field, static_cast(value.asInt()))); + data.push_back(new STUInt8(field, range_check_cast(value.asInt(), 0, 255))); } else if (value.isUInt()) { if (value.asUInt() > 255) throw std::runtime_error("value out of rand"); - data.push_back(new STUInt8(field, static_cast(value.asUInt()))); + data.push_back(new STUInt8(field, range_check_cast(value.asUInt(), 0, 255))); } else throw std::runtime_error("Incorrect type"); @@ -881,32 +881,33 @@ std::auto_ptr STObject::parseJson(const Json::Value& object, SField::r throw std::runtime_error("Invalid field data"); } else - data.push_back(new STUInt16(field, lexical_cast_s(strValue))); + data.push_back(new STUInt16(field, lexical_cast_st(strValue))); } else if (value.isInt()) - data.push_back(new STUInt16(field, static_cast(value.asInt()))); + data.push_back(new STUInt16(field, range_check_cast(value.asInt(), 0, 65535))); else if (value.isUInt()) - data.push_back(new STUInt16(field, static_cast(value.asUInt()))); + data.push_back(new STUInt16(field, range_check_cast(value.asUInt(), 0, 65535))); else throw std::runtime_error("Incorrect type"); break; case STI_UINT32: if (value.isString()) - data.push_back(new STUInt32(field, lexical_cast_s(value.asString()))); + data.push_back(new STUInt32(field, lexical_cast_st(value.asString()))); else if (value.isInt()) - data.push_back(new STUInt32(field, static_cast(value.asInt()))); + data.push_back(new STUInt32(field, range_check_cast(value.asInt(), 0, 4294967295))); else if (value.isUInt()) - data.push_back(new STUInt32(field, static_cast(value.asUInt()))); + data.push_back(new STUInt32(field, static_cast(value.asUInt(), 0, 4294967295))); else throw std::runtime_error("Incorrect type"); break; case STI_UINT64: if (value.isString()) - data.push_back(new STUInt64(field, lexical_cast_s(value.asString()))); + data.push_back(new STUInt64(field, lexical_cast_st(value.asString()))); else if (value.isInt()) - data.push_back(new STUInt64(field, static_cast(value.asInt()))); + data.push_back(new STUInt64(field, + range_check_cast(value.asInt(), 0, 18446744073709551615ull))); else if (value.isUInt()) data.push_back(new STUInt64(field, static_cast(value.asUInt()))); else @@ -936,9 +937,9 @@ std::auto_ptr STObject::parseJson(const Json::Value& object, SField::r break; case STI_VL: - { - // WRITEME - } + if (!value.isString()) + throw std::runtime_error("Incorrect type"); + data.push_back(new STVariableLength(field, strUnHex(value.asString()))); break; case STI_AMOUNT: @@ -950,8 +951,10 @@ std::auto_ptr STObject::parseJson(const Json::Value& object, SField::r case STI_PATHSET: // WRITEME - case STI_OBJECT: case STI_ACCOUNT: + // WRITEME + + case STI_OBJECT: case STI_TRANSACTION: case STI_LEDGERENTRY: case STI_VALIDATION: