From nobody Wed Jun 17 05:16:05 2026 Received: from mail-ua1-f46.google.com (mail-ua1-f46.google.com [209.85.222.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BC7EC2F12C5 for ; Tue, 28 Apr 2026 05:23:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=209.85.222.46 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777353818; cv=pass; b=aLQkk47N8aSPT8ZD7iS+LhtUNNfNBo3rFGYC5lBh5o/dKBOPVKPZ857mCs0PXu7bLBbnr8kQmdrrAaEObXSKOzHXhTv8PHgHNd5DZVcqhg2l2+0zsTEC57fHxdEx0XmbNA6/QWx+opxdCEl8/PsK2nn6YVoaUyCQ0qg4LmErd5Q= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777353818; c=relaxed/simple; bh=uajCEi49W2h0HvEuTqtnXBGCBBSENxiSGia3jyoNuCg=; h=From:MIME-Version:Date:Message-ID:Subject:To:Cc:Content-Type; b=fTqqUAaJSKVJWUE6qxLH2y6bSculp1ImCnLazySEa3R0CpOGy0Ei4+1pndJ2KiK3rOJXwPP+odYH15ZEwvQs6QtEAhCjnyKylLvK2Qj7xGs0yQL5FZnCvgZUX5om0nIJ54DB6TfzvsvZ4dMfN5choH8GHlP0C0oteaFR/SmNG/w= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=malat.biz; spf=none smtp.mailfrom=malat.biz; dkim=pass (2048-bit key) header.d=malat-biz.20251104.gappssmtp.com header.i=@malat-biz.20251104.gappssmtp.com header.b=CAKoDJv+; arc=pass smtp.client-ip=209.85.222.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=malat.biz Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=malat.biz Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=malat-biz.20251104.gappssmtp.com header.i=@malat-biz.20251104.gappssmtp.com header.b="CAKoDJv+" Received: by mail-ua1-f46.google.com with SMTP id a1e0cc1a2514c-953ac1602f8so7135685241.1 for ; Mon, 27 Apr 2026 22:23:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1777353815; cv=none; d=google.com; s=arc-20240605; b=GGNs//Zz/glO0l7rxYOgiAiUsExeF9hmmHdKKUej31o9giEHHmDZWwd5/wU2T32/ss fR9iz/+Xao+yEMu16MgMjoelcbA3GFl5OZReDTerHlpIJKzHW7rAAOvMjz0yBq0PG0br UYaDSgU2iyWVV/0QrDdYqPIOIpYo4PjJHxPCShEhUWKjfldR1yrVDG14F4k5C0KxpCE+ ZQRw7iP9nnXumRrFzCIbeCxBP1kJ3gTF3aHhoKnAAaQ3PdJWmHqKdVad66q56qdgruQX d2UqvURXjLsV+3fxJrigteb5qjpwh3qrfoB+cuEom/04OJlcV9Jd9in+4igADLc5m8Eu lj3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:mime-version:from:dkim-signature; bh=qv9GGMzP087RibmUlugnFmVc/vUOGPhG1CWzpjoEmjk=; fh=Cq55+r7GRI8xss/770vwMyMqZ6YXpkSCDd/TCMyUDBQ=; b=JMOPjvUEsmi1T+ohW3Bhrmu77abc4QFts2IL3YyWWai643kEnwr3uCGqSdil1rQJCa bGdHEckaoTRjYUNbnI/F+lmmwxlOxb94sdfoAXm8u9cOhWW9wo13Tqrz0fjSEdKLkliz ti9Rdah9ROvDC6UDeegxOFxQ1ZfMfX1+Hbj5sb8u6KEqrUCUQMWiv7Hlc9bvVB/LncBm aHBfTmdUWqLUi+P+DlkdR6LlGGIonK11oTIK+M6mfBsxMcP+8FFsqQj8E6jK/4a1wItf dMt7ZVC0yYAwrQz4AvYwet9aPO4iO6X6v1C8u3wr1NprK4mFY4U4LWefhXgJlOX+ibF5 vr1Q==; darn=vger.kernel.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=malat-biz.20251104.gappssmtp.com; s=20251104; t=1777353815; x=1777958615; darn=vger.kernel.org; h=cc:to:subject:message-id:date:mime-version:from:from:to:cc:subject :date:message-id:reply-to; bh=qv9GGMzP087RibmUlugnFmVc/vUOGPhG1CWzpjoEmjk=; b=CAKoDJv+lczM/xjMp9ntPyTsPnytxGD9ds4/OjcEyZkx0k3BdAqgybK7bmlGpOX2Uo otqF7NyG7KWR+pUYwnq+WPkf99IsFQV0F4c3GOkFnSxIRMgE5+TUsdYyPXDwux39BUjI RFskbh/54Ba+oxGtmE+lD1UFetHPd4e0rkCDYHXyuSIO0B6Luu8Cs07rQqHtemm1J3MU ku+B/CrOwbk8yLEOvtFtaMmrep/uYzVAXY1IiZCBIiG6b03zzDNsZf9cUZTYlsNVNcZa 5eIiw8H89kCa7UlhNWXsstp6DVigvriKnENYuKoDrF907uvyCgInQEojUjMCKhmb0HAB bN7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777353815; x=1777958615; h=cc:to:subject:message-id:date:mime-version:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=qv9GGMzP087RibmUlugnFmVc/vUOGPhG1CWzpjoEmjk=; b=B2UXHxDtaH8BheOQwIS563tJ4sj1qXRKuLmQ1YQY8Ugv932GzD+7dHRrhxO4hMYqSA OFL4WZ7ImrMMVXOZBZ8NYb+uuEqDHyuF+RAjUSmTICeD06wbEVBFfKB8mYJwMLMmh/Zt vSDySpvxXYREUqZWkB1+J7a7oK1u5HndSB9fEG6DuF2PaNbavridkT0sYSaFrN2uUj7z jcKbwJDBOVQ9HH1MsUQ/jvSp1EAvYCDUoA7Plk/1YiKxIc2/O2hdQODyqJ+UoCbNtnWH 4RzChIkzyDC3rslQ8ydWHCkvvETk3SohKzeY8G15uEq7fifNkEPYgzoTglUCY1iWw5Zj oCzw== X-Forwarded-Encrypted: i=1; AFNElJ8q5dXEE8vP8n65y+V/nF+5KdUGzlhfAy7J2SC3yMPGpUwi9clY72dKPAGJ9hvpv/DEUciyZn+vOOKSmc0=@vger.kernel.org X-Gm-Message-State: AOJu0YwrJ8Mymao5NMYoNlW6lULS2kqeu6H7VZjtlDZeNeELg3FN2dOR 5zWBw+OCFHiub0BW2hEGdPxUT4fe4Zt9MgUt0FLC0Owwk3PitW2uluVULGptIzVQe3DUWHJ4zLU wA1SCj8o5oZYYEj2r7nJE2k90C8+P8pkk9t+NfR8G4NE5HmuHOww= X-Gm-Gg: AeBDiev1JZQXk0REpwEdejSj2e7IAqxOwVSwBVcGUG1V10PEGbEYlo5KnIhMo8yeNFD cz2Fxw0quzQcVQySGlsInCZNmiaCA8JdFBhYZ/fi1RXeZvFYoGA8ANm57UoQGjpGbaf8g/IXO4C eVktvE5Yvp/GaWXnN8tacS/CdMLXxE82/sD9Bcy/0+DyLbkUDKUaQvxT5XX2fOGm96mumKMjEKP ITl+FD9ZiVMp6DtjNrnZ8FCZg5EBkXwylYqsDNkMazSZJ5XVv0G8jLWQ0IhnQEXO5XUIK24xlhD XjYz0oxsE4Ma1hdRlg== X-Received: by 2002:a05:6102:f83:b0:5fd:eacf:27df with SMTP id ada2fe7eead31-6280720b3f6mr501659137.10.1777353815543; Mon, 27 Apr 2026 22:23:35 -0700 (PDT) Received: from 753933720722 named unknown by gmailapi.google.com with HTTPREST; Mon, 27 Apr 2026 22:23:33 -0700 Received: from 753933720722 named unknown by gmailapi.google.com with HTTPREST; Mon, 27 Apr 2026 22:23:33 -0700 From: Petr Malat X-Mailer: git-send-email 2.47.3 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Date: Mon, 27 Apr 2026 22:23:33 -0700 X-Gm-Features: AVHnY4JN5qqSjHJColGZxCF2Ql4mCiCtCmhkouhZmiKr2RG1FWucysWVZaWZoe4 Message-ID: Subject: [PATCH] net: datagram: Drain queue before reporting EOF or ENOTCONN To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, ebiggers@google.com, Petr Malat Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If a packet is queued and RCV_SHUTDOWN flag is set after the function __skb_wait_for_more_packets() checked the queue, the function returns EOF, which is then propagated by __unix_dgram_recvmsg() and the user reads EOF although there is a message or messages still pending. The function should check if the queue is empty before returning EOF. As the same is true for disconnect and it's also reasonable for a pending signal, check in a common place before returning from the function. Signed-off-by: Petr Malat --- net/core/datagram.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/net/core/datagram.c b/net/core/datagram.c index c285c6465923..5952950f7233 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c @@ -98,40 +98,44 @@ int __skb_wait_for_more_packets(struct sock *sk, struct sk_buff_head *queue, /* Socket errors? */ error =3D sock_error(sk); if (error) - goto out_err; + goto out; if (READ_ONCE(queue->prev) !=3D skb) goto out; /* Socket shut down? */ - if (sk->sk_shutdown & RCV_SHUTDOWN) - goto out_noerr; + if (sk->sk_shutdown & RCV_SHUTDOWN) { + error =3D 1; + goto check_queue; + } /* Sequenced packets can come disconnected. * If so we report the problem */ - error =3D -ENOTCONN; if (connection_based(sk) && - !(sk->sk_state =3D=3D TCP_ESTABLISHED || sk->sk_state =3D=3D TCP_LIST= EN)) - goto out_err; + !(sk->sk_state =3D=3D TCP_ESTABLISHED || sk->sk_state =3D=3D TCP_LIST= EN)) { + error =3D -ENOTCONN; + goto check_queue; + } /* handle signals */ - if (signal_pending(current)) - goto interrupted; + if (signal_pending(current)) { + error =3D sock_intr_errno(*timeo_p); + goto check_queue; + } - error =3D 0; *timeo_p =3D schedule_timeout(*timeo_p); out: + *err =3D error < 0 ? error : 0; finish_wait(sk_sleep(sk), &wait); return error; -interrupted: - error =3D sock_intr_errno(*timeo_p); -out_err: - *err =3D error; - goto out; -out_noerr: - *err =3D 0; - error =3D 1; +check_queue: + /* A packet may have arrived between the initial queue check and any + * of the early-exit conditions above. Return 0 to let the caller + * drain the queue before acting on the shutdown / disconnect / signal. + */ + if (READ_ONCE(queue->prev) !=3D skb) + error =3D 0; goto out; } EXPORT_SYMBOL(__skb_wait_for_more_packets); --=20 2.47.3