diff options
Diffstat (limited to 'net/netrom')
| -rw-r--r-- | net/netrom/af_netrom.c | 77 | ||||
| -rw-r--r-- | net/netrom/nr_dev.c | 3 | ||||
| -rw-r--r-- | net/netrom/nr_in.c | 1 | ||||
| -rw-r--r-- | net/netrom/nr_out.c | 1 | ||||
| -rw-r--r-- | net/netrom/nr_route.c | 65 | ||||
| -rw-r--r-- | net/netrom/nr_subr.c | 1 | ||||
| -rw-r--r-- | net/netrom/nr_timer.c | 1 | ||||
| -rw-r--r-- | net/netrom/sysctl_net_netrom.c | 12 | 
8 files changed, 73 insertions, 88 deletions
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 06cb02796a0..ede50d197e1 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -31,7 +31,6 @@  #include <net/net_namespace.h>  #include <net/sock.h>  #include <asm/uaccess.h> -#include <asm/system.h>  #include <linux/fcntl.h>  #include <linux/termios.h>	/* For TIOCINQ/OUTQ */  #include <linux/mm.h> @@ -105,10 +104,9 @@ static void nr_remove_socket(struct sock *sk)  static void nr_kill_by_device(struct net_device *dev)  {  	struct sock *s; -	struct hlist_node *node;  	spin_lock_bh(&nr_list_lock); -	sk_for_each(s, node, &nr_list) +	sk_for_each(s, &nr_list)  		if (nr_sk(s)->device == dev)  			nr_disconnect(s, ENETUNREACH);  	spin_unlock_bh(&nr_list_lock); @@ -119,7 +117,7 @@ static void nr_kill_by_device(struct net_device *dev)   */  static int nr_device_event(struct notifier_block *this, unsigned long event, void *ptr)  { -	struct net_device *dev = (struct net_device *)ptr; +	struct net_device *dev = netdev_notifier_info_to_dev(ptr);  	if (!net_eq(dev_net(dev), &init_net))  		return NOTIFY_DONE; @@ -150,10 +148,9 @@ static void nr_insert_socket(struct sock *sk)  static struct sock *nr_find_listener(ax25_address *addr)  {  	struct sock *s; -	struct hlist_node *node;  	spin_lock_bh(&nr_list_lock); -	sk_for_each(s, node, &nr_list) +	sk_for_each(s, &nr_list)  		if (!ax25cmp(&nr_sk(s)->source_addr, addr) &&  		    s->sk_state == TCP_LISTEN) {  			bh_lock_sock(s); @@ -171,10 +168,9 @@ found:  static struct sock *nr_find_socket(unsigned char index, unsigned char id)  {  	struct sock *s; -	struct hlist_node *node;  	spin_lock_bh(&nr_list_lock); -	sk_for_each(s, node, &nr_list) { +	sk_for_each(s, &nr_list) {  		struct nr_sock *nr = nr_sk(s);  		if (nr->my_index == index && nr->my_id == id) { @@ -195,10 +191,9 @@ static struct sock *nr_find_peer(unsigned char index, unsigned char id,  	ax25_address *dest)  {  	struct sock *s; -	struct hlist_node *node;  	spin_lock_bh(&nr_list_lock); -	sk_for_each(s, node, &nr_list) { +	sk_for_each(s, &nr_list) {  		struct nr_sock *nr = nr_sk(s);  		if (nr->your_index == index && nr->your_id == id && @@ -306,26 +301,26 @@ static int nr_setsockopt(struct socket *sock, int level, int optname,  {  	struct sock *sk = sock->sk;  	struct nr_sock *nr = nr_sk(sk); -	int opt; +	unsigned long opt;  	if (level != SOL_NETROM)  		return -ENOPROTOOPT; -	if (optlen < sizeof(int)) +	if (optlen < sizeof(unsigned int))  		return -EINVAL; -	if (get_user(opt, (int __user *)optval)) +	if (get_user(opt, (unsigned int __user *)optval))  		return -EFAULT;  	switch (optname) {  	case NETROM_T1: -		if (opt < 1) +		if (opt < 1 || opt > ULONG_MAX / HZ)  			return -EINVAL;  		nr->t1 = opt * HZ;  		return 0;  	case NETROM_T2: -		if (opt < 1) +		if (opt < 1 || opt > ULONG_MAX / HZ)  			return -EINVAL;  		nr->t2 = opt * HZ;  		return 0; @@ -337,13 +332,13 @@ static int nr_setsockopt(struct socket *sock, int level, int optname,  		return 0;  	case NETROM_T4: -		if (opt < 1) +		if (opt < 1 || opt > ULONG_MAX / HZ)  			return -EINVAL;  		nr->t4 = opt * HZ;  		return 0;  	case NETROM_IDLE: -		if (opt < 0) +		if (opt > ULONG_MAX / (60 * HZ))  			return -EINVAL;  		nr->idle = opt * 60 * HZ;  		return 0; @@ -591,7 +586,6 @@ static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)  		return -EINVAL;  	}  	if ((dev = nr_dev_get(&addr->fsa_ax25.sax25_call)) == NULL) { -		SOCK_DEBUG(sk, "NET/ROM: bind failed: invalid node callsign\n");  		release_sock(sk);  		return -EADDRNOTAVAIL;  	} @@ -603,7 +597,7 @@ static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)  		if (!capable(CAP_NET_BIND_SERVICE)) {  			dev_put(dev);  			release_sock(sk); -			return -EACCES; +			return -EPERM;  		}  		nr->user_addr   = addr->fsa_digipeater[0];  		nr->source_addr = addr->fsa_ax25.sax25_call; @@ -632,7 +626,7 @@ static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)  	sock_reset_flag(sk, SOCK_ZAPPED);  	dev_put(dev);  	release_sock(sk); -	SOCK_DEBUG(sk, "NET/ROM: socket is bound\n"); +  	return 0;  } @@ -840,6 +834,8 @@ static int nr_getname(struct socket *sock, struct sockaddr *uaddr,  	struct sock *sk = sock->sk;  	struct nr_sock *nr = nr_sk(sk); +	memset(&sax->fsa_ax25, 0, sizeof(struct sockaddr_ax25)); +  	lock_sock(sk);  	if (peer != 0) {  		if (sk->sk_state != TCP_ESTABLISHED) { @@ -1015,7 +1011,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)  	skb_queue_head(&sk->sk_receive_queue, skb);  	if (!sock_flag(sk, SOCK_DEAD)) -		sk->sk_data_ready(sk, skb->len); +		sk->sk_data_ready(sk);  	bh_unlock_sock(sk); @@ -1032,7 +1028,7 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,  {  	struct sock *sk = sock->sk;  	struct nr_sock *nr = nr_sk(sk); -	struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name; +	DECLARE_SOCKADDR(struct sockaddr_ax25 *, usax, msg->msg_name);  	int err;  	struct sockaddr_ax25 sax;  	struct sk_buff *skb; @@ -1082,8 +1078,6 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,  		sax.sax25_call   = nr->dest_addr;  	} -	SOCK_DEBUG(sk, "NET/ROM: sendto: Addresses built.\n"); -  	/* Build a packet - the conventional user limit is 236 bytes. We can  	   do ludicrously large NetROM frames but must not overflow */  	if (len > 65536) { @@ -1091,7 +1085,6 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,  		goto out;  	} -	SOCK_DEBUG(sk, "NET/ROM: sendto: building packet.\n");  	size = len + NR_NETWORK_LEN + NR_TRANSPORT_LEN;  	if ((skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, &err)) == NULL) @@ -1105,7 +1098,6 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,  	 */  	asmptr = skb_push(skb, NR_TRANSPORT_LEN); -	SOCK_DEBUG(sk, "Building NET/ROM Header.\n");  	/* Build a NET/ROM Transport header */ @@ -1114,15 +1106,12 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,  	*asmptr++ = 0;		/* To be filled in later */  	*asmptr++ = 0;		/*      Ditto            */  	*asmptr++ = NR_INFO; -	SOCK_DEBUG(sk, "Built header.\n");  	/*  	 *	Put the data on the end  	 */  	skb_put(skb, len); -	SOCK_DEBUG(sk, "NET/ROM: Appending user data\n"); -  	/* User data follows immediately after the NET/ROM transport header */  	if (memcpy_fromiovec(skb_transport_header(skb), msg->msg_iov, len)) {  		kfree_skb(skb); @@ -1130,8 +1119,6 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,  		goto out;  	} -	SOCK_DEBUG(sk, "NET/ROM: Transmitting buffer\n"); -  	if (sk->sk_state != TCP_ESTABLISHED) {  		kfree_skb(skb);  		err = -ENOTCONN; @@ -1150,7 +1137,7 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,  		      struct msghdr *msg, size_t size, int flags)  {  	struct sock *sk = sock->sk; -	struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name; +	DECLARE_SOCKADDR(struct sockaddr_ax25 *, sax, msg->msg_name);  	size_t copied;  	struct sk_buff *skb;  	int er; @@ -1180,16 +1167,21 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,  		msg->msg_flags |= MSG_TRUNC;  	} -	skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); +	er = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); +	if (er < 0) { +		skb_free_datagram(sk, skb); +		release_sock(sk); +		return er; +	}  	if (sax != NULL) { +		memset(sax, 0, sizeof(*sax));  		sax->sax25_family = AF_NETROM;  		skb_copy_from_linear_data_offset(skb, 7, sax->sax25_call.ax25_call,  			      AX25_ADDR_LEN); +		msg->msg_namelen = sizeof(*sax);  	} -	msg->msg_namelen = sizeof(*sax); -  	skb_free_datagram(sk, skb);  	release_sock(sk); @@ -1254,7 +1246,8 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)  	case SIOCADDRT:  	case SIOCDELRT:  	case SIOCNRDECOBS: -		if (!capable(CAP_NET_ADMIN)) return -EPERM; +		if (!capable(CAP_NET_ADMIN)) +			return -EPERM;  		return nr_rt_ioctl(cmd, argp);  	default: @@ -1457,9 +1450,9 @@ static int __init nr_proto_init(void)  	nr_loopback_init(); -	proc_net_fops_create(&init_net, "nr", S_IRUGO, &nr_info_fops); -	proc_net_fops_create(&init_net, "nr_neigh", S_IRUGO, &nr_neigh_fops); -	proc_net_fops_create(&init_net, "nr_nodes", S_IRUGO, &nr_nodes_fops); +	proc_create("nr", S_IRUGO, init_net.proc_net, &nr_info_fops); +	proc_create("nr_neigh", S_IRUGO, init_net.proc_net, &nr_neigh_fops); +	proc_create("nr_nodes", S_IRUGO, init_net.proc_net, &nr_nodes_fops);  out:  	return rc;  fail: @@ -1487,9 +1480,9 @@ static void __exit nr_exit(void)  {  	int i; -	proc_net_remove(&init_net, "nr"); -	proc_net_remove(&init_net, "nr_neigh"); -	proc_net_remove(&init_net, "nr_nodes"); +	remove_proc_entry("nr", init_net.proc_net); +	remove_proc_entry("nr_neigh", init_net.proc_net); +	remove_proc_entry("nr_nodes", init_net.proc_net);  	nr_loopback_clear();  	nr_rt_free(); diff --git a/net/netrom/nr_dev.c b/net/netrom/nr_dev.c index 64e6dde9749..743262becd6 100644 --- a/net/netrom/nr_dev.c +++ b/net/netrom/nr_dev.c @@ -21,7 +21,6 @@  #include <linux/if_ether.h>	/* For the statistics structure. */  #include <linux/slab.h> -#include <asm/system.h>  #include <asm/uaccess.h>  #include <asm/io.h> @@ -98,7 +97,7 @@ static int nr_rebuild_header(struct sk_buff *skb)  static int nr_header(struct sk_buff *skb, struct net_device *dev,  		     unsigned short type, -		     const void *daddr, const void *saddr, unsigned len) +		     const void *daddr, const void *saddr, unsigned int len)  {  	unsigned char *buff = skb_push(skb, NR_NETWORK_LEN + NR_TRANSPORT_LEN); diff --git a/net/netrom/nr_in.c b/net/netrom/nr_in.c index 6d4ef6d65b3..c3073a2ef63 100644 --- a/net/netrom/nr_in.c +++ b/net/netrom/nr_in.c @@ -24,7 +24,6 @@  #include <net/sock.h>  #include <net/tcp_states.h>  #include <asm/uaccess.h> -#include <asm/system.h>  #include <linux/fcntl.h>  #include <linux/mm.h>  #include <linux/interrupt.h> diff --git a/net/netrom/nr_out.c b/net/netrom/nr_out.c index 607fddb4fdb..0b4bcb2bf38 100644 --- a/net/netrom/nr_out.c +++ b/net/netrom/nr_out.c @@ -23,7 +23,6 @@  #include <linux/skbuff.h>  #include <net/sock.h>  #include <asm/uaccess.h> -#include <asm/system.h>  #include <linux/fcntl.h>  #include <linux/mm.h>  #include <linux/interrupt.h> diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c index 44059d0c8dd..b976d5eff2d 100644 --- a/net/netrom/nr_route.c +++ b/net/netrom/nr_route.c @@ -26,7 +26,6 @@  #include <linux/skbuff.h>  #include <net/sock.h>  #include <asm/uaccess.h> -#include <asm/system.h>  #include <linux/fcntl.h>  #include <linux/termios.h>	/* For TIOCINQ/OUTQ */  #include <linux/mm.h> @@ -37,6 +36,7 @@  #include <linux/spinlock.h>  #include <net/netrom.h>  #include <linux/seq_file.h> +#include <linux/export.h>  static unsigned int nr_neigh_no = 1; @@ -49,10 +49,9 @@ static struct nr_node *nr_node_get(ax25_address *callsign)  {  	struct nr_node *found = NULL;  	struct nr_node *nr_node; -	struct hlist_node *node;  	spin_lock_bh(&nr_node_list_lock); -	nr_node_for_each(nr_node, node, &nr_node_list) +	nr_node_for_each(nr_node, &nr_node_list)  		if (ax25cmp(callsign, &nr_node->callsign) == 0) {  			nr_node_hold(nr_node);  			found = nr_node; @@ -67,10 +66,9 @@ static struct nr_neigh *nr_neigh_get_dev(ax25_address *callsign,  {  	struct nr_neigh *found = NULL;  	struct nr_neigh *nr_neigh; -	struct hlist_node *node;  	spin_lock_bh(&nr_neigh_list_lock); -	nr_neigh_for_each(nr_neigh, node, &nr_neigh_list) +	nr_neigh_for_each(nr_neigh, &nr_neigh_list)  		if (ax25cmp(callsign, &nr_neigh->callsign) == 0 &&  		    nr_neigh->dev == dev) {  			nr_neigh_hold(nr_neigh); @@ -114,10 +112,9 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,  	 */  	if (nr_neigh != NULL && nr_neigh->failed != 0 && quality == 0) {  		struct nr_node *nr_nodet; -		struct hlist_node *node;  		spin_lock_bh(&nr_node_list_lock); -		nr_node_for_each(nr_nodet, node, &nr_node_list) { +		nr_node_for_each(nr_nodet, &nr_node_list) {  			nr_node_lock(nr_nodet);  			for (i = 0; i < nr_nodet->count; i++)  				if (nr_nodet->routes[i].neighbour == nr_neigh) @@ -257,9 +254,12 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,  	case 3:  		if (nr_node->routes[1].quality > nr_node->routes[0].quality) {  			switch (nr_node->which) { -				case 0:  nr_node->which = 1; break; -				case 1:  nr_node->which = 0; break; -				default: break; +			case 0: +				nr_node->which = 1; +				break; +			case 1: +				nr_node->which = 0; +				break;  			}  			nr_route           = nr_node->routes[0];  			nr_node->routes[0] = nr_node->routes[1]; @@ -482,11 +482,11 @@ static int nr_dec_obs(void)  {  	struct nr_neigh *nr_neigh;  	struct nr_node  *s; -	struct hlist_node *node, *nodet; +	struct hlist_node *nodet;  	int i;  	spin_lock_bh(&nr_node_list_lock); -	nr_node_for_each_safe(s, node, nodet, &nr_node_list) { +	nr_node_for_each_safe(s, nodet, &nr_node_list) {  		nr_node_lock(s);  		for (i = 0; i < s->count; i++) {  			switch (s->routes[i].obs_count) { @@ -505,12 +505,13 @@ static int nr_dec_obs(void)  				s->count--;  				switch (i) { -					case 0: -						s->routes[0] = s->routes[1]; -					case 1: -						s->routes[1] = s->routes[2]; -					case 2: -						break; +				case 0: +					s->routes[0] = s->routes[1]; +					/* Fallthrough */ +				case 1: +					s->routes[1] = s->routes[2]; +				case 2: +					break;  				}  				break; @@ -536,15 +537,15 @@ static int nr_dec_obs(void)  void nr_rt_device_down(struct net_device *dev)  {  	struct nr_neigh *s; -	struct hlist_node *node, *nodet, *node2, *node2t; +	struct hlist_node *nodet, *node2t;  	struct nr_node  *t;  	int i;  	spin_lock_bh(&nr_neigh_list_lock); -	nr_neigh_for_each_safe(s, node, nodet, &nr_neigh_list) { +	nr_neigh_for_each_safe(s, nodet, &nr_neigh_list) {  		if (s->dev == dev) {  			spin_lock_bh(&nr_node_list_lock); -			nr_node_for_each_safe(t, node2, node2t, &nr_node_list) { +			nr_node_for_each_safe(t, node2t, &nr_node_list) {  				nr_node_lock(t);  				for (i = 0; i < t->count; i++) {  					if (t->routes[i].neighbour == s) { @@ -665,14 +666,17 @@ int nr_rt_ioctl(unsigned int cmd, void __user *arg)  	case SIOCADDRT:  		if (copy_from_user(&nr_route, arg, sizeof(struct nr_route_struct)))  			return -EFAULT; -		if ((dev = nr_ax25_dev_get(nr_route.device)) == NULL) +		if (nr_route.ndigis > AX25_MAX_DIGIS)  			return -EINVAL; -		if (nr_route.ndigis < 0 || nr_route.ndigis > AX25_MAX_DIGIS) { -			dev_put(dev); +		if ((dev = nr_ax25_dev_get(nr_route.device)) == NULL)  			return -EINVAL; -		}  		switch (nr_route.type) {  		case NETROM_NODE: +			if (strnlen(nr_route.mnemonic, 7) == 7) { +				ret = -EINVAL; +				break; +			} +  			ret = nr_add_node(&nr_route.callsign,  				nr_route.mnemonic,  				&nr_route.neighbour, @@ -730,11 +734,10 @@ int nr_rt_ioctl(unsigned int cmd, void __user *arg)  void nr_link_failed(ax25_cb *ax25, int reason)  {  	struct nr_neigh *s, *nr_neigh = NULL; -	struct hlist_node *node;  	struct nr_node  *nr_node = NULL;  	spin_lock_bh(&nr_neigh_list_lock); -	nr_neigh_for_each(s, node, &nr_neigh_list) { +	nr_neigh_for_each(s, &nr_neigh_list) {  		if (s->ax25 == ax25) {  			nr_neigh_hold(s);  			nr_neigh = s; @@ -754,7 +757,7 @@ void nr_link_failed(ax25_cb *ax25, int reason)  		return;  	}  	spin_lock_bh(&nr_node_list_lock); -	nr_node_for_each(nr_node, node, &nr_node_list) { +	nr_node_for_each(nr_node, &nr_node_list) {  		nr_node_lock(nr_node);  		if (nr_node->which < nr_node->count &&  		    nr_node->routes[nr_node->which].neighbour == nr_neigh) @@ -1006,16 +1009,16 @@ void __exit nr_rt_free(void)  {  	struct nr_neigh *s = NULL;  	struct nr_node  *t = NULL; -	struct hlist_node *node, *nodet; +	struct hlist_node *nodet;  	spin_lock_bh(&nr_neigh_list_lock);  	spin_lock_bh(&nr_node_list_lock); -	nr_node_for_each_safe(t, node, nodet, &nr_node_list) { +	nr_node_for_each_safe(t, nodet, &nr_node_list) {  		nr_node_lock(t);  		nr_remove_node_locked(t);  		nr_node_unlock(t);  	} -	nr_neigh_for_each_safe(s, node, nodet, &nr_neigh_list) { +	nr_neigh_for_each_safe(s, nodet, &nr_neigh_list) {  		while(s->count) {  			s->count--;  			nr_neigh_put(s); diff --git a/net/netrom/nr_subr.c b/net/netrom/nr_subr.c index 6a947ae50db..ca40e2298f5 100644 --- a/net/netrom/nr_subr.c +++ b/net/netrom/nr_subr.c @@ -23,7 +23,6 @@  #include <net/sock.h>  #include <net/tcp_states.h>  #include <asm/uaccess.h> -#include <asm/system.h>  #include <linux/fcntl.h>  #include <linux/mm.h>  #include <linux/interrupt.h> diff --git a/net/netrom/nr_timer.c b/net/netrom/nr_timer.c index 1cb98e88f5e..ff2c1b142f5 100644 --- a/net/netrom/nr_timer.c +++ b/net/netrom/nr_timer.c @@ -24,7 +24,6 @@  #include <net/sock.h>  #include <net/tcp_states.h>  #include <asm/uaccess.h> -#include <asm/system.h>  #include <linux/fcntl.h>  #include <linux/mm.h>  #include <linux/interrupt.h> diff --git a/net/netrom/sysctl_net_netrom.c b/net/netrom/sysctl_net_netrom.c index 1e0fa9e57aa..ba1c368b3f1 100644 --- a/net/netrom/sysctl_net_netrom.c +++ b/net/netrom/sysctl_net_netrom.c @@ -34,7 +34,7 @@ static int min_reset[]   = {0}, max_reset[]   = {1};  static struct ctl_table_header *nr_table_header; -static ctl_table nr_table[] = { +static struct ctl_table nr_table[] = {  	{  		.procname	= "default_path_quality",  		.data		= &sysctl_netrom_default_path_quality, @@ -146,18 +146,12 @@ static ctl_table nr_table[] = {  	{ }  }; -static struct ctl_path nr_path[] = { -	{ .procname = "net", }, -	{ .procname = "netrom", }, -	{ } -}; -  void __init nr_register_sysctl(void)  { -	nr_table_header = register_sysctl_paths(nr_path, nr_table); +	nr_table_header = register_net_sysctl(&init_net, "net/netrom", nr_table);  }  void nr_unregister_sysctl(void)  { -	unregister_sysctl_table(nr_table_header); +	unregister_net_sysctl_table(nr_table_header);  }  | 
