Skip to content

Commit fa84cd1

Browse files
StilesCrisisStilesCrisis
authored andcommitted
Add matching fix for PrettyWriter
PrettyWriter EndObject will now also assert if called when a key is missing its matching value.
1 parent 2e9b7b1 commit fa84cd1

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

include/rapidjson/prettywriter.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,10 @@ class PrettyWriter : public Writer<OutputStream, SourceEncoding, TargetEncoding,
136136

137137
bool EndObject(SizeType memberCount = 0) {
138138
(void)memberCount;
139-
RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level));
140-
RAPIDJSON_ASSERT(!Base::level_stack_.template Top<typename Base::Level>()->inArray);
139+
RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); // not inside an Object
140+
RAPIDJSON_ASSERT(!Base::level_stack_.template Top<typename Base::Level>()->inArray); // currently inside an Array, not Object
141+
RAPIDJSON_ASSERT(0 == Base::level_stack_.template Top<typename Base::Level>()->valueCount % 2); // Object has a Key without a Value
142+
141143
bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
142144

143145
if (!empty) {

test/unittest/prettywritertest.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,57 @@ TEST(PrettyWriter, RawValue) {
207207
buffer.GetString());
208208
}
209209

210+
TEST(PrettyWriter, InvalidEventSequence) {
211+
// {]
212+
{
213+
StringBuffer buffer;
214+
PrettyWriter<StringBuffer> writer(buffer);
215+
writer.StartObject();
216+
EXPECT_THROW(writer.EndArray(), AssertException);
217+
EXPECT_FALSE(writer.IsComplete());
218+
}
219+
220+
// [}
221+
{
222+
StringBuffer buffer;
223+
PrettyWriter<StringBuffer> writer(buffer);
224+
writer.StartArray();
225+
EXPECT_THROW(writer.EndObject(), AssertException);
226+
EXPECT_FALSE(writer.IsComplete());
227+
}
228+
229+
// { 1:
230+
{
231+
StringBuffer buffer;
232+
PrettyWriter<StringBuffer> writer(buffer);
233+
writer.StartObject();
234+
EXPECT_THROW(writer.Int(1), AssertException);
235+
EXPECT_FALSE(writer.IsComplete());
236+
}
237+
238+
// { 'a' }
239+
{
240+
StringBuffer buffer;
241+
PrettyWriter<StringBuffer> writer(buffer);
242+
writer.StartObject();
243+
writer.Key("a");
244+
EXPECT_THROW(writer.EndObject(), AssertException);
245+
EXPECT_FALSE(writer.IsComplete());
246+
}
247+
248+
// { 'a':'b','c' }
249+
{
250+
StringBuffer buffer;
251+
PrettyWriter<StringBuffer> writer(buffer);
252+
writer.StartObject();
253+
writer.Key("a");
254+
writer.String("b");
255+
writer.Key("c");
256+
EXPECT_THROW(writer.EndObject(), AssertException);
257+
EXPECT_FALSE(writer.IsComplete());
258+
}
259+
}
260+
210261
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
211262

212263
static PrettyWriter<StringBuffer> WriterGen(StringBuffer &target) {

0 commit comments

Comments
 (0)