schemagen: handle WeaselJsonParser_create failure in RootBuilder
CI / build (-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++, clang-arm64, ubuntu-latest-arm64, true) (pull_request) Successful in 51s
CI / pre-commit (pull_request) Successful in 53s
CI / build (-DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++, gcc-arm64, ubuntu-latest-arm64, false) (pull_request) Successful in 51s
CI / build (-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++, clang-amd64, ubuntu-latest-amd64, true) (pull_request) Successful in 1m34s
CI / build (-DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++, gcc-amd64, ubuntu-latest-amd64, false) (pull_request) Successful in 1m27s
CI / build (-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++, clang-arm64, ubuntu-latest-arm64, true) (pull_request) Successful in 51s
CI / pre-commit (pull_request) Successful in 53s
CI / build (-DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++, gcc-arm64, ubuntu-latest-arm64, false) (pull_request) Successful in 51s
CI / build (-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++, clang-amd64, ubuntu-latest-amd64, true) (pull_request) Successful in 1m34s
CI / build (-DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++, gcc-amd64, ubuntu-latest-amd64, false) (pull_request) Successful in 1m27s
If WeaselJsonParser_create returns nullptr (e.g. negative stack size or allocation failure), set the existing error_ flag so that subsequent feed()/finish() calls return WeaselJson_REJECT instead of dereferencing the null parser_. Also add a regression test in test_gen.cpp that constructs a RootBuilder with an invalid stack size and verifies it rejects without crashing. Closes #36
This commit is contained in:
@@ -68,6 +68,15 @@ int main() {
|
|||||||
expectReject(json, "unknown key in strict root");
|
expectReject(json, "unknown key in strict root");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---- invalid stack size is rejected without crashing ----
|
||||||
|
{
|
||||||
|
RootBuilder b(-1);
|
||||||
|
char buf[] = "null";
|
||||||
|
WeaselJsonStatus s = b.feed(buf, sizeof(buf) - 1);
|
||||||
|
CHECK(s == WeaselJson_REJECT);
|
||||||
|
printf("ok invalid stack size rejected, not crashed\n");
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
std::string json = R"({
|
std::string json = R"({
|
||||||
"name": "Ada É",
|
"name": "Ada É",
|
||||||
|
|||||||
@@ -892,6 +892,10 @@ public:
|
|||||||
explicit RootBuilder(int stackSize = 1024) {{
|
explicit RootBuilder(int stackSize = 1024) {{
|
||||||
cb_ = makeCallbacks();
|
cb_ = makeCallbacks();
|
||||||
parser_ = WeaselJsonParser_create(stackSize, &cb_, this, 0);
|
parser_ = WeaselJsonParser_create(stackSize, &cb_, this, 0);
|
||||||
|
if (!parser_) {{
|
||||||
|
error_ = true;
|
||||||
|
return;
|
||||||
|
}}
|
||||||
{self._ctor_body()}
|
{self._ctor_body()}
|
||||||
}}
|
}}
|
||||||
~RootBuilder() {{ if (parser_) WeaselJsonParser_destroy(parser_); }}
|
~RootBuilder() {{ if (parser_) WeaselJsonParser_destroy(parser_); }}
|
||||||
|
|||||||
Reference in New Issue
Block a user