All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] (resend) fix sock_raw behaviour
@ 2003-10-08 21:51 Jeroen Vreeken
  2003-10-10  6:53 ` David S. Miller
  0 siblings, 1 reply; 4+ messages in thread
From: Jeroen Vreeken @ 2003-10-08 21:51 UTC (permalink / raw)
  To: David S . Miller; +Cc: linux-hams, netdev

[-- Attachment #1: Type: text/plain, Size: 270 bytes --]

Hi,

This is a resend of a patch from some weeks ago that doesn't appear to have
made it in yet...
It fixes the behaviour of SOCK_RAW for ax25.
(Current 2.6.0 behaviour is wrong, has a locking problem and reports the
wrong address back)

Please apply...

Thanks,
Jeroen

[-- Attachment #2: sock-raw.diff --]
[-- Type: application/octet-stream, Size: 3823 bytes --]

--- linux-2.6.0-test5/net/ax25/af_ax25.c.org	2003-09-23 23:26:17.000000000 +0200
+++ linux-2.6.0-test5/net/ax25/af_ax25.c	2003-09-24 23:33:32.000000000 +0200
@@ -231,42 +231,29 @@
 /*
  *	Look for any matching address - RAW sockets can bind to arbitrary names
  */
-struct sock *ax25_addr_match(ax25_address *addr)
+void ax25_send_to_raw(ax25_address *addr, struct sk_buff *skb, int proto)
 {
-	struct sock *sk = NULL;
+	struct sock *sk;
 	ax25_cb *s;
+	struct sk_buff *copy;
 	struct hlist_node *node;
 
 	spin_lock_bh(&ax25_list_lock);
 	ax25_for_each(s, node, &ax25_list) {
 		if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 &&
-		    s->sk->sk_type == SOCK_RAW) {
+		    s->sk->sk_type == SOCK_RAW &&
+		    s->sk->sk_protocol == proto &&
+		    (!s->ax25_dev || s->ax25_dev->dev == skb->dev)) {
 			sk = s->sk;
-			lock_sock(sk);
-			break;
+			bh_lock_sock(sk);
+			if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf &&
+			    (copy = skb_clone(skb, GFP_ATOMIC)) != NULL)
+				if (sock_queue_rcv_skb(sk, copy) != 0)
+					kfree_skb(copy);
+			bh_unlock_sock(sk);
 		}
 	}
-
 	spin_unlock_bh(&ax25_list_lock);
-
-	return sk;
-}
-
-void ax25_send_to_raw(struct sock *sk, struct sk_buff *skb, int proto)
-{
-	struct sk_buff *copy;
-	struct hlist_node *node;
-
-	sk_for_each_from(sk, node)
-		if (sk->sk_type == SOCK_RAW &&
-		    sk->sk_protocol == proto &&
-		    atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf) {
-			if ((copy = skb_clone(skb, GFP_ATOMIC)) == NULL)
-				return;
-
-			if (sock_queue_rcv_skb(sk, copy) != 0)
-				kfree_skb(copy);
-		}
 }
 
 /*
@@ -1633,16 +1620,16 @@
 	if (msg->msg_namelen != 0) {
 		struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
 		ax25_digi digi;
-		ax25_address dest;
+		ax25_address src;
 
-		ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, NULL, &dest, &digi, NULL, NULL);
+		ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, &src, NULL, &digi, NULL, NULL);
 
 		sax->sax25_family = AF_AX25;
 		/* We set this correctly, even though we may not let the
 		   application know the digi calls further down (because it
 		   did NOT ask to know them).  This could get political... **/
 		sax->sax25_ndigis = digi.ndigi;
-		sax->sax25_call   = dest;
+		sax->sax25_call   = src;
 
 		if (sax->sax25_ndigis != 0) {
 			int ct;
--- linux-2.6.0-test5/include/net/ax25.h.org	2003-09-24 23:21:27.000000000 +0200
+++ linux-2.6.0-test5/include/net/ax25.h	2003-09-24 23:21:55.000000000 +0200
@@ -227,8 +227,7 @@
 struct sock *ax25_find_listener(ax25_address *, int, struct net_device *, int);
 struct sock *ax25_get_socket(ax25_address *, ax25_address *, int);
 extern ax25_cb *ax25_find_cb(ax25_address *, ax25_address *, ax25_digi *, struct net_device *);
-extern struct sock *ax25_addr_match(ax25_address *);
-extern void ax25_send_to_raw(struct sock *, struct sk_buff *, int);
+extern void ax25_send_to_raw(ax25_address *, struct sk_buff *, int);
 extern void ax25_destroy_socket(ax25_cb *);
 extern ax25_cb *ax25_create_cb(void);
 extern void ax25_fillin_cb(ax25_cb *, ax25_dev *);
--- linux-2.6.0-test5/include/net/ax25.h.org	2003-09-24 23:21:27.000000000 +0200
+++ linux-2.6.0-test5/include/net/ax25.h	2003-09-24 23:21:55.000000000 +0200
@@ -227,8 +227,7 @@
 struct sock *ax25_find_listener(ax25_address *, int, struct net_device *, int);
 struct sock *ax25_get_socket(ax25_address *, ax25_address *, int);
 extern ax25_cb *ax25_find_cb(ax25_address *, ax25_address *, ax25_digi *, struct net_device *);
-extern struct sock *ax25_addr_match(ax25_address *);
-extern void ax25_send_to_raw(struct sock *, struct sk_buff *, int);
+extern void ax25_send_to_raw(ax25_address *, struct sk_buff *, int);
 extern void ax25_destroy_socket(ax25_cb *);
 extern ax25_cb *ax25_create_cb(void);
 extern void ax25_fillin_cb(ax25_cb *, ax25_dev *);

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] (resend) fix sock_raw behaviour
  2003-10-08 21:51 [PATCH] (resend) fix sock_raw behaviour Jeroen Vreeken
@ 2003-10-10  6:53 ` David S. Miller
  2003-10-10 11:21   ` Jeroen Vreeken
  0 siblings, 1 reply; 4+ messages in thread
From: David S. Miller @ 2003-10-10  6:53 UTC (permalink / raw)
  To: Jeroen Vreeken; +Cc: linux-hams, netdev

On Wed, 8 Oct 2003 23:51:50 +0200
Jeroen Vreeken <pe1rxq@amsat.org> wrote:

> This is a resend of a patch from some weeks ago that doesn't appear to have
> made it in yet...

It doesn't apply, that's why.  You patch ax25.h twice the same
exact way which causes the patch to not apply.

While we're talking about this, who is going to maintain AX25
in 2.6.x?  I don't want to be taking bug fixes and other changes
to AX25 from random people, I'd like to have a single contact
that will review the AX25 patches from other people and then
forward them off to me.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] (resend) fix sock_raw behaviour
  2003-10-10 11:21   ` Jeroen Vreeken
