Investigate bplist decode gaps
wader opened this issue · 2 comments
wader commented
$ fq -o line_bytes=16 . format/bplist/testdata/recentapps.sfl2
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│.{}: format/bplist/testdata/recentapps.sfl2 (bplist)
0x0000│62 70 6c 69 73 74 30 30 │bplist00 │ header{}:
0x0000│ d4 00 01 00 02 00 03 00│ ........│ objects{}:
0x0010│04 00 05 00 06 00 07 00 0a 58 24 76 65 72 73 69│.........X$versi│
* │until 0x209f.7 (8344) │ │
0x01a0│ 80 0d │ .. │ gap0: raw bits
0x01e0│ 80 0d │ .. │ gap1: raw bits
0x0510│ 80 06 80 07 80 08 80 09 80│ .........│ gap2: raw bits
0x0520│0a │. │
0x0520│ 80 0b │ .. │ gap3: raw bits
0x0530│ 80 0d │ .. │ gap4: raw bits
0x0540│ 80 0d │ .. │ gap5: raw bits
0x07e0│ 80 06 80 07 80 08 80 09│ ........│ gap6: raw bits
0x07f0│80 0a │.. │
0x07f0│ 80 0b │ .. │ gap7: raw bits
0x0800│ 80 0d │ .. │ gap8: raw bits
0x0810│ 80 0d │ .. │ gap9: raw bits
0x0ae0│ 80 06 80 07│ ....│ gap10: raw bits
0x0af0│80 08 80 09 80 0a │...... │
0x0b00│ 80 0b │ .. │ gap11: raw bits
0x0b00│ 80 0d │ .. │ gap12: raw bits
0x0b10│ 80 0d │ .. │ gap13: raw bits
0x0de0│ 80 06 80 07 80 08 80 09 80 0a │ .......... │ gap14: raw bits
0x0df0│ 80 0b │ .. │ gap15: raw bits
0x0e00│ 80 0d │ .. │ gap16: raw bits
0x0e10│ 80 0d │ .. │ gap17: raw bits
0x10c0│80 06 80 07 80 08 80 09 80 0a │.......... │ gap18: raw bits
0x10d0│ 80 0b │ .. │ gap19: raw bits
0x10d0│ 80│ .│ gap20: raw bits
0x10e0│0d │. │
0x10f0│80 0d │.. │ gap21: raw bits
0x13c0│ 80 06 80 07 80 08 80 09 80 0a │ .......... │ gap22: raw bits
0x13d0│ 80 0b │ .. │ gap23: raw bits
0x13e0│80 0d │.. │ gap24: raw bits
0x13f0│ 80 0d │ .. │ gap25: raw bits
0x16d0│ 80│ .│ gap26: raw bits
0x16e0│06 80 07 80 08 80 09 80 0a │......... │
0x16f0│ 80 0b │ .. │ gap27: raw bits
0x16f0│ 80 0d│ ..│ gap28: raw bits
0x1700│ 80│ .│ gap29: raw bits
0x1710│0d │. │
0x1a50│80 06 80 07 80 08 80 09 80 0a │.......... │ gap30: raw bits
0x1a60│ 80 0b │ .. │ gap31: raw bits
0x1a60│ 80│ .│ gap32: raw bits
0x1a70│0d │. │
0x1a80│80 0d │.. │ gap33: raw bits
0x1d90│80 06 80 07 80 08 80 09 80 0a │.......... │ gap34: raw bits
0x1da0│ 80 0b │ .. │ gap35: raw bits
0x1da0│ 80│ .│ gap36: raw bits
0x1db0│0d │. │
0x1dc0│80 0d │.. │ gap37: raw bits
0x2070│ 80 0d │ .. │ gap38: raw bits
0x20a0│00 08 00 19 00 22 00 2c 00 31 00 3a 00 3f 00 51│.....".,.1.:.?.Q│ offset_table[0:271]:
0x20b0│00 56 00 5b 00 5d 00 e4 00 ea 00 f7 00 ff 01 0a│.V.[.]..........│
* │until 0x22bd.7 (542) │ │
0x22b0│ 00 00│ ..│ trailer{}:
0x22c0│00 00 00 00 02 02 00 00 00 00 00 00 01 0f 00 00│................│
0x22d0│00 00 00 00 00 00 00 00 00 00 00 00 20 a0│ │............ .│ │
They all seems to be unused integer values between 0x06 and 0x0d (excluding 0x0c for some reason) and they match the bytes when showing 2 bytes for each entry (excluding 0) in the offset table that don't show up in any *_index field:
$ fq -o line_bytes=16 'tobytes as $b | ([range(.offset_table | length)] - [0,fgrep("_index$")]) as $missing | .offset_table[$missing[]] | $b[.:.+2]' format/bplist/testdata/recentapps.sfl2
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1a0│ 80 0d │ .. │.: raw bits 0x1a1-0x1a2.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1e0│ 80 0d │ .. │.: raw bits 0x1e9-0x1ea.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x510│ 80 06 │ .. │.: raw bits 0x517-0x518.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x510│ 80 07 │ .. │.: raw bits 0x519-0x51a.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x510│ 80 08 │ .. │.: raw bits 0x51b-0x51c.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x510│ 80 09 │ .. │.: raw bits 0x51d-0x51e.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x510│ 80│ .│.: raw bits 0x51f-0x520.7 (2)
0x520│0a │. │
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x520│ 80 0b │ .. │.: raw bits 0x52c-0x52d.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x530│ 80 0d │ .. │.: raw bits 0x536-0x537.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x540│ 80 0d │ .. │.: raw bits 0x547-0x548.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x7e0│ 80 06 │ .. │.: raw bits 0x7e8-0x7e9.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x7e0│ 80 07 │ .. │.: raw bits 0x7ea-0x7eb.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x7e0│ 80 08 │ .. │.: raw bits 0x7ec-0x7ed.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x7e0│ 80 09│ ..│.: raw bits 0x7ee-0x7ef.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x7f0│80 0a │.. │.: raw bits 0x7f0-0x7f1.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x7f0│ 80 0b │ .. │.: raw bits 0x7fd-0x7fe.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x800│ 80 0d │ .. │.: raw bits 0x807-0x808.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x810│ 80 0d │ .. │.: raw bits 0x818-0x819.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xae0│ 80 06 │ .. │.: raw bits 0xaec-0xaed.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xae0│ 80 07│ ..│.: raw bits 0xaee-0xaef.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xaf0│80 08 │.. │.: raw bits 0xaf0-0xaf1.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xaf0│ 80 09 │ .. │.: raw bits 0xaf2-0xaf3.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xaf0│ 80 0a │ .. │.: raw bits 0xaf4-0xaf5.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xb00│ 80 0b │ .. │.: raw bits 0xb01-0xb02.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xb00│ 80 0d │ .. │.: raw bits 0xb0b-0xb0c.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xb10│ 80 0d │ .. │.: raw bits 0xb1c-0xb1d.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xde0│ 80 06 │ .. │.: raw bits 0xde5-0xde6.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xde0│ 80 07 │ .. │.: raw bits 0xde7-0xde8.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xde0│ 80 08 │ .. │.: raw bits 0xde9-0xdea.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xde0│ 80 09 │ .. │.: raw bits 0xdeb-0xdec.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xde0│ 80 0a │ .. │.: raw bits 0xded-0xdee.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xdf0│ 80 0b │ .. │.: raw bits 0xdfa-0xdfb.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xe00│ 80 0d │ .. │.: raw bits 0xe04-0xe05.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0xe10│ 80 0d │ .. │.: raw bits 0xe15-0xe16.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x10c0│80 06 │.. │.: raw bits 0x10c0-0x10c1.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x10c0│ 80 07 │ .. │.: raw bits 0x10c2-0x10c3.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x10c0│ 80 08 │ .. │.: raw bits 0x10c4-0x10c5.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x10c0│ 80 09 │ .. │.: raw bits 0x10c6-0x10c7.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x10c0│ 80 0a │ .. │.: raw bits 0x10c8-0x10c9.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x10d0│ 80 0b │ .. │.: raw bits 0x10d5-0x10d6.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x10d0│ 80│ .│.: raw bits 0x10df-0x10e0.7 (2)
0x10e0│0d │. │
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x10f0│80 0d │.. │.: raw bits 0x10f0-0x10f1.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x13c0│ 80 06 │ .. │.: raw bits 0x13c1-0x13c2.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x13c0│ 80 07 │ .. │.: raw bits 0x13c3-0x13c4.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x13c0│ 80 08 │ .. │.: raw bits 0x13c5-0x13c6.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x13c0│ 80 09 │ .. │.: raw bits 0x13c7-0x13c8.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x13c0│ 80 0a │ .. │.: raw bits 0x13c9-0x13ca.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x13d0│ 80 0b │ .. │.: raw bits 0x13d6-0x13d7.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x13e0│80 0d │.. │.: raw bits 0x13e0-0x13e1.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x13f0│ 80 0d │ .. │.: raw bits 0x13f1-0x13f2.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x16d0│ 80│ .│.: raw bits 0x16df-0x16e0.7 (2)
0x16e0│06 │. │
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x16e0│ 80 07 │ .. │.: raw bits 0x16e1-0x16e2.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x16e0│ 80 08 │ .. │.: raw bits 0x16e3-0x16e4.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x16e0│ 80 09 │ .. │.: raw bits 0x16e5-0x16e6.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x16e0│ 80 0a │ .. │.: raw bits 0x16e7-0x16e8.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x16f0│ 80 0b │ .. │.: raw bits 0x16f4-0x16f5.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x16f0│ 80 0d│ ..│.: raw bits 0x16fe-0x16ff.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1700│ 80│ .│.: raw bits 0x170f-0x1710.7 (2)
0x1710│0d │. │
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1a50│80 06 │.. │.: raw bits 0x1a50-0x1a51.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1a50│ 80 07 │ .. │.: raw bits 0x1a52-0x1a53.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1a50│ 80 08 │ .. │.: raw bits 0x1a54-0x1a55.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1a50│ 80 09 │ .. │.: raw bits 0x1a56-0x1a57.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1a50│ 80 0a │ .. │.: raw bits 0x1a58-0x1a59.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1a60│ 80 0b │ .. │.: raw bits 0x1a65-0x1a66.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1a60│ 80│ .│.: raw bits 0x1a6f-0x1a70.7 (2)
0x1a70│0d │. │
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1a80│80 0d │.. │.: raw bits 0x1a80-0x1a81.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1d90│80 06 │.. │.: raw bits 0x1d90-0x1d91.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1d90│ 80 07 │ .. │.: raw bits 0x1d92-0x1d93.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1d90│ 80 08 │ .. │.: raw bits 0x1d94-0x1d95.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1d90│ 80 09 │ .. │.: raw bits 0x1d96-0x1d97.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1d90│ 80 0a │ .. │.: raw bits 0x1d98-0x1d99.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1da0│ 80 0b │ .. │.: raw bits 0x1da5-0x1da6.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1da0│ 80│ .│.: raw bits 0x1daf-0x1db0.7 (2)
0x1db0│0d │. │
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x1dc0│80 0d │.. │.: raw bits 0x1dc0-0x1dc1.7 (2)
│00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f│0123456789abcdef│
0x2070│ 80 0d │ .. │.: raw bits 0x2075-0x2076.7 (2)
Don't see anything obviously missing when comparing torepr
and plutil -p format/bplist/testdata/recentapps.sfl2
. Some lazy encoder including redundant integers for som reason?
wader commented
One thing we could do is to keep track of used indexes and then at the end decode all unused indexes into some kind of "lost and found" array? :)