Skip to content

Parse instance with contents is not validated #1011

Description

@generalmimon

Since 0.9, KSC doesn't generate any validation for a positional instance which uses the contents key:

meta:
  id: contents_fail_inst
instances:
  e:
    pos: 0
    contents: [0xc8]

In this case, the generated code only reads one byte in e:

class ContentsFailInst < Kaitai::Struct::Struct
  # ...
  def e
    return @e unless @e.nil?
    _pos = @_io.pos
    @_io.seek(0)
    @e = @_io.read_bytes(1)
    @_io.seek(_pos)
    @e
  end

But when valid is used, the validation works:

meta:
  id: valid_fail_inst
instances:
  e:
    pos: 0
    size: 1
    valid: '[0xc8]'
class ValidFailInst < Kaitai::Struct::Struct
  # ...
  def e
    return @e unless @e.nil?
    _pos = @_io.pos
    @_io.seek(0)
    @e = @_io.read_bytes(1)
    @_io.seek(_pos)
    raise Kaitai::Struct::ValidationNotEqualError.new([200].pack('C*'), e, _io, "/instances/e") if not e == [200].pack('C*')
    @e
  end

So it looks like we've forgotten about this case (and of course there is no test for it in our test suite). In fact, it's even a 0.9 regression (that's right, another regression related to contents), because contents in a parse instance used to work in 0.8:

class ContentsFailInst < Kaitai::Struct::Struct
  # ...
  def e
    return @e unless @e.nil?
    _pos = @_io.pos
    @_io.seek(0)
    @e = @_io.ensure_fixed_contents([200].pack('C*'))
    @_io.seek(_pos)
    @e
  end

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions