diff --git a/include/weaseljson.h b/include/weaseljson.h index 4a42681..aa0ec52 100644 --- a/include/weaseljson.h +++ b/include/weaseljson.h @@ -38,6 +38,8 @@ enum WeaselJsonStatus { WeaselJson_REJECT, /** json is too deeply nested */ WeaselJson_OVERFLOW, + /** Tried to call parse on a null parser */ + WeaselJson_NULL, }; typedef struct WeaselJsonParser WeaselJsonParser; @@ -65,7 +67,7 @@ void WeaselJsonParser_destroy(WeaselJsonParser *parser); /** Incrementally parse `len` more bytes starting at `buf`. `buf` may be * modified. Call with `len` 0 to indicate end of data. `buf` may be null if * `len` is 0. `len` must not be negative; a negative length is treated as a - * rejected input. */ + * rejected input. Returns WeaselJson_NULL if parser is null */ WeaselJsonStatus WeaselJsonParser_parse(WeaselJsonParser *parser, char *buf, int len); diff --git a/src/lib.cpp b/src/lib.cpp index 715f2c6..b805e01 100644 --- a/src/lib.cpp +++ b/src/lib.cpp @@ -46,6 +46,9 @@ WeaselJsonParser_destroy(WeaselJsonParser *parser) { __attribute__((visibility("default"))) WeaselJsonStatus WeaselJsonParser_parse(WeaselJsonParser *parser, char *buf, int len) { + if (parser == nullptr) [[unlikely]] { + return WeaselJson_NULL; + } return ((Parser3 *)parser)->parse(buf, len); } } diff --git a/src/test.cpp b/src/test.cpp index 6fef3a7..10cb1fb 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -330,6 +330,10 @@ TEST_CASE("parse rejects negative length") { WeaselJsonParser_destroy(parser); } +TEST_CASE("Calling parse with nullptr doesn't crash") { + REQUIRE(WeaselJsonParser_parse(nullptr, nullptr, 0) == WeaselJson_NULL); +} + TEST_CASE("streaming") { testStreaming(json); } TEST_CASE("reset clears inKey and transient state") { diff --git a/src/validate.cpp b/src/validate.cpp index abbd2fa..9566056 100644 --- a/src/validate.cpp +++ b/src/validate.cpp @@ -33,6 +33,9 @@ int main(int argc, char **argv) { case WeaselJson_REJECT: case WeaselJson_OVERFLOW: return 1; + case WeaselJson_NULL: + fprintf(stderr, "parse called with a null parser\n"); + return 1; } if (l == 0) { return 1; diff --git a/weaseljson.py b/weaseljson.py index 7063c98..777d8fe 100644 --- a/weaseljson.py +++ b/weaseljson.py @@ -30,6 +30,7 @@ class WeaselJsonStatus(enum.Enum): AGAIN = 1 REJECT = 2 OVERFLOW = 3 + NULL = 4 class WeaselJsonCallbacksBase: