Skip to content

Commit

Permalink
decode: Keep decode tree on RangeFn error
Browse files Browse the repository at this point in the history
  • Loading branch information
wader committed May 3, 2022
1 parent 8c9de70 commit 3ce660a
Show file tree
Hide file tree
Showing 10 changed files with 80 additions and 43 deletions.
8 changes: 7 additions & 1 deletion format/asn1/testdata/tc15.ber.fqtest
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,10 @@ $ fq -d asn1_ber d tc15.ber
0x0|09 |. | form: "primitive" (0)
0x0|09 |. | tag: "real" (0x9)
0x0| 0c | . | length: 12
0x0| 83 09 7f ff ff ff ff ff ff ff fb 05| | ............| | unknown0: raw bits
0x0| 83 | . | binary_encoding: true
0x0| 83 | . | sign: 1 (false)
0x0| 83 | . | base: 2 (0)
0x0| 83 | . | scale: 0
0x0| 83 | . | format: 3
0x0| 09 | . | exp_bytes: 9
0x0| 7f ff ff ff ff ff ff ff fb 05| | ..........| | unknown0: raw bits
8 changes: 7 additions & 1 deletion format/asn1/testdata/tc16.ber.fqtest
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,10 @@ $ fq -d asn1_ber d tc16.ber
0x0|09 |. | form: "primitive" (0)
0x0|09 |. | tag: "real" (0x9)
0x0| 0c | . | length: 12
0x0| 80 fb 05 05 05 05 05 05 05 05 05 05| | ............| | unknown0: raw bits
0x0| 80 | . | binary_encoding: true
0x0| 80 | . | sign: 1 (false)
0x0| 80 | . | base: 2 (0)
0x0| 80 | . | scale: 0
0x0| 80 | . | format: 0
0x0| fb | . | exp: -5
0x0| 05 05 05 05 05 05 05 05 05 05| | ..........| | unknown0: raw bits
8 changes: 7 additions & 1 deletion format/asn1/testdata/tc17.ber.fqtest
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,11 @@ $ fq -d asn1_ber d tc17.ber
0x00|09 |. | form: "primitive" (0)
0x00|09 |. | tag: "real" (0x9)
0x00| 14 | . | length: 20
0x00| af 09 fe ff ff ff ff ff ff ff ff 05 05 05| ..............| unknown0: raw bits
0x00| af | . | binary_encoding: true
0x00| af | . | sign: 1 (false)
0x00| af | . | base: 16 (2)
0x00| af | . | scale: 3
0x00| af | . | format: 3
0x00| 09 | . | exp_bytes: 9
0x00| fe ff ff ff ff ff ff ff ff 05 05 05| ............| unknown0: raw bits
0x10|05 05 05 05 05 05| |......| |
3 changes: 2 additions & 1 deletion format/asn1/testdata/tc33.ber.fqtest
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ $ fq -d asn1_ber d tc33.ber
0x0|03 |. | form: "primitive" (0)
0x0|03 |. | tag: "bit_string" (0x3)
0x0| 02 | . | length: 2
0x0| 0f 0f| | ..| | unknown0: raw bits
0x0| 0f | . | unused_bits_count: 15
0x0| 0f| | .| | unknown0: raw bits
1 change: 1 addition & 0 deletions format/asn1/testdata/tc39.ber.fqtest
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ $ fq -d asn1_ber d tc39.ber
0x0|23 |# | form: "constructed" (1)
0x0|23 |# | tag: "bit_string" (0x3)
0x0| 00| | .| | length: "indefinite" (0)
| | | constructed[0:0]:
14 changes: 13 additions & 1 deletion format/asn1/testdata/tc42.ber.fqtest
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,16 @@ $ fq -d asn1_ber d tc42.ber
0x0|24 |$ | form: "constructed" (1)
0x0|24 |$ | tag: "octet_string" (0x4)
0x0| 80 | . | length: "indefinite" (0)
0x0| 04 03 00 04 05 04 5f 29 1c d0 00 00| | ......_)....| | unknown0: raw bits
| | | constructed[0:2]:
| | | [0]{}: object
0x0| 04 | . | class: "universal" (0)
0x0| 04 | . | form: "primitive" (0)
0x0| 04 | . | tag: "octet_string" (0x4)
0x0| 03 | . | length: 3
0x0| 00 04 05 | ... | value: raw bits
| | | [1]{}: object
0x0| 04 | . | class: "universal" (0)
0x0| 04 | . | form: "primitive" (0)
0x0| 04 | . | tag: "octet_string" (0x4)
0x0| 5f | _ | length: 95
0x0| 29 1c d0 00 00| | )....| | unknown0: raw bits
1 change: 1 addition & 0 deletions format/asn1/testdata/tc45.ber.fqtest
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ $ fq -d asn1_ber d tc45.ber
0x0|24 |$ | form: "constructed" (1)
0x0|24 |$ | tag: "octet_string" (0x4)
0x0| 00| | .| | length: "indefinite" (0)
| | | constructed[0:0]:
15 changes: 14 additions & 1 deletion format/asn1/testdata/tc47.ber.fqtest
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,17 @@ $ fq -d asn1_ber d tc47.ber
0x00|23 |# | form: "constructed" (1)
0x00|23 |# | tag: "bit_string" (0x3)
0x00| 0e | . | length: 14
0x00| 03 02 00 01 00 00 03 02 00 01 03 02 04 0f| ..............| unknown0: raw bits
| | | constructed[0:2]:
| | | [0]{}: object
0x00| 03 | . | class: "universal" (0)
0x00| 03 | . | form: "primitive" (0)
0x00| 03 | . | tag: "bit_string" (0x3)
0x00| 02 | . | length: 2
0x00| 00 | . | unused_bits_count: 0
0x00| 01 | . | value: raw bits
| | | [1]{}: object
0x00| 00 | . | class: "universal" (0)
0x00| 00 | . | form: "primitive" (0)
0x00| 00 | . | tag: "end_of_content" (0x0)
0x00| 00 | . | length: "indefinite" (0)
0x00| 03 02 00 01 03 02 04 0f| ........| unknown0: raw bits
23 changes: 22 additions & 1 deletion format/asn1/testdata/tc48.ber.fqtest
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,25 @@ $ fq -d asn1_ber d tc48.ber
0x00|23 |# | form: "constructed" (1)
0x00|23 |# | tag: "bit_string" (0x3)
0x00| 80 | . | length: "indefinite" (0)
0x00| 03 02 00 01 03 02 00 01 03 02 0f 0f 00 00| ..............| unknown0: raw bits
| | | constructed[0:3]:
| | | [0]{}: object
0x00| 03 | . | class: "universal" (0)
0x00| 03 | . | form: "primitive" (0)
0x00| 03 | . | tag: "bit_string" (0x3)
0x00| 02 | . | length: 2
0x00| 00 | . | unused_bits_count: 0
0x00| 01 | . | value: raw bits
| | | [1]{}: object
0x00| 03 | . | class: "universal" (0)
0x00| 03 | . | form: "primitive" (0)
0x00| 03 | . | tag: "bit_string" (0x3)
0x00| 02 | . | length: 2
0x00| 00 | . | unused_bits_count: 0
0x00| 01 | . | value: raw bits
| | | [2]{}: object
0x00| 03 | . | class: "universal" (0)
0x00| 03 | . | form: "primitive" (0)
0x00| 03 | . | tag: "bit_string" (0x3)
0x00| 02 | . | length: 2
0x00| 0f | . | unused_bits_count: 15
0x00| 0f 00 00| ...| unknown0: raw bits
42 changes: 6 additions & 36 deletions pkg/decode/decode.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"math/big"

