diff --git a/CMakeLists.txt b/CMakeLists.txt index cc8930fa..e572564d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,8 +11,8 @@ project(simdjson) set(SIMDJSON_LIB_NAME simdjson) set(PROJECT_VERSION_MAJOR 0) set(PROJECT_VERSION_MINOR 1) -set(PROJECT_VERSION_PATCH 1) -set(SIMDJSON_LIB_VERSION "0.1.1" CACHE STRING "simdjson library version") +set(PROJECT_VERSION_PATCH 2) +set(SIMDJSON_LIB_VERSION "0.1.2" CACHE STRING "simdjson library version") set(SIMDJSON_LIB_SOVERSION "0" CACHE STRING "simdjson library soversion") if(NOT MSVC) diff --git a/include/simdjson/simdjson_version.h b/include/simdjson/simdjson_version.h index effee1ff..0a71b895 100644 --- a/include/simdjson/simdjson_version.h +++ b/include/simdjson/simdjson_version.h @@ -1,10 +1,10 @@ // /include/simdjson/simdjson_version.h automatically generated by release.py, do not change by hand #ifndef SIMDJSON_INCLUDE_SIMDJSON_VERSION #define SIMDJSON_INCLUDE_SIMDJSON_VERSION -#define SIMDJSON_VERSION 0.1.1 +#define SIMDJSON_VERSION 0.1.2 enum { SIMDJSON_VERSION_MAJOR = 0, SIMDJSON_VERSION_MINOR = 1, - SIMDJSON_VERSION_REVISION = 1 + SIMDJSON_VERSION_REVISION = 2 }; #endif // SIMDJSON_INCLUDE_SIMDJSON_VERSION diff --git a/singleheader/amalgamation_demo.cpp b/singleheader/amalgamation_demo.cpp index 75011884..862b2520 100644 --- a/singleheader/amalgamation_demo.cpp +++ b/singleheader/amalgamation_demo.cpp @@ -1,4 +1,4 @@ -/* auto-generated on Thu May 9 17:40:56 EDT 2019. Do not edit! */ +/* auto-generated on Thu May 9 20:55:13 EDT 2019. Do not edit! */ #include #include "simdjson.h" diff --git a/singleheader/simdjson.cpp b/singleheader/simdjson.cpp index 80242d09..cd3ca432 100644 --- a/singleheader/simdjson.cpp +++ b/singleheader/simdjson.cpp @@ -1,4 +1,4 @@ -/* auto-generated on Thu May 9 17:40:56 EDT 2019. Do not edit! */ +/* auto-generated on Thu May 9 20:55:13 EDT 2019. Do not edit! */ #include "simdjson.h" /* used for http://dmalloc.com/ Dmalloc - Debug Malloc Library */ @@ -1102,8 +1102,8 @@ int unified_machine(const uint8_t *buf, size_t len, ParsedJson &pj) { pj.write_tape(0, 'r'); // r for root, 0 is going to get overwritten // the root is used, if nothing else, to capture the size of the tape depth++; // everything starts at depth = 1, depth = 0 is just for the root, the root may contain an object, an array or something else. - if (depth > pj.depthcapacity) { - goto fail; + if (depth >= pj.depthcapacity) { + return simdjson::DEPTH_ERROR; } UPDATE_CHAR(); @@ -1116,8 +1116,8 @@ int unified_machine(const uint8_t *buf, size_t len, ParsedJson &pj) { pj.ret_address[depth] = 's'; #endif depth++; - if (depth > pj.depthcapacity) { - goto fail; + if (depth >= pj.depthcapacity) { + return simdjson::DEPTH_ERROR; } pj.write_tape(0, c); // strangely, moving this to object_begin slows things down goto object_begin; @@ -1129,8 +1129,8 @@ int unified_machine(const uint8_t *buf, size_t len, ParsedJson &pj) { pj.ret_address[depth] = 's'; #endif depth++; - if (depth > pj.depthcapacity) { - goto fail; + if (depth >= pj.depthcapacity) { + return simdjson::DEPTH_ERROR; } pj.write_tape(0, c); goto array_begin; @@ -1331,8 +1331,8 @@ object_key_state: #endif // we found an object inside an object, so we need to increment the depth depth++; - if (depth > pj.depthcapacity) { - goto fail; + if (depth >= pj.depthcapacity) { + return simdjson::DEPTH_ERROR; } goto object_begin; @@ -1348,8 +1348,8 @@ object_key_state: #endif // we found an array inside an object, so we need to increment the depth depth++; - if (depth > pj.depthcapacity) { - goto fail; + if (depth >= pj.depthcapacity) { + return simdjson::DEPTH_ERROR; } goto array_begin; } @@ -1463,8 +1463,8 @@ main_array_switch: #endif // we found an object inside an array, so we need to increment the depth depth++; - if (depth > pj.depthcapacity) { - goto fail; + if (depth >= pj.depthcapacity) { + return simdjson::DEPTH_ERROR; } goto object_begin; @@ -1480,8 +1480,8 @@ main_array_switch: #endif // we found an array inside an array, so we need to increment the depth depth++; - if (depth > pj.depthcapacity) { - goto fail; + if (depth >= pj.depthcapacity) { + return simdjson::DEPTH_ERROR; } goto array_begin; } @@ -1582,10 +1582,11 @@ bool ParsedJson::allocateCapacity(size_t len, size_t maxdepth) { n_structural_indexes = 0; uint32_t max_structures = ROUNDUP_N(len, 64) + 2 + 7; structural_indexes = new (std::nothrow) uint32_t[max_structures]; - size_t localtapecapacity = ROUNDUP_N(len, 64); + // a pathological input like "[[[[..." would generate len tape elements, so need a capacity of len + 1 + size_t localtapecapacity = ROUNDUP_N(len + 1, 64); // a document with only zero-length strings... could have len/3 string // and we would need len/3 * 5 bytes on the string buffer - size_t localstringcapacity = ROUNDUP_N(5 * len / 3 + 32, 64); + size_t localstringcapacity = ROUNDUP_N(5 * len / 3 + 32, 64); string_buf = new (std::nothrow) uint8_t[localstringcapacity]; tape = new (std::nothrow) uint64_t[localtapecapacity]; containing_scope_offset = new (std::nothrow) uint32_t[maxdepth]; diff --git a/singleheader/simdjson.h b/singleheader/simdjson.h index 337295bc..9b385f93 100644 --- a/singleheader/simdjson.h +++ b/singleheader/simdjson.h @@ -1,13 +1,13 @@ -/* auto-generated on Thu May 9 17:40:56 EDT 2019. Do not edit! */ +/* auto-generated on Thu May 9 20:55:13 EDT 2019. Do not edit! */ /* begin file include/simdjson/simdjson_version.h */ // /include/simdjson/simdjson_version.h automatically generated by release.py, do not change by hand #ifndef SIMDJSON_INCLUDE_SIMDJSON_VERSION #define SIMDJSON_INCLUDE_SIMDJSON_VERSION -#define SIMDJSON_VERSION 0.1.1 +#define SIMDJSON_VERSION 0.1.2 enum { SIMDJSON_VERSION_MAJOR = 0, SIMDJSON_VERSION_MINOR = 1, - SIMDJSON_VERSION_REVISION = 1 + SIMDJSON_VERSION_REVISION = 2 }; #endif // SIMDJSON_INCLUDE_SIMDJSON_VERSION /* end file include/simdjson/simdjson_version.h */ @@ -23,11 +23,13 @@ struct simdjson { CAPACITY, // This ParsedJson can't support a document that big MEMALLOC, // Error allocating memory, most likely out of memory TAPE_ERROR, // Something went wrong while writing to the tape + DEPTH_ERROR, // Your document exceeds the user-specified depth limitation }; static const std::string& errorMsg(const int); }; -#endif/* end file include/simdjson/simdjson.h */ +#endif +/* end file include/simdjson/simdjson.h */ /* begin file include/simdjson/portability.h */ #ifndef SIMDJSON_PORTABILITY_H #define SIMDJSON_PORTABILITY_H @@ -199,8 +201,6 @@ static inline void aligned_free_char(char *memblock) { #endif - - // Align to N-byte boundary #define ROUNDUP_N(a, n) (((a) + ((n)-1)) & ~((n)-1)) #define ROUNDDOWN_N(a, n) ((a) & ~((n)-1))