Merge branch 'feature/getline' into develop
This commit is contained in:
		
						commit
						100bf3ef2c
					
				
					 3 changed files with 264 additions and 0 deletions
				
			
		
							
								
								
									
										115
									
								
								src/json.hpp
									
										
									
									
									
								
							
							
						
						
									
										115
									
								
								src/json.hpp
									
										
									
									
									
								
							|  | @ -8815,6 +8815,55 @@ class basic_json | |||
|     serialization format. MessagePack is a binary serialization format which | ||||
|     aims to be more compact than JSON itself, yet more efficient to parse. | ||||
| 
 | ||||
|     The library uses the following mapping from JSON values types to | ||||
|     MessagePack types according to the MessagePack specification: | ||||
| 
 | ||||
|     JSON value type | value/range                       | MessagePack type | first byte | ||||
|     --------------- | --------------------------------- | ---------------- | ---------- | ||||
|     null            | `null`                            | nil              | 0xc0 | ||||
|     boolean         | `true`                            | true             | 0xc3 | ||||
|     boolean         | `false`                           | false            | 0xc2 | ||||
|     number_integer  | -9223372036854775808..-2147483649 | int64            | 0xd3 | ||||
|     number_integer  | -2147483648..-32769               | int32            | 0xd2 | ||||
|     number_integer  | -32768..-129                      | int16            | 0xd1 | ||||
|     number_integer  | -128..-33                         | int8             | 0xd0 | ||||
|     number_integer  | -32..-1                           | negative fixint  | 0xe0..0xff | ||||
|     number_integer  | 0..127                            | positive fixint  | 0x00..0x7f | ||||
|     number_integer  | 128..255                          | uint 8           | 0xcc | ||||
|     number_integer  | 256..65535                        | uint 16          | 0xcd | ||||
|     number_integer  | 65536..4294967295                 | uint 32          | 0xce | ||||
|     number_integer  | 4294967296..18446744073709551615  | uint 64          | 0xcf | ||||
|     number_unsigned | 0..127                            | positive fixint  | 0x00..0x7f | ||||
|     number_unsigned | 128..255                          | uint 8           | 0xcc | ||||
|     number_unsigned | 256..65535                        | uint 16          | 0xcd | ||||
|     number_unsigned | 65536..4294967295                 | uint 32          | 0xce | ||||
|     number_unsigned | 4294967296..18446744073709551615  | uint 64          | 0xcf | ||||
|     number_float    | *any value*                       | float 64         | 0xcb | ||||
|     string          | *length*: 0..31                   | fixstr           | 0xa0..0xbf | ||||
|     string          | *length*: 32..255                 | str 8            | 0xd9 | ||||
|     string          | *length*: 256..65535              | str 16           | 0xda | ||||
|     string          | *length*: 65536..4294967295       | str 32           | 0xdb | ||||
|     array           | *size*: 0..15                     | fixarray         | 0x90..0x9f | ||||
|     array           | *size*: 16..65535                 | array 16         | 0xdc | ||||
|     array           | *size*: 65536..4294967295         | array 32         | 0xdd | ||||
|     object          | *size*: 0..15                     | fix map          | 0x80..0x8f | ||||
|     object          | *size*: 16..65535                 | map 16           | 0xde | ||||
|     object          | *size*: 65536..4294967295         | map 32           | 0xdf | ||||
| 
 | ||||
|     @note The mapping is **complete** in the sense that any JSON value type | ||||
|           can be converted to a MessagePack value. | ||||
| 
 | ||||
|     @note The following values can **not** be converted to a MessagePack value: | ||||
|           - strings with more than 4294967295 bytes | ||||
|           - arrays with more than 4294967295 elements | ||||
|           - objects with more than 4294967295 elements | ||||
| 
 | ||||
|     @note The following MessagePack types are not used in the conversion: | ||||
|           - bin 8 - bin 32 (0xc4..0xc6) | ||||
|           - ext 8 - ext 32 (0xc7..0xc9) | ||||
|           - float 32 (0xca) | ||||
|           - fixext 1 - fixext 16 (0xd4..0xd8) | ||||
| 
 | ||||
|     @param[in] j  JSON value to serialize | ||||
|     @return MessagePack serialization as byte vector | ||||
| 
 | ||||
|  | @ -8878,6 +8927,65 @@ class basic_json | |||
|     serialization format which aims to be more compact than JSON itself, yet | ||||
|     more efficient to parse. | ||||
| 
 | ||||
