Commit d5de262
committed
Bound eetf number and container-header reads against end of input
term_to_json_value dispatches on the tag byte (guaranteed present by the
function-top invalid_end), but then hands the raw pointer to ei_decode_long/
ei_decode_double and decode_list/tuple/map_header, which read a fixed payload
past the tag before any bounds check -- a read past end when the payload is
truncated (verified with a guard page: SIGSEGV on a tag-at-end buffer for each
numeric and container tag). Since the tag is known at the call site, gate each
decode with check_invalid_offset for that tag's fixed width: 2/5 bytes for
SMALL_INTEGER/INTEGER, 9/32 for NEW_FLOAT/legacy FLOAT, 5 for LIST/MAP/
LARGE_TUPLE arity, 2 for SMALL_TUPLE.
Also stop the write_sequence loop on error so a header declaring up to 2^32
elements with a truncated body errors out at once instead of spinning the
declared arity.
Add regression tests for each truncated scalar, truncated container header,
and the oversized-arity case.1 parent 5668dd5 commit d5de262
2 files changed
Lines changed: 79 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
88 | 93 | | |
89 | 94 | | |
90 | 95 | | |
| |||
99 | 104 | | |
100 | 105 | | |
101 | 106 | | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
102 | 110 | | |
103 | 111 | | |
104 | 112 | | |
| |||
112 | 120 | | |
113 | 121 | | |
114 | 122 | | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
115 | 126 | | |
116 | 127 | | |
117 | 128 | | |
| |||
151 | 162 | | |
152 | 163 | | |
153 | 164 | | |
| 165 | + | |
| 166 | + | |
154 | 167 | | |
155 | 168 | | |
156 | 169 | | |
| |||
183 | 196 | | |
184 | 197 | | |
185 | 198 | | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
186 | 202 | | |
187 | 203 | | |
188 | 204 | | |
| |||
192 | 208 | | |
193 | 209 | | |
194 | 210 | | |
| 211 | + | |
| 212 | + | |
195 | 213 | | |
196 | 214 | | |
197 | 215 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
523 | 523 | | |
524 | 524 | | |
525 | 525 | | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
526 | 587 | | |
527 | 588 | | |
528 | 589 | | |
| |||
0 commit comments