diff options
Diffstat (limited to 'kernel/bpf/cgroup.c')
| -rw-r--r-- | kernel/bpf/cgroup.c | 12 | 
1 files changed, 9 insertions, 3 deletions
diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c index 6ec088a96302..6aa9e10c6335 100644 --- a/kernel/bpf/cgroup.c +++ b/kernel/bpf/cgroup.c @@ -1391,12 +1391,13 @@ int __cgroup_bpf_run_filter_setsockopt(struct sock *sk, int *level,  		if (ctx.optlen != 0) {  			*optlen = ctx.optlen;  			*kernel_optval = ctx.optval; +			/* export and don't free sockopt buf */ +			return 0;  		}  	}  out: -	if (ret) -		sockopt_free_buf(&ctx); +	sockopt_free_buf(&ctx);  	return ret;  } @@ -1441,6 +1442,11 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level,  			goto out;  		} +		if (ctx.optlen < 0) { +			ret = -EFAULT; +			goto out; +		} +  		if (copy_from_user(ctx.optval, optval,  				   min(ctx.optlen, max_optlen)) != 0) {  			ret = -EFAULT; @@ -1458,7 +1464,7 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level,  		goto out;  	} -	if (ctx.optlen > max_optlen) { +	if (ctx.optlen > max_optlen || ctx.optlen < 0) {  		ret = -EFAULT;  		goto out;  	}  | 
