diff options
Diffstat (limited to 'net/bpf/test_run.c')
| -rw-r--r-- | net/bpf/test_run.c | 58 | 
1 files changed, 55 insertions, 3 deletions
diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index 1153bbcdff72..f79205d4444f 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -105,6 +105,40 @@ out:  	return err;  } +/* Integer types of various sizes and pointer combinations cover variety of + * architecture dependent calling conventions. 7+ can be supported in the + * future. + */ +int noinline bpf_fentry_test1(int a) +{ +	return a + 1; +} + +int noinline bpf_fentry_test2(int a, u64 b) +{ +	return a + b; +} + +int noinline bpf_fentry_test3(char a, int b, u64 c) +{ +	return a + b + c; +} + +int noinline bpf_fentry_test4(void *a, char b, int c, u64 d) +{ +	return (long)a + b + c + d; +} + +int noinline bpf_fentry_test5(u64 a, void *b, short c, int d, u64 e) +{ +	return a + (long)b + c + d + e; +} + +int noinline bpf_fentry_test6(u64 a, void *b, short c, int d, void *e, u64 f) +{ +	return a + (long)b + c + d + (long)e + f; +} +  static void *bpf_test_init(const union bpf_attr *kattr, u32 size,  			   u32 headroom, u32 tailroom)  { @@ -122,6 +156,15 @@ static void *bpf_test_init(const union bpf_attr *kattr, u32 size,  		kfree(data);  		return ERR_PTR(-EFAULT);  	} +	if (bpf_fentry_test1(1) != 2 || +	    bpf_fentry_test2(2, 3) != 5 || +	    bpf_fentry_test3(4, 5, 6) != 15 || +	    bpf_fentry_test4((void *)7, 8, 9, 10) != 34 || +	    bpf_fentry_test5(11, (void *)12, 13, 14, 15) != 65 || +	    bpf_fentry_test6(16, (void *)17, 18, 19, (void *)20, 21) != 111) { +		kfree(data); +		return ERR_PTR(-EFAULT); +	}  	return data;  } @@ -210,18 +253,26 @@ static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb)  	/* priority is allowed */  	if (!range_is_zero(__skb, offsetof(struct __sk_buff, priority) + -			   FIELD_SIZEOF(struct __sk_buff, priority), +			   sizeof_field(struct __sk_buff, priority),  			   offsetof(struct __sk_buff, cb)))  		return -EINVAL;  	/* cb is allowed */  	if (!range_is_zero(__skb, offsetof(struct __sk_buff, cb) + -			   FIELD_SIZEOF(struct __sk_buff, cb), +			   sizeof_field(struct __sk_buff, cb), +			   offsetof(struct __sk_buff, tstamp))) +		return -EINVAL; + +	/* tstamp is allowed */ + +	if (!range_is_zero(__skb, offsetof(struct __sk_buff, tstamp) + +			   sizeof_field(struct __sk_buff, tstamp),  			   sizeof(struct __sk_buff)))  		return -EINVAL;  	skb->priority = __skb->priority; +	skb->tstamp = __skb->tstamp;  	memcpy(&cb->data, __skb->cb, QDISC_CB_PRIV_LEN);  	return 0; @@ -235,6 +286,7 @@ static void convert_skb_to___skb(struct sk_buff *skb, struct __sk_buff *__skb)  		return;  	__skb->priority = skb->priority; +	__skb->tstamp = skb->tstamp;  	memcpy(__skb->cb, &cb->data, QDISC_CB_PRIV_LEN);  } @@ -386,7 +438,7 @@ static int verify_user_bpf_flow_keys(struct bpf_flow_keys *ctx)  	/* flags is allowed */  	if (!range_is_zero(ctx, offsetof(struct bpf_flow_keys, flags) + -			   FIELD_SIZEOF(struct bpf_flow_keys, flags), +			   sizeof_field(struct bpf_flow_keys, flags),  			   sizeof(struct bpf_flow_keys)))  		return -EINVAL;  |