diff options
Diffstat (limited to 'net/ipv4/sysctl_net_ipv4.c')
| -rw-r--r-- | net/ipv4/sysctl_net_ipv4.c | 49 | 
1 files changed, 42 insertions, 7 deletions
| diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index d06247ba08b2..b92f422f2fa8 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c @@ -189,8 +189,9 @@ static int ipv4_ping_group_range(struct ctl_table *table, int write,  	if (write && ret == 0) {  		low = make_kgid(user_ns, urange[0]);  		high = make_kgid(user_ns, urange[1]); -		if (!gid_valid(low) || !gid_valid(high) || -		    (urange[1] < urange[0]) || gid_lt(high, low)) { +		if (!gid_valid(low) || !gid_valid(high)) +			return -EINVAL; +		if (urange[1] < urange[0] || gid_lt(high, low)) {  			low = make_kgid(&init_user_ns, 1);  			high = make_kgid(&init_user_ns, 0);  		} @@ -200,6 +201,23 @@ static int ipv4_ping_group_range(struct ctl_table *table, int write,  	return ret;  } +static int ipv4_fwd_update_priority(struct ctl_table *table, int write, +				    void __user *buffer, +				    size_t *lenp, loff_t *ppos) +{ +	struct net *net; +	int ret; + +	net = container_of(table->data, struct net, +			   ipv4.sysctl_ip_fwd_update_priority); +	ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); +	if (write && ret == 0) +		call_netevent_notifiers(NETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE, +					net); + +	return ret; +} +  static int proc_tcp_congestion_control(struct ctl_table *ctl, int write,  				       void __user *buffer, size_t *lenp, loff_t *ppos)  { @@ -265,8 +283,9 @@ static int proc_tcp_fastopen_key(struct ctl_table *table, int write,  	    ipv4.sysctl_tcp_fastopen);  	struct ctl_table tbl = { .maxlen = (TCP_FASTOPEN_KEY_LENGTH * 2 + 10) };  	struct tcp_fastopen_context *ctxt; -	int ret;  	u32  user_key[4]; /* 16 bytes, matching TCP_FASTOPEN_KEY_LENGTH */ +	__le32 key[4]; +	int ret, i;  	tbl.data = kmalloc(tbl.maxlen, GFP_KERNEL);  	if (!tbl.data) @@ -275,11 +294,14 @@ static int proc_tcp_fastopen_key(struct ctl_table *table, int write,  	rcu_read_lock();  	ctxt = rcu_dereference(net->ipv4.tcp_fastopen_ctx);  	if (ctxt) -		memcpy(user_key, ctxt->key, TCP_FASTOPEN_KEY_LENGTH); +		memcpy(key, ctxt->key, TCP_FASTOPEN_KEY_LENGTH);  	else -		memset(user_key, 0, sizeof(user_key)); +		memset(key, 0, sizeof(key));  	rcu_read_unlock(); +	for (i = 0; i < ARRAY_SIZE(key); i++) +		user_key[i] = le32_to_cpu(key[i]); +  	snprintf(tbl.data, tbl.maxlen, "%08x-%08x-%08x-%08x",  		user_key[0], user_key[1], user_key[2], user_key[3]);  	ret = proc_dostring(&tbl, write, buffer, lenp, ppos); @@ -290,13 +312,17 @@ static int proc_tcp_fastopen_key(struct ctl_table *table, int write,  			ret = -EINVAL;  			goto bad_key;  		} -		tcp_fastopen_reset_cipher(net, NULL, user_key, + +		for (i = 0; i < ARRAY_SIZE(user_key); i++) +			key[i] = cpu_to_le32(user_key[i]); + +		tcp_fastopen_reset_cipher(net, NULL, key,  					  TCP_FASTOPEN_KEY_LENGTH);  	}  bad_key:  	pr_debug("proc FO key set 0x%x-%x-%x-%x <- 0x%s: %u\n", -	       user_key[0], user_key[1], user_key[2], user_key[3], +		user_key[0], user_key[1], user_key[2], user_key[3],  	       (char *)tbl.data, ret);  	kfree(tbl.data);  	return ret; @@ -655,6 +681,15 @@ static struct ctl_table ipv4_net_table[] = {  		.proc_handler	= proc_dointvec,  	},  	{ +		.procname	= "ip_forward_update_priority", +		.data		= &init_net.ipv4.sysctl_ip_fwd_update_priority, +		.maxlen		= sizeof(int), +		.mode		= 0644, +		.proc_handler   = ipv4_fwd_update_priority, +		.extra1		= &zero, +		.extra2		= &one, +	}, +	{  		.procname	= "ip_nonlocal_bind",  		.data		= &init_net.ipv4.sysctl_ip_nonlocal_bind,  		.maxlen		= sizeof(int), |