"github.com/wader/fq/internal/bitioextra"
"github.com/wader/fq/internal/mathextra"
"github.com/wader/fq/internal/recoverfn"
"github.com/wader/fq/pkg/bitio"
"github.com/wader/fq/pkg/ranges"
Expand Down Expand Up @@ -877,49 +876,20 @@ func (d *D) LimitedFn(nBits int64, fn func(d *D)) int64 {

// RangeFn decode from current position nBits forward. Position will not be changed.
func (d *D) RangeFn(firstBit int64, nBits int64, fn func(d *D)) int64 {
var subV interface{}
switch vv := d.Value.V.(type) {
case *Compound:
subV = &Compound{IsArray: vv.IsArray}
default:
panic("unreachable")
}

if nBits < 0 {
nBits = d.Len() - firstBit
}
startPos := d.Pos()

// TODO: do some kind of DecodeLimitedLen/RangeFn?
br := d.BitBufRange(0, firstBit+nBits)
if _, err := br.SeekBits(firstBit, io.SeekStart); err != nil {
d.IOPanic(err, "RangeFn: SeekAbs")
}
sd := d.FieldDecoder("", br, subV)

startPos := d.Pos()
endPos := startPos

fn(sd)

// TODO: refactor, similar to decode()
if err := sd.Value.WalkRootPreOrder(func(v *Value, rootV *Value, depth int, rootDepth int) error {
//v.Range.Start += firstBit
v.RootReader = d.Value.RootReader
endPos = mathextra.MaxInt64(endPos, v.Range.Stop())

return nil
}); err != nil {
panic(err)
}

switch vv := sd.Value.V.(type) {
case *Compound:
for _, f := range vv.Children {
d.AddChild(f)
}
default:
panic("unreachable")
}
pbr := d.bitBuf
d.bitBuf = br
fn(d)
endPos := d.Pos()
d.bitBuf = pbr

return endPos - startPos
}
Expand Down

0 comments on commit 3ce660a

Please sign in to comment.