.. | .. |
---|
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 | } |
---|