|     The library uses the following mapping from JSON values types to | ||||
|     CBOR types according to the CBOR specification (RFC 7049): | ||||
| 
 | ||||
|     JSON value type | value/range                                | CBOR type                          | first byte | ||||
|     --------------- | ------------------------------------------ | ---------------------------------- | --------------- | ||||
|     null            | `null`                                     | Null                               | 0xf6 | ||||
|     boolean         | `true`                                     | True                               | 0xf5 | ||||
|     boolean         | `false`                                    | False                              | 0xf4 | ||||
|     number_integer  | -9223372036854775808..-2147483649          | Negative integer (8 bytes follow)  | 0x3b | ||||
|     number_integer  | -2147483648..-32769                        | Negative integer (4 bytes follow)  | 0x3a | ||||
|     number_integer  | -32768..-129                               | Negative integer (2 bytes follow)  | 0x39 | ||||
|     number_integer  | -128..-25                                  | Negative integer (1 byte follow)   | 0x38 | ||||
|     number_integer  | -24..-1                                    | Negative integer                   | 0x20..0x37 | ||||
|     number_integer  | 0..23                                      | Integer                            | 0x00..0x17 | ||||
|     number_integer  | 24..255                                    | Unsigned integer (1 byte follow)   | 0x18 | ||||
|     number_integer  | 256..65535                                 | Unsigned integer (2 bytes follow)  | 0x19 | ||||
|     number_integer  | 65536..4294967295                          | Unsigned integer (4 bytes follow)  | 0x1a | ||||
|     number_integer  | 4294967296..18446744073709551615           | Unsigned integer (8 bytes follow)  | 0x1b | ||||
|     number_unsigned | 0..23                                      | Integer                            | 0x00..0x17 | ||||
|     number_unsigned | 24..255                                    | Unsigned integer (1 byte follow)   | 0x18 | ||||
|     number_unsigned | 256..65535                                 | Unsigned integer (2 bytes follow)  | 0x19 | ||||
|     number_unsigned | 65536..4294967295                          | Unsigned integer (4 bytes follow)  | 0x1a | ||||
|     number_unsigned | 4294967296..18446744073709551615           | Unsigned integer (8 bytes follow)  | 0x1b | ||||
|     number_float    | *any value*                                | Double-Precision Float             | 0xfb | ||||
|     string          | *length*: 0..23                            | UTF-8 string                       | 0x60..0x77 | ||||
|     string          | *length*: 23..255                          | UTF-8 string (1 byte follow)       | 0x78 | ||||
|     string          | *length*: 256..65535                       | UTF-8 string (2 bytes follow)      | 0x79 | ||||
|     string          | *length*: 65536..4294967295                | UTF-8 string (4 bytes follow)      | 0x7a | ||||
|     string          | *length*: 4294967296..18446744073709551615 | UTF-8 string (8 bytes follow)      | 0x7b | ||||
|     array           | *size*: 0..23                              | array                              | 0x80..0x97 | ||||
|     array           | *size*: 23..255                            | array (1 byte follow)              | 0x98 | ||||
|     array           | *size*: 256..65535                         | array (2 bytes follow)             | 0x99 | ||||
|     array           | *size*: 65536..4294967295                  | array (4 bytes follow)             | 0x9a | ||||
|     array           | *size*: 4294967296..18446744073709551615   | array (8 bytes follow)             | 0x9b | ||||
|     object          | *size*: 0..23                              | map                                | 0xa0..0xb7 | ||||
|     object          | *size*: 23..255                            | map (1 byte follow)                | 0xb8 | ||||
|     object          | *size*: 256..65535                         | map (2 bytes follow)               | 0xb9 | ||||
|     object          | *size*: 65536..4294967295                  | map (4 bytes follow)               | 0xba | ||||
|     object          | *size*: 4294967296..18446744073709551615   | map (8 bytes follow)               | 0xbb | ||||
| 
 | ||||
|     @note The mapping is **complete** in the sense that any JSON value type | ||||
|           can be converted to a CBOR value. | ||||
| 
 | ||||
|     @note The following CBOR types are not used in the conversion: | ||||
|           - byte strings (0x40..0x5f) | ||||
|           - UTF-8 strings terminated by "break" (0x7f) | ||||
|           - arrays terminated by "break" (0x9f) | ||||
|           - maps terminated by "break" (0xbf) | ||||
|           - date/time (0xc0..0xc1) | ||||
|           - bignum (0xc2..0xc3) | ||||
|           - decimal fraction (0xc4) | ||||
|           - bigfloat (0xc5) | ||||
|           - tagged items (0xc6..0xd4, 0xd8..0xdb) | ||||
|           - expected conversions (0xd5..0xd7) | ||||
|           - simple values (0xe0..0xf3, 0xf8) | ||||
|           - undefined (0xf7) | ||||
|           - half and single-precision floats (0xf9-0xfa) | ||||
|           - break (0xff) | ||||
| 
 | ||||
