Skip to contentSkip to conversation

Patch "af_unix: return data from multiple SKBs on recv() with MSG_PEEK flag" has been added to the 3.14-stable tree

PATCH [email protected] 1 participant 1 message Oct 23, 2015

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

af_unix: return data from multiple SKBs on recv() with MSG_PEEK flag

to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
af_unix-return-data-from-multiple-skbs-on-recv-with-msg_peek-flag.patch
and it can be found in the queue-3.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From foo@baz Thu Oct 22 17:25:59 PDT 2015

From: Aaron Conole <[email protected]>
Date: Sat, 26 Sep 2015 18:50:43 -0400
Subject: af_unix: return data from multiple SKBs on recv() with MSG_PEEK flag

From: Aaron Conole <[email protected]>

[ Upstream commit 9f389e35674f5b086edd70ed524ca0f287259725 ]

AF_UNIX sockets now return multiple skbs from recv() when MSG_PEEK flag is set.

This is referenced in kernel bugzilla #12323 @
https://bugzilla.kernel.org/show_bug.cgi?id=12323

As described both in the BZ and lkml thread @
http://lkml.org/lkml/2008/1/8/444 calling recv() with MSG_PEEK on an AF_UNIX socket only reads a single skb, where the desired effect is to return as much skb data has been queued, until hitting the recv buffer size (whichever comes first).

The modified MSG_PEEK path will now move to the next skb in the tree and jump to the again: label, rather than following the natural loop structure. This requires duplicating some of the loop head actions.

This was tested using the python socketpair python code attached to the bugzilla issue.

---
 net/unix/af_unix.c |   14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)
net/unix/af_unix.c +13 -1
@@ -2064,8 +2064,20 @@ again:
 			if (UNIXCB(skb).fp)
 				siocb->scm->fp = scm_fp_dup(UNIXCB(skb).fp);
 
-			sk_peek_offset_fwd(sk, chunk);
+			if (skip) {
+				sk_peek_offset_fwd(sk, chunk);
+				skip -= chunk;
+			}
 
+			if (UNIXCB(skb).fp)
+				break;
+
+			last = skb;
+			unix_state_lock(sk);
+			skb = skb_peek_next(skb, &sk->sk_receive_queue);
+			if (skb)
+				goto again;
+			unix_state_unlock(sk);
 			break;
 		}
 	} while (size);

Patches currently in stable-queue which might be from [email protected] are

queue-3.14/af_unix-convert-the-unix_sk-macro-to-an-inline-function-for-type-safety.patch queue-3.14/af_unix-return-data-from-multiple-skbs-on-recv-with-msg_peek-flag.patch queue-3.14/net-unix-fix-logic-about-sk_peek_offset.patch