]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
llc: Return -EINPROGRESS from llc_ui_connect()
authorErnestas Kulik <ernestas.k@iconn-networks.com>
Tue, 21 Apr 2026 06:02:26 +0000 (09:02 +0300)
committerJakub Kicinski <kuba@kernel.org>
Thu, 23 Apr 2026 18:40:39 +0000 (11:40 -0700)
Given a zero sk_sndtimeo, llc_ui_connect() skips waiting for state
change and returns 0, confusing userspace applications that will assume
the socket is connected, making e.g. getpeername() calls error out.

More specifically, the issue was discovered in libcoap, where
newly-added AF_LLC socket support was behaving differently from AF_INET
connections due to EINPROGRESS handling being skipped.

Set rc to -EINPROGRESS if connect() would not block, akin to AF_INET
sockets.

Signed-off-by: Ernestas Kulik <ernestas.k@iconn-networks.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260421060304.285419-1-ernestas.k@iconn-networks.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/llc/af_llc.c

index 59d593bb5d18663217c86a4fc14a9f56205d03a1..1b210db3119e8ecf155f44f4945da5e83bdf013c 100644 (file)
@@ -520,8 +520,10 @@ static int llc_ui_connect(struct socket *sock, struct sockaddr_unsized *uaddr,
        if (sk->sk_state == TCP_SYN_SENT) {
                const long timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
 
-               if (!timeo || !llc_ui_wait_for_conn(sk, timeo))
+               if (!timeo || !llc_ui_wait_for_conn(sk, timeo)) {
+                       rc = -EINPROGRESS;
                        goto out;
+               }
 
                rc = sock_intr_errno(timeo);
                if (signal_pending(current))