@ -18,41 +18,41 @@
int bpf_resolve_jumps ( struct bpf_labels * labels ,
struct sock_filter * filter , size_t count )
{
struct sock_filter * begin = filter ;
__u8 insn = count - 1 ;
size_t i ;
if ( count < 1 )
if ( count < 1 | | count > BPF_MAXINSNS )
return - 1 ;
/*
* Walk it once , backwards , to build the label table and do fixups .
* Since backward jumps are disallowed by BPF , this is easy .
*/
filter + = insn ;
for ( ; filter > = begin ; - - insn , - - filter ) {
if ( filter - > code ! = ( BPF_JMP + BPF_JA ) )
for ( i = 0 ; i < count ; + + i ) {
size_t offset = count - i - 1 ;
struct sock_filter * instr = & filter [ offset ] ;
if ( instr - > code ! = ( BPF_JMP + BPF_JA ) )
continue ;
switch ( ( filte r- > jt < < 8 ) | filte r- > jf ) {
switch ( ( inst r- > jt < < 8 ) | inst r- > jf ) {
case ( JUMP_JT < < 8 ) | JUMP_JF :
if ( labels - > labels [ filte r- > k ] . location = = 0xffffffff ) {
if ( labels - > labels [ inst r- > k ] . location = = 0xffffffff ) {
fprintf ( stderr , " Unresolved label: '%s' \n " ,
labels - > labels [ filte r- > k ] . label ) ;
labels - > labels [ inst r- > k ] . label ) ;
return 1 ;
}
filte r- > k = labels - > labels [ filte r- > k ] . location -
( insn + 1 ) ;
filte r- > jt = 0 ;
filte r- > jf = 0 ;
inst r- > k = labels - > labels [ inst r- > k ] . location -
( offset + 1 ) ;
inst r- > jt = 0 ;
inst r- > jf = 0 ;
continue ;
case ( LABEL_JT < < 8 ) | LABEL_JF :
if ( labels - > labels [ filte r- > k ] . location ! = 0xffffffff ) {
if ( labels - > labels [ inst r- > k ] . location ! = 0xffffffff ) {
fprintf ( stderr , " Duplicate label use: '%s' \n " ,
labels - > labels [ filte r- > k ] . label ) ;
labels - > labels [ inst r- > k ] . label ) ;
return 1 ;
}
labels - > labels [ filte r- > k ] . location = insn ;
filte r- > k = 0 ; /* fall through */
filte r- > jt = 0 ;
filte r- > jf = 0 ;
labels - > labels [ inst r- > k ] . location = offset ;
inst r- > k = 0 ; /* fall through */
inst r- > jt = 0 ;
inst r- > jf = 0 ;
continue ;
}
}