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 Levon static 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 Levon static 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 Levon int 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