| .. | .. |
|---|
| 545 | 545 | } |
|---|
| 546 | 546 | } |
|---|
| 547 | 547 | |
|---|
| 548 | +static uint8_t bpf_encode_jt_jf_offset(int off, int i) |
|---|
| 549 | +{ |
|---|
| 550 | + int delta = off - i - 1; |
|---|
| 551 | + |
|---|
| 552 | + if (delta < 0 || delta > 255) |
|---|
| 553 | + fprintf(stderr, "warning: insn #%d jumps to insn #%d, " |
|---|
| 554 | + "which is out of range\n", i, off); |
|---|
| 555 | + return (uint8_t) delta; |
|---|
| 556 | +} |
|---|
| 557 | + |
|---|
| 548 | 558 | static void bpf_reduce_jt_jumps(void) |
|---|
| 549 | 559 | { |
|---|
| 550 | 560 | int i; |
|---|
| .. | .. |
|---|
| 552 | 562 | for (i = 0; i < curr_instr; i++) { |
|---|
| 553 | 563 | if (labels_jt[i]) { |
|---|
| 554 | 564 | int off = bpf_find_insns_offset(labels_jt[i]); |
|---|
| 555 | | - out[i].jt = (uint8_t) (off - i -1); |
|---|
| 565 | + out[i].jt = bpf_encode_jt_jf_offset(off, i); |
|---|
| 556 | 566 | } |
|---|
| 557 | 567 | } |
|---|
| 558 | 568 | } |
|---|
| .. | .. |
|---|
| 564 | 574 | for (i = 0; i < curr_instr; i++) { |
|---|
| 565 | 575 | if (labels_jf[i]) { |
|---|
| 566 | 576 | int off = bpf_find_insns_offset(labels_jf[i]); |
|---|
| 567 | | - out[i].jf = (uint8_t) (off - i - 1); |
|---|
| 577 | + out[i].jf = bpf_encode_jt_jf_offset(off, i); |
|---|
| 568 | 578 | } |
|---|
| 569 | 579 | } |
|---|
| 570 | 580 | } |
|---|