Skip to content

Commit

Permalink
net/unix: fix logic about sk_peek_offset
Browse files Browse the repository at this point in the history
Now send with MSG_PEEK can return data from multiple SKBs.

Unfortunately we take into account the peek offset for each skb,
that is wrong. We need to apply the peek offset only once.

In addition, the peek offset should be used only if MSG_PEEK is set.

Cc: "David S. Miller" <[email protected]> (maintainer:NETWORKING
Cc: Eric Dumazet <[email protected]> (commit_signer:1/14=7%)
Cc: Aaron Conole <[email protected]>
Fixes: 9f389e3 ("af_unix: return data from multiple SKBs on recv() with MSG_PEEK flag")
Signed-off-by: Andrey Vagin <[email protected]>
Tested-by: Aaron Conole <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
avagin authored and davem330 committed Oct 5, 2015
1 parent 215c90a commit e9193d6
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions net/unix/af_unix.c
Original file line number Diff line number Diff line change
Expand Up @@ -2064,6 +2064,11 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state)
goto out;
}

if (flags & MSG_PEEK)
skip = sk_peek_offset(sk, flags);
else
skip = 0;

do {
int chunk;
struct sk_buff *skb, *last;
Expand Down Expand Up @@ -2112,7 +2117,6 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state)
break;
}

skip = sk_peek_offset(sk, flags);
while (skip >= unix_skb_len(skb)) {
skip -= unix_skb_len(skb);
last = skb;
Expand Down Expand Up @@ -2179,14 +2183,12 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state)
if (UNIXCB(skb).fp)
scm.fp = scm_fp_dup(UNIXCB(skb).fp);

if (skip) {
sk_peek_offset_fwd(sk, chunk);
skip -= chunk;
}
sk_peek_offset_fwd(sk, chunk);

if (UNIXCB(skb).fp)
break;

skip = 0;
last = skb;
last_len = skb->len;
unix_state_lock(sk);
Expand Down

0 comments on commit e9193d6

Please sign in to comment.