af_unix: return data from multiple SKBs on recv() with MSG_PEEK flag
[firefly-linux-kernel-4.4.55.git] / net / unix / af_unix.c
index 123c16419cbe91581fb5435ce39c9436d3c5a2e6..825c029bf0927e78ed520aa701850bcc6a92c37f 100644 (file)
@@ -2063,8 +2063,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);