lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Wed, 14 Jun 2023 18:22:02 +0100
From:   David Howells <dhowells@...hat.com>
To:     syzbot <syzbot+dd1339599f1840e4cc65@...kaller.appspotmail.com>
Cc:     dhowells@...hat.com, bpf@...r.kernel.org, davem@...emloft.net,
        edumazet@...gle.com, kuba@...nel.org, linux-kernel@...r.kernel.org,
        netdev@...r.kernel.org, pabeni@...hat.com,
        syzkaller-bugs@...glegroups.com
Subject: Re: [syzbot] [net?] WARNING in unreserve_psock

#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git main

    kcm: Fix unnecessary psock unreservation.
    
    kcm_write_msgs() calls unreserve_psock() to release its hold on the
    underlying TCP socket if it has run out of things to transmit, but if we
    have nothing in the write queue on entry (e.g. because someone did a
    zero-length sendmsg), we don't actually go into the transmission loop and
    as a consequence don't call reserve_psock().
    
    Fix this by skipping the call to unreserve_psock() if we didn't reserve a
    psock.
    
    Fixes: c31a25e1db48 ("kcm: Send multiple frags in one sendmsg()")
    Reported-by: syzbot+dd1339599f1840e4cc65@...kaller.appspotmail.com
    Link: https://lore.kernel.org/r/000000000000a61ffe05fe0c3d08@google.com/
    Signed-off-by: David Howells <dhowells@...hat.com>
    cc: Tom Herbert <tom@...bertland.com>
    cc: Tom Herbert <tom@...ntonium.net>
    cc: "David S. Miller" <davem@...emloft.net>
    cc: Eric Dumazet <edumazet@...gle.com>
    cc: Jakub Kicinski <kuba@...nel.org>
    cc: Paolo Abeni <pabeni@...hat.com>
    cc: Jens Axboe <axboe@...nel.dk>
    cc: Matthew Wilcox <willy@...radead.org>
    cc: netdev@...r.kernel.org

diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c
index d75d775e9462..d0537c1c8cd7 100644
--- a/net/kcm/kcmsock.c
+++ b/net/kcm/kcmsock.c
@@ -661,6 +661,7 @@ static int kcm_write_msgs(struct kcm_sock *kcm)
 				kcm_abort_tx_psock(psock, ret ? -ret : EPIPE,
 						   true);
 				unreserve_psock(kcm);
+				psock = NULL;
 
 				txm->started_tx = false;
 				kcm_report_tx_retry(kcm);
@@ -696,7 +697,8 @@ static int kcm_write_msgs(struct kcm_sock *kcm)
 	if (!head) {
 		/* Done with all queued messages. */
 		WARN_ON(!skb_queue_empty(&sk->sk_write_queue));
-		unreserve_psock(kcm);
+		if (psock)
+			unreserve_psock(kcm);
 	}
 
 	/* Check if write space is available */

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