Browse Source

[1626] check string termination and whitespace fix

whitespace 'outside' of elements is skipped, now including \r and \b
Jelte Jansen 13 years ago
parent
commit
318ecd4e65
2 changed files with 11 additions and 4 deletions
  1. 6 3
      src/lib/cc/data.cc
  2. 5 1
      src/lib/cc/tests/data_unittests.cc

+ 6 - 3
src/lib/cc/data.cc

@@ -354,6 +354,9 @@ str_from_stringstream(std::istream &in, const std::string& file, const int line,
         c = in.get();
         ++pos;
     }
+    if (c == EOF) {
+        throwJSONError("Unterminated string", file, line, pos);
+    }
     return (ss.str());
 }
 
@@ -458,7 +461,7 @@ from_stringstream_list(std::istream &in, const std::string& file, int& line,
     ElementPtr list = Element::createList();
     ConstElementPtr cur_list_element;
 
-    skip_chars(in, " \t\n", line, pos);
+    skip_chars(in, " \t\n\r\b", line, pos);
     while (c != EOF && c != ']') {
         if (in.peek() != ']') {
             cur_list_element = Element::fromJSON(in, file, line, pos);
@@ -476,7 +479,7 @@ from_stringstream_map(std::istream &in, const std::string& file, int& line,
                       int& pos)
 {
     ElementPtr map = Element::createMap();
-    skip_chars(in, " \t\n", line, pos);
+    skip_chars(in, " \t\n\r\b", line, pos);
     char c = in.peek();
     if (c == EOF) {
         throwJSONError(std::string("Unterminated map, <string> or } expected"), file, line, pos);
@@ -574,7 +577,7 @@ Element::fromJSON(std::istream &in, const std::string& file, int& line,
     char c = 0;
     ElementPtr element;
     bool el_read = false;
-    skip_chars(in, " \n\t", line, pos);
+    skip_chars(in, " \n\t\r\b", line, pos);
     while (c != EOF && !el_read) {
         c = in.get();
         pos++;

+ 5 - 1
src/lib/cc/tests/data_unittests.cc

@@ -338,7 +338,11 @@ TEST(Element, escape) {
     // Bad string
     EXPECT_THROW(Element::fromJSON("hello\"foobar\""), JSONError);
     // A whitespace test
-    EXPECT_NO_THROW(Element::fromJSON("  \n  \r \t  \n \n    \t"));
+    EXPECT_NO_THROW(Element::fromJSON("\"  \n  \r \t  \n \n    \t\""));
+    // Whitespace outside of json element
+    EXPECT_NO_THROW(Element::fromJSON("  \n \t \r \b \"\" \n \t \r \b"));
+    EXPECT_NO_THROW(Element::fromJSON("{  \n  \r \t  \b  }"));
+    EXPECT_NO_THROW(Element::fromJSON("[  \n  \r \t  \b  ]"));
 }
 
 TEST(Element, ListElement) {