소스 검색

Fix off by 1 error in JsonParser::parseUpdate() return value

Tatsuhiro Tsujikawa 13 년 전
부모
커밋
9620bb0a6d
2개의 변경된 파일10개의 추가작업 그리고 5개의 파일을 삭제
  1. 1 4
      src/JsonParser.cc
  2. 9 1
      test/ValueBaseJsonParserTest.cc

+ 1 - 4
src/JsonParser.cc

@@ -107,7 +107,7 @@ ssize_t JsonParser::parseUpdate(const char* data, size_t size)
   } else if(currentState_ == JSON_ERROR) {
     return lastError_;
   }
-  for(i = 0; i < size; ++i) {
+  for(i = 0; i < size && currentState_ != JSON_FINISH; ++i) {
     char c = data[i];
     switch(currentState_) {
     case JSON_ARRAY:
@@ -499,9 +499,6 @@ ssize_t JsonParser::parseUpdate(const char* data, size_t size)
       break;
     }
     }
-    if(currentState_ == JSON_FINISH) {
-      break;
-    }
   }
   return i;
 }

+ 9 - 1
test/ValueBaseJsonParserTest.cc

@@ -220,7 +220,15 @@ void ValueBaseJsonParserTest::testParseUpdate()
     const String* s = downcast<String>(list->get(0));
     CPPUNIT_ASSERT_EQUAL(std::string("foo$b¢€baz"), s->s());
   }
-
+  {
+    // ignore garbage at the end of the input.
+    std::string src = "[]trail";
+    SharedHandle<ValueBase> r = parser.parseFinal(src.c_str(), src.size(),
+                                                  error);
+    const List* list = downcast<List>(r);
+    CPPUNIT_ASSERT(list);
+    CPPUNIT_ASSERT_EQUAL((ssize_t)2, error);
+  }
 }
 
 namespace {