From 8499fd4f63196287939153eff49b529feef66418 Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Wed, 8 Jul 2026 23:23:03 -0300 Subject: [PATCH 1/2] Fix crashes on boolean schemas in various commands Signed-off-by: Juan Cruz Viotti --- DEPENDENCIES | 2 +- test/CMakeLists.txt | 5 +++ .../pass_boolean_schema_default_dialect.sh | 24 ++++++++++++++ .../pass_boolean_schema_default_dialect.sh | 32 +++++++++++++++++++ .../pass_boolean_schema_default_dialect.sh | 26 +++++++++++++++ ...il_boolean_schema_false_default_dialect.sh | 29 +++++++++++++++++ ...ass_boolean_schema_true_default_dialect.sh | 24 ++++++++++++++ vendor/blaze/src/bundle/bundle.cc | 5 +-- vendor/blaze/src/frame/frame.cc | 3 +- 9 files changed, 146 insertions(+), 4 deletions(-) create mode 100755 test/bundle/pass_boolean_schema_default_dialect.sh create mode 100755 test/inspect/pass_boolean_schema_default_dialect.sh create mode 100755 test/rdf/pass_boolean_schema_default_dialect.sh create mode 100755 test/validate/fail_boolean_schema_false_default_dialect.sh create mode 100755 test/validate/pass_boolean_schema_true_default_dialect.sh diff --git a/DEPENDENCIES b/DEPENDENCIES index cc24c052..4ab598f1 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -1,5 +1,5 @@ vendorpull https://github.com/sourcemeta/vendorpull 1dcbac42809cf87cb5b045106b863e17ad84ba02 core https://github.com/sourcemeta/core 367f6ef45c8e8f05269d65d98dab155505f39ccb jsonbinpack https://github.com/sourcemeta/jsonbinpack 183f333e0e032ebf0a397b5d66ed504c44a0a59f -blaze https://github.com/sourcemeta/blaze a2870f3a3de5fe8cd0008eed5cd679c48ebe126a +blaze https://github.com/sourcemeta/blaze 18618eccba9609f8beb5563ce57b32ec551f39bf ctrf https://github.com/ctrf-io/ctrf 93ea827d951390190171d37443bff169cf47c808 diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b85ac843..da7c4231 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -183,6 +183,8 @@ add_jsonschema_test_unix(validate/pass_2020_12_default_dialect) add_jsonschema_test_unix(validate/pass_2020_12_default_dialect_config) add_jsonschema_test_unix(validate/pass_2020_12_default_dialect_config_relative) add_jsonschema_test_unix(validate/pass_2020_12_default_dialect_config_parent) +add_jsonschema_test_unix(validate/pass_boolean_schema_true_default_dialect) +add_jsonschema_test_unix(validate/fail_boolean_schema_false_default_dialect) add_jsonschema_test_unix(validate/pass_2020_12_fast) add_jsonschema_test_unix(validate/fail_invalid_config) add_jsonschema_test_unix(validate/fail_draft3) @@ -490,6 +492,7 @@ add_jsonschema_test_unix(bundle/pass_draft3_https) add_jsonschema_test_unix(bundle/pass_draft7_https) add_jsonschema_test_unix(bundle/pass_2020_12_http) add_jsonschema_test_unix(bundle/pass_resolve_single_default_dialect) +add_jsonschema_test_unix(bundle/pass_boolean_schema_default_dialect) add_jsonschema_test_unix(bundle/pass_resolve_yaml) add_jsonschema_test_unix(bundle/pass_resolve_with_ignore) add_jsonschema_test_unix(bundle/pass_resolve_no_identifier) @@ -543,6 +546,7 @@ add_jsonschema_test_unix(inspect/pass_default_dialect_config_relative_uri) add_jsonschema_test_unix(inspect/pass_default_dialect_config_path_no_base_shift) add_jsonschema_test_unix(inspect/pass_default_dialect_config_extension_fallback_json) add_jsonschema_test_unix(inspect/pass_default_dialect_config_extension_fallback_yaml) +add_jsonschema_test_unix(inspect/pass_boolean_schema_default_dialect) add_jsonschema_test_unix(inspect/pass_default_dialect_config_extension_fallback_over_directory) add_jsonschema_test_unix(inspect/pass_default_dialect_config_extension_custom) add_jsonschema_test_unix(inspect/pass_default_dialect_cli_extension_fallback) @@ -954,6 +958,7 @@ add_jsonschema_test_unix(rdf/pass_composition_allof) add_jsonschema_test_unix(rdf/pass_composition_oneof) add_jsonschema_test_unix(rdf/pass_default_dialect_cli) add_jsonschema_test_unix(rdf/pass_default_dialect_config) +add_jsonschema_test_unix(rdf/pass_boolean_schema_default_dialect) add_jsonschema_test_unix(rdf/pass_empty_instance) add_jsonschema_test_unix(rdf/pass_expanded) add_jsonschema_test_unix(rdf/pass_expanded_verbose) diff --git a/test/bundle/pass_boolean_schema_default_dialect.sh b/test/bundle/pass_boolean_schema_default_dialect.sh new file mode 100755 index 00000000..5564303e --- /dev/null +++ b/test/bundle/pass_boolean_schema_default_dialect.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +set -o errexit +set -o nounset + +TMP="$(mktemp -d)" +clean() { rm -rf "$TMP"; } +trap clean EXIT + +cat << 'EOF' > "$TMP/schema.json" +true +EOF + +"$1" bundle "$TMP/schema.json" \ + --default-dialect "https://json-schema.org/draft/2020-12/schema" > "$TMP/result.json" + +cat << 'EOF' > "$TMP/expected.json" +true +EOF + +diff "$TMP/result.json" "$TMP/expected.json" + +# Must come out formatted +"$1" fmt "$TMP/result.json" --check --default-dialect "https://json-schema.org/draft/2020-12/schema" diff --git a/test/inspect/pass_boolean_schema_default_dialect.sh b/test/inspect/pass_boolean_schema_default_dialect.sh new file mode 100755 index 00000000..e8e1758e --- /dev/null +++ b/test/inspect/pass_boolean_schema_default_dialect.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +set -o errexit +set -o nounset + +TMP="$(mktemp -d)" +clean() { rm -rf "$TMP"; } +trap clean EXIT + +cat << 'EOF' > "$TMP/schema.json" +true +EOF + +"$1" inspect "$TMP/schema.json" \ + --default-dialect "https://json-schema.org/draft/2020-12/schema" > "$TMP/output.txt" + +cat << EOF > "$TMP/expected.txt" +(RESOURCE) URI: file://$(realpath "$TMP")/schema.json + Type : Static + Root : file://$(realpath "$TMP")/schema.json + Pointer : + File Position : 1:1 + Base : file://$(realpath "$TMP")/schema.json + Relative Pointer : + Dialect : https://json-schema.org/draft/2020-12/schema + Base Dialect : https://json-schema.org/draft/2020-12/schema + Parent : + Property Name : no + Orphan : no +EOF + +diff "$TMP/output.txt" "$TMP/expected.txt" diff --git a/test/rdf/pass_boolean_schema_default_dialect.sh b/test/rdf/pass_boolean_schema_default_dialect.sh new file mode 100755 index 00000000..d7b61327 --- /dev/null +++ b/test/rdf/pass_boolean_schema_default_dialect.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +set -o errexit +set -o nounset + +TMP="$(mktemp -d)" +clean() { rm -rf "$TMP"; } +trap clean EXIT + +cat << 'EOF' > "$TMP/schema.json" +true +EOF + +cat << 'EOF' > "$TMP/instance.json" +{} +EOF + +"$1" rdf "$TMP/schema.json" "$TMP/instance.json" \ + --default-dialect "https://json-schema.org/draft/2020-12/schema" \ + > "$TMP/output.json" + +cat << 'EOF' > "$TMP/expected.json" +[] +EOF + +diff "$TMP/output.json" "$TMP/expected.json" diff --git a/test/validate/fail_boolean_schema_false_default_dialect.sh b/test/validate/fail_boolean_schema_false_default_dialect.sh new file mode 100755 index 00000000..f3aca922 --- /dev/null +++ b/test/validate/fail_boolean_schema_false_default_dialect.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +set -o errexit +set -o nounset + +TMP="$(mktemp -d)" +clean() { rm -rf "$TMP"; } +trap clean EXIT + +cat << 'EOF' > "$TMP/schema.json" +false +EOF + +cat << 'EOF' > "$TMP/instance.json" +{} +EOF + +"$1" validate --default-dialect "https://json-schema.org/draft/2020-12/schema" \ + "$TMP/schema.json" "$TMP/instance.json" 2> "$TMP/stderr.txt" \ + && EXIT_CODE="$?" || EXIT_CODE="$?" +# Validation failure +test "$EXIT_CODE" = "2" + +cat << EOF > "$TMP/expected.txt" +fail: $(realpath "$TMP")/instance.json +error: Schema validation failure +EOF + +diff "$TMP/stderr.txt" "$TMP/expected.txt" diff --git a/test/validate/pass_boolean_schema_true_default_dialect.sh b/test/validate/pass_boolean_schema_true_default_dialect.sh new file mode 100755 index 00000000..530656f0 --- /dev/null +++ b/test/validate/pass_boolean_schema_true_default_dialect.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +set -o errexit +set -o nounset + +TMP="$(mktemp -d)" +clean() { rm -rf "$TMP"; } +trap clean EXIT + +cat << 'EOF' > "$TMP/schema.json" +true +EOF + +cat << 'EOF' > "$TMP/instance.json" +{} +EOF + +"$1" validate --default-dialect "https://json-schema.org/draft/2020-12/schema" \ + "$TMP/schema.json" "$TMP/instance.json" 2> "$TMP/output.txt" + +cat << 'EOF' > "$TMP/expected.txt" +EOF + +diff "$TMP/output.txt" "$TMP/expected.txt" diff --git a/vendor/blaze/src/bundle/bundle.cc b/vendor/blaze/src/bundle/bundle.cc index a27ca5fa..1658eee2 100644 --- a/vendor/blaze/src/bundle/bundle.cc +++ b/vendor/blaze/src/bundle/bundle.cc @@ -448,8 +448,9 @@ auto bundle(sourcemeta::core::JSON &schema, const SchemaWalker &walker, // If the schema identifier is implicit, add it to the top-level of the // bundled schema. Otherwise, potential relative references based on this // implicit base URI will likely not resolve unless end users happen to - // know that this implicit base URI is. - if (!default_id.empty() && + // know that this implicit base URI is. Note that boolean schemas cannot + // declare identifiers, so we leave those untouched + if (!default_id.empty() && schema.is_object() && identify(schema, resolver, default_dialect).empty()) { reidentify(schema, default_id, resolver, default_dialect); } diff --git a/vendor/blaze/src/frame/frame.cc b/vendor/blaze/src/frame/frame.cc index a2833dd3..38d02b1e 100644 --- a/vendor/blaze/src/frame/frame.cc +++ b/vendor/blaze/src/frame/frame.cc @@ -741,7 +741,8 @@ auto SchemaFrame::analyse(const sourcemeta::core::JSON &root, supports_id_anchors(entry.common.base_dialect.value()) && entry.id.value().starts_with('#'); - if ((!entry.common.subschema.get().defines("$ref") || !ref_overrides) && + if ((!entry.common.subschema.get().is_object() || + !entry.common.subschema.get().defines("$ref") || !ref_overrides) && // If we are dealing with a pre-2019-09 location independent // identifier, we ignore it as a traditional identifier and take // care of it as an anchor From 4b837b724269bf26f763177489b8a94d93e0f405 Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Thu, 9 Jul 2026 10:14:34 -0300 Subject: [PATCH 2/2] Fix Signed-off-by: Juan Cruz Viotti --- test/validate/pass_boolean_schema_true_default_dialect.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/validate/pass_boolean_schema_true_default_dialect.sh b/test/validate/pass_boolean_schema_true_default_dialect.sh index 530656f0..74e7ced8 100755 --- a/test/validate/pass_boolean_schema_true_default_dialect.sh +++ b/test/validate/pass_boolean_schema_true_default_dialect.sh @@ -16,7 +16,7 @@ cat << 'EOF' > "$TMP/instance.json" EOF "$1" validate --default-dialect "https://json-schema.org/draft/2020-12/schema" \ - "$TMP/schema.json" "$TMP/instance.json" 2> "$TMP/output.txt" + "$TMP/schema.json" "$TMP/instance.json" > "$TMP/output.txt" 2>&1 cat << 'EOF' > "$TMP/expected.txt" EOF