Skip to content

Commit a1909a9

Browse files
authored
Merge pull request Tencent#1179 from Tencent/issue1153_rawvalueencoding
Add transcoding/validation to Writer::RawValue()
2 parents e2d0437 + 9669876 commit a1909a9

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

include/rapidjson/writer.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -460,9 +460,14 @@ class Writer {
460460

461461
bool WriteRawValue(const Ch* json, size_t length) {
462462
PutReserve(*os_, length);
463-
for (size_t i = 0; i < length; i++) {
464-
RAPIDJSON_ASSERT(json[i] != '\0');
465-
PutUnsafe(*os_, json[i]);
463+
GenericStringStream<SourceEncoding> is(json);
464+
while (RAPIDJSON_LIKELY(is.Tell() < length)) {
465+
const Ch c = is.Peek();
466+
RAPIDJSON_ASSERT(c != '\0');
467+
if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ?
468+
Transcoder<SourceEncoding, TargetEncoding>::Validate(is, *os_) :
469+
Transcoder<SourceEncoding, TargetEncoding>::TranscodeUnsafe(is, *os_))))
470+
return false;
466471
}
467472
return true;
468473
}

test/unittest/writertest.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,43 @@ TEST(Writer, RawValue) {
538538
EXPECT_STREQ("{\"a\":1,\"raw\":[\"Hello\\nWorld\", 123.456]}", buffer.GetString());
539539
}
540540

541+
TEST(Write, RawValue_Issue1152) {
542+
{
543+
GenericStringBuffer<UTF32<> > sb;
544+
Writer<GenericStringBuffer<UTF32<> >, UTF8<>, UTF32<> > writer(sb);
545+
writer.RawValue("null", 4, kNullType);
546+
EXPECT_TRUE(writer.IsComplete());
547+
const unsigned *out = sb.GetString();
548+
EXPECT_EQ(static_cast<unsigned>('n'), out[0]);
549+
EXPECT_EQ(static_cast<unsigned>('u'), out[1]);
550+
EXPECT_EQ(static_cast<unsigned>('l'), out[2]);
551+
EXPECT_EQ(static_cast<unsigned>('l'), out[3]);
552+
EXPECT_EQ(static_cast<unsigned>(0 ), out[4]);
553+
}
554+
555+
{
556+
GenericStringBuffer<UTF8<> > sb;
557+
Writer<GenericStringBuffer<UTF8<> >, UTF16<>, UTF8<> > writer(sb);
558+
writer.RawValue(L"null", 4, kNullType);
559+
EXPECT_TRUE(writer.IsComplete());
560+
EXPECT_STREQ("null", sb.GetString());
561+
}
562+
563+
{
564+
// Fail in transcoding
565+
GenericStringBuffer<UTF16<> > buffer;
566+
Writer<GenericStringBuffer<UTF16<> >, UTF8<>, UTF16<> > writer(buffer);
567+
EXPECT_FALSE(writer.RawValue("\"\xfe\"", 3, kStringType));
568+
}
569+
570+
{
571+
// Fail in encoding validation
572+
StringBuffer buffer;
573+
Writer<StringBuffer, UTF8<>, UTF8<>, CrtAllocator, kWriteValidateEncodingFlag> writer(buffer);
574+
EXPECT_FALSE(writer.RawValue("\"\xfe\"", 3, kStringType));
575+
}
576+
}
577+
541578
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
542579
static Writer<StringBuffer> WriterGen(StringBuffer &target) {
543580
Writer<StringBuffer> writer(target);

0 commit comments

Comments
 (0)