You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@daffodil.apache.org by "Steve Lawrence (Jira)" <ji...@apache.org> on 2023/01/17 13:35:00 UTC

[jira] [Resolved] (DAFFODIL-1282) Abort: Invariant broken when parser is fed random junk

     [ https://issues.apache.org/jira/browse/DAFFODIL-1282?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Steve Lawrence resolved DAFFODIL-1282.
--------------------------------------
    Resolution: Cannot Reproduce

I am unable to reproduce this issue on the current main branch.

Additionally, I've checked out the commit from the date this ticket was opened (fb4e88182b56d194c4066247526ee3dfa5e00aa5) and can clearly see this was a bug. The bug occurred because our CompiledExpression.evaluate() function returned a tuple of the value and an updated variable map. In this specific bug we failed to extract the value from the tuple and instead just tried to convert the entire tuple to a long, which failed with this invariant.

Commit a7a7aef0bca10ad442a3ccc3aa4afa22596d3e40 (released in v1.1.0) modified the evaluate function so it no longer returned tuple, which eliminated this entire class of bugs. Since then, we've refactored much of this logic (e.g. created Evaluatables), but the same design exists where we no longer return a tuple, so this should no longer be a problem.

Resolving as cannot reproduce on main, and this particular bug was fixed sometime around v1.1.0.

> Abort: Invariant broken when parser is fed random junk 
> -------------------------------------------------------
>
>                 Key: DAFFODIL-1282
>                 URL: https://issues.apache.org/jira/browse/DAFFODIL-1282
>             Project: Daffodil
>          Issue Type: Bug
>          Components: General
>            Reporter: Jessie Chab
>            Assignee: Steve Lawrence
>            Priority: Critical
>             Fix For: 3.5.0
>
>
> I attempted to parse a file that I had accidentally overwritten with a saved parser. I got the following error:
> edu.illinois.ncsa.daffodil.exceptions.Abort: Invariant broken. Unsupported conversion to Long. (null,null) of type Tuple2
> edu.illinois.ncsa.daffodil.exceptions.Assert$.abort(Assert.scala:107)
> edu.illinois.ncsa.daffodil.exceptions.Assert$.invariantFailed(Assert.scala:148)
> edu.illinois.ncsa.daffodil.dpath.AsIntConverters$.asLong(AsIntConverters.scala:90)
> edu.illinois.ncsa.daffodil.processors.SpecifiedLengthExplicitBytesParser.getLength(SpecifiedLength.scala:314)
> 	at edu.illinois.ncsa.daffodil.exceptions.Assert$.abort(Assert.scala:107)
> 	at edu.illinois.ncsa.daffodil.exceptions.Assert$.invariantFailed(Assert.scala:148)
> 	at edu.illinois.ncsa.daffodil.dpath.AsIntConverters$.asLong(AsIntConverters.scala:90)
> 	at edu.illinois.ncsa.daffodil.processors.SpecifiedLengthExplicitBytesParser.getLength(SpecifiedLength.scala:314)
> 	at edu.illinois.ncsa.daffodil.processors.SpecifiedLengthExplicitBytesParser$$anonfun$parse$8.apply(SpecifiedLength.scala:322)
> 	at edu.illinois.ncsa.daffodil.processors.SpecifiedLengthExplicitBytesParser$$anonfun$parse$8.apply(SpecifiedLength.scala:319)
> 	at edu.illinois.ncsa.daffodil.processors.WithParseErrorThrowing$class.withParseErrorThrowing(ParseErrors.scala:217)
> 	at edu.illinois.ncsa.daffodil.processors.SpecifiedLengthParserBase.withParseErrorThrowing(SpecifiedLength.scala:166)
> 	at edu.illinois.ncsa.daffodil.processors.SpecifiedLengthExplicitBytesParser.parse(SpecifiedLength.scala:319)
> 	at edu.illinois.ncsa.daffodil.processors.Parser.parse1(Parser.scala:90)
> 	at edu.illinois.ncsa.daffodil.processors.StatementElementParserBase$$anonfun$9.apply(ElementCombinator1.scala:131)
> 	at edu.illinois.ncsa.daffodil.processors.StatementElementParserBase$$anonfun$9.apply(ElementCombinator1.scala:130)
> 	at scala.Option.map(Option.scala:145)
> 	at edu.illinois.ncsa.daffodil.processors.StatementElementParserBase.parse(ElementCombinator1.scala:130)
> 	at edu.illinois.ncsa.daffodil.processors.Parser.parse1(Parser.scala:90)
> 	at edu.illinois.ncsa.daffodil.processors.parsers.Rep$.loopExactlyTotalN(RepParsers.scala:104)
> 	at edu.illinois.ncsa.daffodil.processors.parsers.RepExactlyTotalOccursCountParser.parseAllRepeats(RepParsers.scala:311)
> 	at edu.illinois.ncsa.daffodil.processors.parsers.RepParser.parse(RepParsers.scala:76)
> 	at edu.illinois.ncsa.daffodil.processors.Parser.parse1(Parser.scala:90)
> 	at edu.illinois.ncsa.daffodil.processors.SeqCompParser$$anonfun$parse$2.apply(Parser.scala:171)
> 	at edu.illinois.ncsa.daffodil.processors.SeqCompParser$$anonfun$parse$2.apply(Parser.scala:169)
> 	at scala.collection.immutable.List.foreach(List.scala:318)
> 	at edu.illinois.ncsa.daffodil.processors.SeqCompParser.parse(Parser.scala:169)
> 	at edu.illinois.ncsa.daffodil.processors.Parser.parse1(Parser.scala:90)
> 	at edu.illinois.ncsa.daffodil.processors.parsers.ArrayCombinatorParser.parse(ElementKindParsers.scala:85)
> 	at edu.illinois.ncsa.daffodil.processors.Parser.parse1(Parser.scala:90)
> 	at edu.illinois.ncsa.daffodil.processors.SeqCompParser$$anonfun$parse$2.apply(Parser.scala:171)
> 	at edu.illinois.ncsa.daffodil.processors.SeqCompParser$$anonfun$parse$2.apply(Parser.scala:169)
> 	at scala.collection.immutable.List.foreach(List.scala:318)
> 	at edu.illinois.ncsa.daffodil.processors.SeqCompParser.parse(Parser.scala:169)
> 	at edu.illinois.ncsa.daffodil.processors.Parser.parse1(Parser.scala:90)
> 	at edu.illinois.ncsa.daffodil.processors.parsers.SequenceCombinatorParser.parse(ElementKindParsers.scala:69)
> 	at edu.illinois.ncsa.daffodil.processors.Parser.parse1(Parser.scala:90)
> 	at edu.illinois.ncsa.daffodil.processors.parsers.ComplexTypeParser.parse(ElementKindParsers.scala:55)
> 	at edu.illinois.ncsa.daffodil.processors.Parser.parse1(Parser.scala:90)
> 	at edu.illinois.ncsa.daffodil.processors.StatementElementParserBase$$anonfun$9.apply(ElementCombinator1.scala:131)
> 	at edu.illinois.ncsa.daffodil.processors.StatementElementParserBase$$anonfun$9.apply(ElementCombinator1.scala:130)
> 	at scala.Option.map(Option.scala:145)
> 	at edu.illinois.ncsa.daffodil.processors.StatementElementParserBase.parse(ElementCombinator1.scala:130)
> 	at edu.illinois.ncsa.daffodil.processors.Parser.parse1(Parser.scala:90)
> 	at edu.illinois.ncsa.daffodil.processors.DataProcessor$$anonfun$parse$3$$anon$1.liftedTree1$1(Runtime.scala:212)
> 	at edu.illinois.ncsa.daffodil.processors.DataProcessor$$anonfun$parse$3$$anon$1.<init>(Runtime.scala:211)
> 	at edu.illinois.ncsa.daffodil.processors.DataProcessor$$anonfun$parse$3.apply(Runtime.scala:208)
> 	at edu.illinois.ncsa.daffodil.processors.DataProcessor$$anonfun$parse$3.apply(Runtime.scala:207)
> 	at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57)
> 	at edu.illinois.ncsa.daffodil.ExecutionMode$$anonfun$usingRuntimeMode$1.apply(ExecutionMode.scala:80)
> 	at edu.illinois.ncsa.daffodil.ExecutionMode$$anonfun$usingRuntimeMode$1.apply(ExecutionMode.scala:80)
> 	at edu.illinois.ncsa.daffodil.processors.DataProcessor.parse(Runtime.scala:207)
> 	at edu.illinois.ncsa.daffodil.processors.DataProcessor.parse(Runtime.scala:171)
> 	at edu.illinois.ncsa.daffodil.Main$$anonfun$71.apply(Main.scala:685)
> 	at edu.illinois.ncsa.daffodil.Main$$anonfun$71.apply(Main.scala:683)
> 	at edu.illinois.ncsa.daffodil.util.Timer$.getTimeResult(Timer.scala:91)
> 	at edu.illinois.ncsa.daffodil.util.Timer$.getResult(Timer.scala:50)
> 	at edu.illinois.ncsa.daffodil.Main$.run(Main.scala:682)
> 	at edu.illinois.ncsa.daffodil.Main$.main(Main.scala:1067)
> 	at edu.illinois.ncsa.daffodil.Main.main(Main.scala)



--
This message was sent by Atlassian Jira
(v8.20.10#820010)