|
@@ -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;
|
|
@@ -2112,7 +2117,6 @@ unlock:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- skip = sk_peek_offset(sk, flags);
|
|
|
while (skip >= unix_skb_len(skb)) {
|
|
|
skip -= unix_skb_len(skb);
|
|
|
last = skb;
|
|
@@ -2179,14 +2183,12 @@ unlock:
|
|
|
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);
|