> On 27 Mar 2019, at 14:53, Simon <cont...@simonbernard.eu> wrote:
> 
> Hi Jiong,
>    I didn't succeed to generate .i file using bcc, but since severals days I 
> try to rewrite my code without bcc. (directly with bpf C api / clang / 
> iproute2)
> 
>    I didn't finished yet, but I have a reduced version compared to the one I 
> written for bcc and I face the same issue, so this time I can get .i file 
> easily.
> 
>    So the .i file is as attachment.
>    The corresponding code is available here : 
> https://github.com/sbernard31/udploadbalancer/blob/44fe1ea549a55ab23c7d1b70e9651df6f61fb865/ulb.c


Hi Simon,

  Thanks for the .i, I prototyped some byteswap code-gen change, but
seems doesn’t help your issue which could narrow down to the following
general code pattern:

unsigned char cal(unsigned int a, unsigned char *b)                       
{                                                                         
  if (a < 8 || a > 512)                                                   
    return 0;                                                             
                                                                                
 
  return b[a];                                                                  
 
} 

LLVM is doing some optimisation, instead of generating two separate comparison,
a < 8 and a > 512, it is combining them because a negative value when casted
into unsigned must be bigger than 504, so above code turned into

unsigned char cal(unsigned int a, unsigned char *b)                       
{
  unsigned tmp = a - 8;                                                 
  if (tmp > 504)
    return 0;                                                             
                                                                                
 
  return b[a];                                                                  
 
} 

The consequence of such optimisation is new variable “tmp” is used for 
comparison
And verifier now know “tmp”'s value range instead of the original “a” which is 
used
later adding to a packet pointer. A unknown value range of “a” then caused the
verifier rejection. 

So, I suspect any code using above c code pattern will likely be rejected.

  1. combinable comparisons
  2. the variable involved in the comparison used later in places requiring 
value range

Regards,
Jiong

> 
>    The error is still  math between pkt pointer and register with unbounded 
> min value is not allowed
> 
>    The verifier output is pretty much the same :
> 
> 27: (71) r4 = *(u8 *)(r1 +23)
> 28: (b7) r0 = 2
> 29: (55) if r4 != 0x11 goto pc+15
>  R0=inv2 R1=pkt(id=0,off=0,r=34,imm=0) R2=pkt_end(id=0,off=0,imm=0) 
> R3=pkt(id=0,off=34,r=34,imm=0) R4=inv17 R5=inv5 R10=fp0,call_-1
> 30: (07) r3 += 8
> 31: (b7) r0 = 1
> 32: (2d) if r3 > r2 goto pc+12
>  R0=inv1 R1=pkt(id=0,off=0,r=42,imm=0) R2=pkt_end(id=0,off=0,imm=0) 
> R3=pkt(id=0,off=42,r=42,imm=0) R4=inv17 R5=inv5 R10=fp0,call_-1
> 33: (69) r3 = *(u16 *)(r1 +38)
> 34: (dc) r3 = be16 r3
> 35: (bf) r4 = r3
> 36: (07) r4 += -8
> 37: (57) r4 &= 65535
> 38: (b7) r0 = 1
> 39: (25) if r4 > 0x1f8 goto pc+5
>  R0=inv1 R1=pkt(id=0,off=0,r=42,imm=0) R2=pkt_end(id=0,off=0,imm=0) 
> R3=inv(id=0) R4=inv(id=0,umax_value=504,var_off=(0x0; 0x1ff)) R5=inv5 
> R10=fp0,call_-1
> 40: (0f) r1 += r3
> math between pkt pointer and register with unbounded min value is not allowed
> 
> I'm pretty sure the bcc version I used before linked statically clang/llvm 
> v7.0.
> Here I use a v6.0.
> 
> The funny part ...  This modification about just adding some logs/printk 
> makes this error disappear : 
> https://github.com/sbernard31/udploadbalancer/commit/0145538c7b35e2a6bb92225f69a45f4bee120a6d
> 
> All of those erifier errors make me a bit crazy (╥_╥)
> 
> HTH
> 
> Simon
> 
> 
> <ulb.i>


-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#1629): https://lists.iovisor.org/g/iovisor-dev/message/1629
Mute This Topic: https://lists.iovisor.org/mt/30285987/21656
Mute #verifier: https://lists.iovisor.org/mk?hashtag=verifier&subid=2590197
Group Owner: iovisor-dev+ow...@lists.iovisor.org
Unsubscribe: https://lists.iovisor.org/g/iovisor-dev/unsub  
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to