@ 2003-10-10 11:16     ` David S. Miller
  0 siblings, 0 replies; 4+ messages in thread
From: David S. Miller @ 2003-10-10 11:16 UTC (permalink / raw)
  To: Jeroen Vreeken; +Cc: linux-hams, netdev, ralf

On Fri, 10 Oct 2003 13:21:57 +0200
Jeroen Vreeken <pe1rxq@amsat.org> wrote:

> On 2003.10.10 08:53:38 +0200 David S. Miller wrote:
> > While we're talking about this, who is going to maintain AX25
> > in 2.6.x?  I don't want to be taking bug fixes and other changes
> > to AX25 from random people, I'd like to have a single contact
> > that will review the AX25 patches from other people and then
> > forward them off to me.
> 
> The official maintainer for ax25 and netrom is Ralf Baechle. but he seems
> to have some problems fitting it into his schedule....

If that's the case why don't we have someone like you take
care of things until he is less busy?

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] (resend) fix sock_raw behaviour
  2003-10-10  6:53 ` David S. Miller
@ 2003-10-10 11:21   ` Jeroen Vreeken
  2003-10-10 11:16     ` David S. Miller
  0 siblings, 1 reply; 4+ messages in thread
From: Jeroen Vreeken @ 2003-10-10 11:21 UTC (permalink / raw)
  To: David S . Miller; +Cc: linux-hams, netdev, ralf

