Browse Source

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
  [NETPOLL]: Fixups for 'fix soft lockup when removing module'
  [NET]: net/core/netevent.c should #include <net/netevent.h>
  [NETFILTER]: nf_conntrack_h323: add checking of out-of-range on choices' index values
  [NET] skbuff: remove export of static symbol
  SCTP: Add scope_id validation for link-local binds
  SCTP: Check to make sure file is valid before setting timeout
  SCTP: Fix thinko in sctp_copy_laddrs()
Linus Torvalds 18 years ago
parent
commit
1feb17e286
6 changed files with 20 additions and 8 deletions
  1. 1 0
      net/core/netevent.c
  2. 2 4
      net/core/netpoll.c
  3. 0 1
      net/core/skbuff.c
  4. 3 1
      net/netfilter/nf_conntrack_h323_asn1.c
  5. 4 0
      net/sctp/ipv6.c
  6. 10 2
      net/sctp/socket.c

+ 1 - 0
net/core/netevent.c

@@ -15,6 +15,7 @@
 
 
 #include <linux/rtnetlink.h>
 #include <linux/rtnetlink.h>
 #include <linux/notifier.h>
 #include <linux/notifier.h>
+#include <net/netevent.h>
 
 
 static ATOMIC_NOTIFIER_HEAD(netevent_notif_chain);
 static ATOMIC_NOTIFIER_HEAD(netevent_notif_chain);
 
 

+ 2 - 4
net/core/netpoll.c

@@ -72,8 +72,7 @@ static void queue_process(struct work_struct *work)
 			netif_tx_unlock(dev);
 			netif_tx_unlock(dev);
 			local_irq_restore(flags);
 			local_irq_restore(flags);
 
 
-			if (atomic_read(&npinfo->refcnt))
-				schedule_delayed_work(&npinfo->tx_work, HZ/10);
+			schedule_delayed_work(&npinfo->tx_work, HZ/10);
 			return;
 			return;
 		}
 		}
 		netif_tx_unlock(dev);
 		netif_tx_unlock(dev);
@@ -786,8 +785,7 @@ void netpoll_cleanup(struct netpoll *np)
 			if (atomic_dec_and_test(&npinfo->refcnt)) {
 			if (atomic_dec_and_test(&npinfo->refcnt)) {
 				skb_queue_purge(&npinfo->arp_tx);
 				skb_queue_purge(&npinfo->arp_tx);
 				skb_queue_purge(&npinfo->txq);
 				skb_queue_purge(&npinfo->txq);
-				cancel_delayed_work(&npinfo->tx_work);
-				flush_scheduled_work();
+				cancel_rearming_delayed_work(&npinfo->tx_work);
 
 
 				/* clean after last, unfinished work */
 				/* clean after last, unfinished work */
 				if (!skb_queue_empty(&npinfo->txq)) {
 				if (!skb_queue_empty(&npinfo->txq)) {

+ 0 - 1
net/core/skbuff.c

@@ -2211,7 +2211,6 @@ EXPORT_SYMBOL(pskb_copy);
 EXPORT_SYMBOL(pskb_expand_head);
 EXPORT_SYMBOL(pskb_expand_head);
 EXPORT_SYMBOL(skb_checksum);
 EXPORT_SYMBOL(skb_checksum);
 EXPORT_SYMBOL(skb_clone);
 EXPORT_SYMBOL(skb_clone);
-EXPORT_SYMBOL(skb_clone_fraglist);
 EXPORT_SYMBOL(skb_copy);
 EXPORT_SYMBOL(skb_copy);
 EXPORT_SYMBOL(skb_copy_and_csum_bits);
 EXPORT_SYMBOL(skb_copy_and_csum_bits);
 EXPORT_SYMBOL(skb_copy_and_csum_dev);
 EXPORT_SYMBOL(skb_copy_and_csum_dev);

+ 3 - 1
net/netfilter/nf_conntrack_h323_asn1.c

@@ -518,7 +518,7 @@ int decode_seq(bitstr_t * bs, field_t * f, char *base, int level)
 			CHECK_BOUND(bs, 2);
 			CHECK_BOUND(bs, 2);
 			len = get_len(bs);
 			len = get_len(bs);
 			CHECK_BOUND(bs, len);
 			CHECK_BOUND(bs, len);
-			if (!base) {
+			if (!base || !(son->attr & DECODE)) {
 				PRINT("%*.s%s\n", (level + 1) * TAB_SIZE,
 				PRINT("%*.s%s\n", (level + 1) * TAB_SIZE,
 				      " ", son->name);
 				      " ", son->name);
 				bs->cur += len;
 				bs->cur += len;
@@ -704,6 +704,8 @@ int decode_choice(bitstr_t * bs, field_t * f, char *base, int level)
 	} else {
 	} else {
 		ext = 0;
 		ext = 0;
 		type = get_bits(bs, f->sz);
 		type = get_bits(bs, f->sz);
+		if (type >= f->lb)
+			return H323_ERROR_RANGE;
 	}
 	}
 
 
 	/* Write Type */
 	/* Write Type */

+ 4 - 0
net/sctp/ipv6.c

@@ -844,6 +844,10 @@ static int sctp_inet6_bind_verify(struct sctp_sock *opt, union sctp_addr *addr)
 			dev = dev_get_by_index(addr->v6.sin6_scope_id);
 			dev = dev_get_by_index(addr->v6.sin6_scope_id);
 			if (!dev)
 			if (!dev)
 				return 0;
 				return 0;
+			if (!ipv6_chk_addr(&addr->v6.sin6_addr, dev, 0)) {
+				dev_put(dev);
+				return 0;
+			}
 			dev_put(dev);
 			dev_put(dev);
 		}
 		}
 		af = opt->pf->af;
 		af = opt->pf->af;

+ 10 - 2
net/sctp/socket.c

@@ -980,6 +980,7 @@ static int __sctp_connect(struct sock* sk,
 	union sctp_addr *sa_addr;
 	union sctp_addr *sa_addr;
 	void *addr_buf;
 	void *addr_buf;
 	unsigned short port;
 	unsigned short port;
+	unsigned int f_flags = 0;
 
 
 	sp = sctp_sk(sk);
 	sp = sctp_sk(sk);
 	ep = sp->ep;
 	ep = sp->ep;
@@ -1106,7 +1107,14 @@ static int __sctp_connect(struct sock* sk,
 	af->to_sk_daddr(&to, sk);
 	af->to_sk_daddr(&to, sk);
 	sk->sk_err = 0;
 	sk->sk_err = 0;
 
 
-	timeo = sock_sndtimeo(sk, sk->sk_socket->file->f_flags & O_NONBLOCK);
+	/* in-kernel sockets don't generally have a file allocated to them
+	 * if all they do is call sock_create_kern().
+	 */
+	if (sk->sk_socket->file)
+		f_flags = sk->sk_socket->file->f_flags;
+
+	timeo = sock_sndtimeo(sk, f_flags & O_NONBLOCK);
+
 	err = sctp_wait_for_connect(asoc, &timeo);
 	err = sctp_wait_for_connect(asoc, &timeo);
 
 
 	/* Don't free association on exit. */
 	/* Don't free association on exit. */
@@ -4170,7 +4178,7 @@ static int sctp_copy_laddrs(struct sock *sk, __u16 port, void *to,
 		to += addrlen;
 		to += addrlen;
 		cnt ++;
 		cnt ++;
 		space_left -= addrlen;
 		space_left -= addrlen;
-		bytes_copied += addrlen;
+		*bytes_copied += addrlen;
 	}
 	}
 
 
 	return cnt;
 	return cnt;