Patch "af_unix: return data from multiple SKBs on recv() with MSG_PEEK flag" has been added to the 3.14-stable tree
Subsystems (3)
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