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

Reply via email to