|     @param[in] j  JSON value to serialize | ||||
|     @return MessagePack serialization as byte vector | ||||
| 
 | ||||
|  | @ -11330,6 +11438,13 @@ basic_json_parser_74: | |||
|                 m_line_buffer.erase(0, num_processed_chars); | ||||
|                 // read next line from input stream
 | ||||
|                 m_line_buffer_tmp.clear(); | ||||
| 
 | ||||
|                 // check if stream is still good
 | ||||
|                 if (m_stream->fail()) | ||||
|                 { | ||||
|                     JSON_THROW(parse_error(111, 0, "bad input stream")); | ||||
|                 } | ||||
| 
 | ||||
|                 std::getline(*m_stream, m_line_buffer_tmp, '\n'); | ||||
| 
 | ||||
|                 // add line with newline symbol to the line buffer
 | ||||
|  |  | |||
|  | @ -8815,6 +8815,55 @@ class basic_json | |||
|     serialization format. MessagePack is a binary serialization format which | ||||
|     aims to be more compact than JSON itself, yet more efficient to parse. | ||||
| 
 | ||||
|     The library uses the following mapping from JSON values types to | ||||
|     MessagePack types according to the MessagePack specification: | ||||
| 
 | ||||
|     JSON value type | value/range                       | MessagePack type | first byte | ||||
|     --------------- | --------------------------------- | ---------------- | ---------- | ||||
|     null            | `null`                            | nil              | 0xc0 | ||||
|     boolean         | `true`                            | true             | 0xc3 | ||||
|     boolean         | `false`                           | false            | 0xc2 | ||||
|     number_integer  | -9223372036854775808..-2147483649 | int64            | 0xd3 | ||||
|     number_integer  | -2147483648..-32769               | int32            | 0xd2 | ||||
|     number_integer  | -32768..-129                      | int16            | 0xd1 | ||||
|     number_integer  | -128..-33                         | int8             | 0xd0 | ||||
|     number_integer  | -32..-1                           | negative fixint  | 0xe0..0xff | ||||
|     number_integer  | 0..127                            | positive fixint  | 0x00..0x7f | ||||
|     number_integer  | 128..255                          | uint 8           | 0xcc | ||||
|     number_integer  | 256..65535                        | uint 16          | 0xcd | ||||
|     number_integer  | 65536..4294967295                 | uint 32          | 0xce | ||||
|     number_integer  | 4294967296..18446744073709551615  | uint 64          | 0xcf | ||||
|     number_unsigned | 0..127                            | positive fixint  | 0x00..0x7f | ||||
|     number_unsigned | 128..255                          | uint 8           | 0xcc | ||||
|     number_unsigned | 256..65535                        | uint 16          | 0xcd | ||||
|     number_unsigned | 65536..4294967295                 | uint 32          | 0xce | ||||
|     number_unsigned | 4294967296..18446744073709551615  | uint 64          | 0xcf | ||||
|     number_float    | *any value*                       | float 64         | 0xcb | ||||
|     string          | *length*: 0..31                   | fixstr           | 0xa0..0xbf | ||||
|     string          | *length*: 32..255                 | str 8            | 0xd9 | ||||
|     string          | *length*: 256..65535              | str 16           | 0xda | ||||
|     string          | *length*: 65536..4294967295       | str 32           | 0xdb | ||||
|     array           | *size*: 0..15                     | fixarray         | 0x90..0x9f | ||||
|     array           | *size*: 16..65535                 | array 16         | 0xdc | ||||
|     array           | *size*: 65536..4294967295         | array 32         | 0xdd | ||||
|     object          | *size*: 0..15                     | fix map          | 0x80..0x8f | ||||
|     object          | *size*: 16..65535                 | map 16           | 0xde | ||||
|     object          | *size*: 65536..4294967295         | map 32           | 0xdf | ||||
| 
 | ||||
|     @note The mapping is **complete** in the sense that any JSON value type | ||||
|           can be converted to a MessagePack value. | ||||
| 
 | ||||
