On Tue, Apr 20, 2010 at 05:14:05PM -0700, Guy Harris wrote: > In bpf_validate, when it checks whether the divisor in a BPF_DIV instruction > is a constant 0, it does > > case BPF_DIV: > /* > * Check for constant division by 0. > */ > if (BPF_RVAL(p->code) == BPF_K && p->k == 0) > return 0; > break; > > BPF_RVAL() is the macro to get the return value of a RET instruction; it > extracts the 0x18 bits. The BPF_DIV opcode is 0x30, which has the 0x10 bit > set; a BPF_DIV instruction with a constant 0 as the divisor would be > BPF_DIV|BPF_K, which is 0x30; BPF_RVAL(p->code) would be 0x10, which isn't > equal to BPF_K, which is 0x00. > > The macro to get the source argument of an arithmetic instruction is > BPF_SRC(), which extracts only the 0x08 bit; BPF_SRC(p->code) would be 0x00, > which is equal to BPF_K, so it should be doing > > case BPF_DIV: > /* > * Check for constant division by 0. > */ > if (BPF_SRC(p->code) == BPF_K && p->k == 0) > return 0; > break;
Indeed, thanks. -Otto