Skip to content

Commit

Permalink
Prevent infinite loops in keyword building (#3665)
Browse files Browse the repository at this point in the history
* Prevent infinite loops in keyword building

* More fixes
  • Loading branch information
kddejong authored Sep 6, 2024
1 parent 00501ed commit 4756b7a
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 21 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[
{
"op": "test",
"path": "/definitions/SingleAxisOptions/properties/YAxisOptions",
"value": {
"$ref": "#/definitions/YAxisOptions"
}
},
{
"op": "replace",
"path": "/definitions/SingleAxisOptions/properties/YAxisOptions",
"value": {
"properties": {
"YAxis": {
"$ref": "#/definitions/SingleYAxisOption"
}
}
}
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[
{
"op": "test",
"path": "/definitions/SingleAxisOptions/properties/YAxisOptions",
"value": {
"$ref": "#/definitions/YAxisOptions"
}
},
{
"op": "replace",
"path": "/definitions/SingleAxisOptions/properties/YAxisOptions",
"value": {
"properties": {
"YAxis": {
"$ref": "#/definitions/SingleYAxisOption"
}
}
}
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -9314,7 +9314,11 @@
"additionalProperties": false,
"properties": {
"YAxisOptions": {
"$ref": "#/definitions/YAxisOptions"
"properties": {
"YAxis": {
"$ref": "#/definitions/SingleYAxisOption"
}
}
}
},
"type": "object"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8932,7 +8932,11 @@
"additionalProperties": false,
"properties": {
"YAxisOptions": {
"$ref": "#/definitions/YAxisOptions"
"properties": {
"YAxis": {
"$ref": "#/definitions/SingleYAxisOption"
}
}
}
},
"type": "object"
Expand Down
4 changes: 3 additions & 1 deletion src/cfnlint/jsonschema/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,5 +413,7 @@ def extend(

StandardValidator = create(
validators=_standard_validators,
function_filter=FunctionFilter(),
function_filter=FunctionFilter(
add_cfn_lint_keyword=False,
),
)
33 changes: 15 additions & 18 deletions test/integration/test_schema_files.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,15 +112,21 @@ def validate_basic_schema_details(
except RefResolutionError:
self.fail(f"Can't find prop {prop} for {section} in {filepath}")

def _build_keywords(
self, obj: Any, schema_resolver: RefResolver, refs: list[str] | None = None
):
if refs is None:
refs = []
def _build_keywords(self, obj: Any, schema_resolver: RefResolver, refs: list[str]):
if not isinstance(obj, dict):
yield []
return

if "$ref" in obj:
ref = obj["$ref"]
if ref in refs:
yield []
return
_, resolved_schema = schema_resolver.resolve(ref)
yield from self._build_keywords(
resolved_schema, schema_resolver, refs + [ref]
)

if "type" in obj:
if "object" in ensure_list(obj["type"]):
if "properties" in obj:
Expand All @@ -134,25 +140,14 @@ def _build_keywords(
):
yield ["*"] + item

if "$ref" in obj:
ref = obj["$ref"]
if ref in refs:
yield []
return
_, resolved_schema = schema_resolver.resolve(ref)
for item in self._build_keywords(
resolved_schema, schema_resolver, refs + [ref]
):
yield item

yield []

def build_keywords(self, schema_resolver):
self._found_keywords.append(
"/".join(["Resources", schema_resolver.referrer["typeName"], "Properties"])
)
for k, v in schema_resolver.referrer.get("properties").items():
for item in self._build_keywords(v, schema_resolver):
for item in self._build_keywords(v, schema_resolver, []):
self._found_keywords.append(
"/".join(
[
Expand Down Expand Up @@ -214,7 +209,9 @@ def test_data_module_specs(self):
self.validate_basic_schema_details(
schema_resolver, f"{dirpath}/{filename}"
)
self.build_keywords(schema_resolver)

if region == "us-east-1":
self.build_keywords(schema_resolver)

def cfn_lint(self, validator, _, keywords, schema):
keywords = ensure_list(keywords)
Expand Down

0 comments on commit 4756b7a

Please sign in to comment.