|     @note The following values can **not** be converted to a MessagePack value: | ||||
|           - strings with more than 4294967295 bytes | ||||
|           - arrays with more than 4294967295 elements | ||||
|           - objects with more than 4294967295 elements | ||||
| 
 | ||||
|     @note The following MessagePack types are not used in the conversion: | ||||
|           - bin 8 - bin 32 (0xc4..0xc6) | ||||
|           - ext 8 - ext 32 (0xc7..0xc9) | ||||
|           - float 32 (0xca) | ||||
|           - fixext 1 - fixext 16 (0xd4..0xd8) | ||||
| 
 | ||||
|     @param[in] j  JSON value to serialize | ||||
|     @return MessagePack serialization as byte vector | ||||
| 
 | ||||
|  | @ -8878,6 +8927,65 @@ class basic_json | |||
|     serialization format which aims to be more compact than JSON itself, yet | ||||
|     more efficient to parse. | ||||
| 
 | ||||
|     The library uses the following mapping from JSON values types to | ||||
|     CBOR types according to the CBOR specification (RFC 7049): | ||||
| 
 | ||||
|     JSON value type | value/range                                | CBOR type                          | first byte | ||||
|     --------------- | ------------------------------------------ | ---------------------------------- | --------------- | ||||
|     null            | `null`                                     | Null                               | 0xf6 | ||||
|     boolean         | `true`                                     | True                               | 0xf5 | ||||
|     boolean         | `false`                                    | False                              | 0xf4 | ||||
|     number_integer  | -9223372036854775808..-2147483649          | Negative integer (8 bytes follow)  | 0x3b | ||||
|     number_integer  | -2147483648..-32769                        | Negative integer (4 bytes follow)  | 0x3a | ||||
|     number_integer  | -32768..-129                               | Negative integer (2 bytes follow)  | 0x39 | ||||
|     number_integer  | -128..-25                                  | Negative integer (1 byte follow)   | 0x38 | ||||
|     number_integer  | -24..-1                                    | Negative integer                   | 0x20..0x37 | ||||
|     number_integer  | 0..23                                      | Integer                            | 0x00..0x17 | ||||
|     number_integer  | 24..255                                    | Unsigned integer (1 byte follow)   | 0x18 | ||||
|     number_integer  | 256..65535                                 | Unsigned integer (2 bytes follow)  | 0x19 | ||||
|     number_integer  | 65536..4294967295                          | Unsigned integer (4 bytes follow)  | 0x1a | ||||
|     number_integer  | 4294967296..18446744073709551615           | Unsigned integer (8 bytes follow)  | 0x1b | ||||
|     number_unsigned | 0..23                                      | Integer                            | 0x00..0x17 | ||||
|     number_unsigned | 24..255                                    | Unsigned integer (1 byte follow)   | 0x18 | ||||
|     number_unsigned | 256..65535                                 | Unsigned integer (2 bytes follow)  | 0x19 | ||||
|     number_unsigned | 65536..4294967295                          | Unsigned integer (4 bytes follow)  | 0x1a | ||||
|     number_unsigned | 4294967296..18446744073709551615           | Unsigned integer (8 bytes follow)  | 0x1b | ||||
|     number_float    | *any value*                                | Double-Precision Float             | 0xfb | ||||
|     string          | *length*: 0..23                            | UTF-8 string                       | 0x60..0x77 | ||||
|     string          | *length*: 23..255                          | UTF-8 string (1 byte follow)       | 0x78 | ||||
|     string          | *length*: 256..65535                       | UTF-8 string (2 bytes follow)      | 0x79 | ||||
|     string          | *length*: 65536..4294967295                | UTF-8 string (4 bytes follow)      | 0x7a | ||||
|     string          | *length*: 4294967296..18446744073709551615 | UTF-8 string (8 bytes follow)      | 0x7b | ||||
|     array           | *size*: 0..23                              | array                              | 0x80..0x97 | ||||
|     array           | *size*: 23..255                            | array (1 byte follow)              | 0x98 | ||||
|     array           | *size*: 256..65535                         | array (2 bytes follow)             | 0x99 | ||||
|     array           | *size*: 65536..4294967295                  | array (4 bytes follow)             | 0x9a | ||||
|     array           | *size*: 4294967296..18446744073709551615   | array (8 bytes follow)             | 0x9b | ||||
|     object          | *size*: 0..23                              | map                                | 0xa0..0xb7 | ||||
|     object          | *size*: 23..255                            | map (1 byte follow)                | 0xb8 | ||||
|     object          | *size*: 256..65535                         | map (2 bytes follow)               | 0xb9 | ||||
|     object          | *size*: 65536..4294967295                  | map (4 bytes follow)               | 0xba | ||||
|     object          | *size*: 4294967296..18446744073709551615   | map (8 bytes follow)               | 0xbb | ||||
| 
 | ||||
