devicetree-org / dt-schema

Devicetree schema tools
http://www.devicetree.org
BSD 2-Clause "Simplified" License
67 stars 64 forks source link

Crash in is_int_array_schema() #111

Closed dlech closed 6 months ago

dlech commented 11 months ago
$ dt-validate --version
2023.10.dev5+g5d76ad1

In dtschema.fixups.is_int_array_schema() it is possible to crash on line 98 if item is a string instead of an array.

https://github.com/devicetree-org/dt-schema/blob/5d76ad1e7b668ab5c2a3629b24e278a66d52f8fc/dtschema/fixups.py#L97-L98

This can be reproduced by taking a valid binding with the pattern:

allOf:
  - $ref: /schemas/simple-bus.yaml#

and removing the - so that it is no longer an array

allOf:
  $ref: /schemas/simple-bus.yaml#

Here is an example stack trace from a crash:

Traceback (most recent call last):
  File "/home/david/.local/bin/dt-mk-schema", line 38, in <module>
    schemas = dtschema.DTValidator(args.schemas).schemas
  File "/home/david/.local/pipx/venvs/dtschema/lib/python3.10/site-packages/dtschema/validator.py", line 358, in __init__
    self.schemas = process_schemas(schema_files)
  File "/home/david/.local/pipx/venvs/dtschema/lib/python3.10/site-packages/dtschema/validator.py", line 275, in process_schemas
    sch = process_schema(os.path.abspath(filename))
  File "/home/david/.local/pipx/venvs/dtschema/lib/python3.10/site-packages/dtschema/validator.py", line 259, in process_schema
    schema = dtsch.fixup()
  File "/home/david/.local/pipx/venvs/dtschema/lib/python3.10/site-packages/dtschema/schema.py", line 151, in fixup
    dtschema.fixups.fixup_schema(processed_schema)
  File "/home/david/.local/pipx/venvs/dtschema/lib/python3.10/site-packages/dtschema/fixups.py", line 483, in fixup_schema
    fixup_sub_schema(schema)
  File "/home/david/.local/pipx/venvs/dtschema/lib/python3.10/site-packages/dtschema/fixups.py", line 368, in fixup_sub_schema
    walk_properties(prop, v[prop])
  File "/home/david/.local/pipx/venvs/dtschema/lib/python3.10/site-packages/dtschema/fixups.py", line 296, in walk_properties
    fixup_vals(propname, schema)
  File "/home/david/.local/pipx/venvs/dtschema/lib/python3.10/site-packages/dtschema/fixups.py", line 273, in fixup_vals
    _fixup_int_array_min_max_to_matrix(propname, schema)
  File "/home/david/.local/pipx/venvs/dtschema/lib/python3.10/site-packages/dtschema/fixups.py", line 112, in _fixup_int_array_min_max_to_matrix
    if not is_int_array_schema(propname, subschema):
  File "/home/david/.local/pipx/venvs/dtschema/lib/python3.10/site-packages/dtschema/fixups.py", line 98, in is_int_array_schema
    return int_array_re.search(item['$ref'])
TypeError: string indices must be integers
robherring commented 11 months ago

That should fail on the meta-schema before you even get to doing fixups.