[-- Attachment #1: Type: text/plain, Size: 853 bytes --]

On 2003.10.10 08:53:38 +0200 David S. Miller wrote:
> On Wed, 8 Oct 2003 23:51:50 +0200
> Jeroen Vreeken <pe1rxq@amsat.org> wrote:
> 
> > This is a resend of a patch from some weeks ago that doesn't appear to
> have
> > made it in yet...
> 
> It doesn't apply, that's why.  You patch ax25.h twice the same
> exact way which causes the patch to not apply.

I seem to have pasted that part twice...
Attached is a corrected version
 
> While we're talking about this, who is going to maintain AX25
> in 2.6.x?  I don't want to be taking bug fixes and other changes
> to AX25 from random people, I'd like to have a single contact
> that will review the AX25 patches from other people and then
> forward them off to me.

The official maintainer for ax25 and netrom is Ralf Baechle. but he seems
to have some problems fitting it into his schedule....

Jeroen

[-- Attachment #2: sock-raw.diff --]
[-- Type: application/octet-stream, Size: 3070 bytes --]

--- linux-2.6.0-test5/net/ax25/af_ax25.c.org	2003-09-23 23:26:17.000000000 +0200
+++ linux-2.6.0-test5/net/ax25/af_ax25.c	2003-09-24 23:33:32.000000000 +0200
@@ -231,42 +231,29 @@
 /*
  *	Look for any matching address - RAW sockets can bind to arbitrary names
  */
-struct sock *ax25_addr_match(ax25_address *addr)
+void ax25_send_to_raw(ax25_address *addr, struct sk_buff *skb, int proto)
 {
-	struct sock *sk = NULL;
+	struct sock *sk;
 	ax25_cb *s;
+	struct sk_buff *copy;
 	struct hlist_node *node;
 
 	spin_lock_bh(&ax25_list_lock);
 	ax25_for_each(s, node, &ax25_list) {
 		if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 &&
-		    s->sk->sk_type == SOCK_RAW) {
+		    s->sk->sk_type == SOCK_RAW &&
+		    s->sk->sk_protocol == proto &&
+		    (!s->ax25_dev || s->ax25_dev->dev == skb->dev)) {
 			sk = s->sk;
-			lock_sock(sk);
-			break;
+			bh_lock_sock(sk);
+			if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf &&
+			    (copy = skb_clone(skb, GFP_ATOMIC)) != NULL)
+				if (sock_queue_rcv_skb(sk, copy) != 0)
+					kfree_skb(copy);
+			bh_unlock_sock(sk);
 		}
 	}
-
 	spin_unlock_bh(&ax25_list_lock);
-
-	return sk;
-}
-
-void ax25_send_to_raw(struct sock *sk, struct sk_buff *skb, int proto)
-{
-	struct sk_buff *copy;
-	struct hlist_node *node;
-
-	sk_for_each_from(sk, node)
-		if (sk->sk_type == SOCK_RAW &&
-		    sk->sk_protocol == proto &&
-		    atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf) {
-			if ((copy = skb_clone(skb, GFP_ATOMIC)) == NULL)
-				return;
-
-			if (sock_queue_rcv_skb(sk, copy) != 0)
-				kfree_skb(copy);
-		}
 }
 
 /*
@@ -1633,16 +1620,16 @@
 	if (msg->msg_namelen != 0) {
 		struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
 		ax25_digi digi;
-		ax25_address dest;
+		ax25_address src;
 
-		ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, NULL, &dest, &digi, NULL, NULL);
+		ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, &src, NULL, &digi, NULL, NULL);
 
 		sax->sax25_family = AF_AX25;
 		/* We set this correctly, even though we may not let the
 		   application know the digi calls further down (because it
 		   did NOT ask to know them).  This could get political... **/
 		sax->sax25_ndigis = digi.ndigi;
-		sax->sax25_call   = dest;
+		sax->sax25_call   = src;
 
 		if (sax->sax25_ndigis != 0) {
 			int ct;
--- linux-2.6.0-test5/include/net/ax25.h.org	2003-09-24 23:21:27.000000000 +0200
+++ linux-2.6.0-test5/include/net/ax25.h	2003-09-24 23:21:55.000000000 +0200
@@ -227,8 +227,7 @@
 struct sock *ax25_find_listener(ax25_address *, int, struct net_device *, int);
 struct sock *ax25_get_socket(ax25_address *, ax25_address *, int);
 extern ax25_cb *ax25_find_cb(ax25_address *, ax25_address *, ax25_digi *, struct net_device *);
-extern struct sock *ax25_addr_match(ax25_address *);
-extern void ax25_send_to_raw(struct sock *, struct sk_buff *, int);
+extern void ax25_send_to_raw(ax25_address *, struct sk_buff *, int);
 extern void ax25_destroy_socket(ax25_cb *);
 extern ax25_cb *ax25_create_cb(void);
 extern void ax25_fillin_cb(ax25_cb *, ax25_dev *);

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2003-10-10 11:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-10-08 21:51 [PATCH] (resend) fix sock_raw behaviour Jeroen Vreeken
2003-10-10  6:53 ` David S. Miller
2003-10-10 11:21   ` Jeroen Vreeken
2003-10-10 11:16     ` David S. Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.