1*1f5207b7SJohn Levon #include "check_debug.h" 2*1f5207b7SJohn Levon 3*1f5207b7SJohn Levon struct sk_buff { 4*1f5207b7SJohn Levon unsigned char *head, *data; 5*1f5207b7SJohn Levon unsigned short network_header; 6*1f5207b7SJohn Levon }; 7*1f5207b7SJohn Levon 8*1f5207b7SJohn Levon struct foo { 9*1f5207b7SJohn Levon int a, b, c; 10*1f5207b7SJohn Levon }; 11*1f5207b7SJohn Levon skb_network_header(const struct sk_buff * skb)12*1f5207b7SJohn Levonstatic inline unsigned char *skb_network_header(const struct sk_buff *skb) 13*1f5207b7SJohn Levon { 14*1f5207b7SJohn Levon return skb->head + skb->network_header; 15*1f5207b7SJohn Levon } 16*1f5207b7SJohn Levon skb_network_offset(const struct sk_buff * skb)17*1f5207b7SJohn Levonstatic inline int skb_network_offset(const struct sk_buff *skb) 18*1f5207b7SJohn Levon { 19*1f5207b7SJohn Levon return skb_network_header(skb) - skb->data; 20*1f5207b7SJohn Levon } 21*1f5207b7SJohn Levon frob(struct sk_buff * skb)22*1f5207b7SJohn Levonint frob(struct sk_buff *skb) 23*1f5207b7SJohn Levon { 24*1f5207b7SJohn Levon struct foo *p; 25*1f5207b7SJohn Levon int x, y; 26*1f5207b7SJohn Levon 27*1f5207b7SJohn Levon __smatch_user_rl(*skb->data); 28*1f5207b7SJohn Levon __smatch_user_rl(skb->data + 1); 29*1f5207b7SJohn Levon __smatch_user_rl(*(int *)skb->data); 30*1f5207b7SJohn Levon __smatch_user_rl(skb->data - skb_network_header(skb)); 31*1f5207b7SJohn Levon 32*1f5207b7SJohn Levon p = skb->data; 33*1f5207b7SJohn Levon x = *(int *)skb->data; 34*1f5207b7SJohn Levon y = skb->data[1]; 35*1f5207b7SJohn Levon 36*1f5207b7SJohn Levon __smatch_user_rl(p->a); 37*1f5207b7SJohn Levon __smatch_user_rl(x); 38*1f5207b7SJohn Levon __smatch_user_rl(y); 39*1f5207b7SJohn Levon 40*1f5207b7SJohn Levon return 0; 41*1f5207b7SJohn Levon } 42*1f5207b7SJohn Levon 43*1f5207b7SJohn Levon /* 44*1f5207b7SJohn Levon * check-name: smatch: userdata from skb 45*1f5207b7SJohn Levon * check-command: smatch -p=kernel -I.. sm_skb2.c 46*1f5207b7SJohn Levon * 47*1f5207b7SJohn Levon * check-output-start 48*1f5207b7SJohn Levon sm_skb2.c:27 frob() user rl: '*skb->data' = '0-255' 49*1f5207b7SJohn Levon sm_skb2.c:28 frob() user rl: 'skb->data + 1' = '' 50*1f5207b7SJohn Levon sm_skb2.c:29 frob() user rl: '*skb->data' = 's32min-s32max' 51*1f5207b7SJohn Levon sm_skb2.c:30 frob() user rl: 'skb->data - skb_network_header(skb)' = '' 52*1f5207b7SJohn Levon sm_skb2.c:36 frob() user rl: 'p->a' = 's32min-s32max' 53*1f5207b7SJohn Levon sm_skb2.c:37 frob() user rl: 'x' = 's32min-s32max' 54*1f5207b7SJohn Levon sm_skb2.c:38 frob() user rl: 'y' = '0-255' 55*1f5207b7SJohn Levon * check-output-end 56*1f5207b7SJohn Levon */ 57