|     @note The mapping is **complete** in the sense that any JSON value type | ||||
|           can be converted to a CBOR value. | ||||
| 
 | ||||
|     @note The following CBOR types are not used in the conversion: | ||||
|           - byte strings (0x40..0x5f) | ||||
|           - UTF-8 strings terminated by "break" (0x7f) | ||||
|           - arrays terminated by "break" (0x9f) | ||||
|           - maps terminated by "break" (0xbf) | ||||
|           - date/time (0xc0..0xc1) | ||||
|           - bignum (0xc2..0xc3) | ||||
|           - decimal fraction (0xc4) | ||||
|           - bigfloat (0xc5) | ||||
|           - tagged items (0xc6..0xd4, 0xd8..0xdb) | ||||
|           - expected conversions (0xd5..0xd7) | ||||
|           - simple values (0xe0..0xf3, 0xf8) | ||||
|           - undefined (0xf7) | ||||
|           - half and single-precision floats (0xf9-0xfa) | ||||
|           - break (0xff) | ||||
| 
 | ||||
|     @param[in] j  JSON value to serialize | ||||
|     @return MessagePack serialization as byte vector | ||||
| 
 | ||||
|  | @ -10363,6 +10471,13 @@ class basic_json | |||
|                 m_line_buffer.erase(0, num_processed_chars); | ||||
|                 // read next line from input stream | ||||
|                 m_line_buffer_tmp.clear(); | ||||
| 
 | ||||
|                 // check if stream is still good | ||||
|                 if (m_stream->fail()) | ||||
|                 { | ||||
|                     JSON_THROW(parse_error(111, 0, "bad input stream")); | ||||
|                 } | ||||
| 
 | ||||
|                 std::getline(*m_stream, m_line_buffer_tmp, '\n'); | ||||
| 
 | ||||
|                 // add line with newline symbol to the line buffer | ||||
|  |  | |||
|  | @ -28,6 +28,7 @@ SOFTWARE. | |||
| 
 | ||||
| #include "catch.hpp" | ||||
| 
 | ||||
| #define private public | ||||
| #include "json.hpp" | ||||
| using nlohmann::json; | ||||
| 
 | ||||
|  | @ -910,6 +911,39 @@ TEST_CASE("regression tests") | |||
|         CHECK(j["bool_vector"].dump() == "[false,true,false,false]"); | ||||
|     } | ||||
| 
 | ||||
|     SECTION("issue #495 - fill_line_buffer incorrectly tests m_stream for eof but not fail or bad bits") | ||||
|     { | ||||
|         SECTION("setting failbit") | ||||
|         { | ||||
|             std::stringstream ss; | ||||
|             ss << "[1,2,3\n,4,5]"; | ||||
| 
 | ||||
|             json::lexer l(ss); | ||||
| 
 | ||||
|             CHECK(l.m_line_buffer == "[1,2,3\n"); | ||||
| 
 | ||||
|             l.m_stream->setstate(std::ios_base::failbit); | ||||
| 
 | ||||
|             CHECK_THROWS_AS(l.fill_line_buffer(), json::parse_error); | ||||
|             CHECK_THROWS_WITH(l.fill_line_buffer(), "[json.exception.parse_error.111] parse error: bad input stream"); | ||||
|         } | ||||
| 
 | ||||
|         SECTION("setting badbit") | ||||
|         { | ||||
|             std::stringstream ss; | ||||
|             ss << "[1,2,3\n,4,5]"; | ||||
| 
 | ||||
|             json::lexer l(ss); | ||||
| 
 | ||||
|             CHECK(l.m_line_buffer == "[1,2,3\n"); | ||||
| 
 | ||||
|             l.m_stream->setstate(std::ios_base::badbit); | ||||
| 
 | ||||
|             CHECK_THROWS_AS(l.fill_line_buffer(), json::parse_error); | ||||
|             CHECK_THROWS_WITH(l.fill_line_buffer(), "[json.exception.parse_error.111] parse error: bad input stream"); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     SECTION("issue #504 - assertion error (OSS-Fuzz 856)") | ||||
|     { | ||||
|         std::vector<uint8_t> vec1 = {0xf9, 0xff, 0xff, 0x4a, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x37, 0x02, 0x38}; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue