From nobody Sat May 28 20:53:16 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 6FAB61B47E17; Sat, 28 May 2022 20:53:16 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4L9YmD2Vl6z4kyw; Sat, 28 May 2022 20:53:16 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1653771196; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=fahgO9EtezCyOaJOMxOP4Mtu5I69O4jJQB0owHbZ2tA=; b=n4uh4t3BfytDP0aB2IsZcrzR4ACoNLt9kYBYcsslyUREcN3YBGgBPrXv25+1VTJg0R76A8 o+JiozVRgJlHBlR/KZqcebFKiWhHRCgN+7/1VEF7lsr93B3mEE0vw6jLL3aL1XTU0MKE99 I/ZgyfXDw+3N/PlhwYza5zjOTliuw4HjKd6y9lubJscQ54ugcN/43aIIi9wd/n+gzffdIs vG6GX9Qh+VNDu+2lVCtRJcwkZElHs8P+bbrd5txp16oBw35RIwH3ZfLRVLaAUVEY0z+uUS W1JwaTwPssPvTsUSiNSlz6JjILaENwOXsmwMVDzqD+RuQnx9a0fNiDuNeTmAEg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 36B5115E5C; Sat, 28 May 2022 20:53:16 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 24SKrGSs099234; Sat, 28 May 2022 20:53:16 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 24SKrGta099233; Sat, 28 May 2022 20:53:16 GMT (envelope-from git) Date: Sat, 28 May 2022 20:53:16 GMT Message-Id: <202205282053.24SKrGta099233@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Dmitry Chagin Subject: git: 3a99aac66f8d - main - linux(4): Check the socket before any others sanity checks List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dchagin X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 3a99aac66f8d12386e8382aaf29d2e82e6b5353b Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1653771196; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=fahgO9EtezCyOaJOMxOP4Mtu5I69O4jJQB0owHbZ2tA=; b=ko1oVKqgnvoVlGHjk7cA5BtMAbFDV0PXQ4oeJF7IFliYaJ5dHzvRexB9dnGtcm4DpYVgqu oGEqX45um9pjfOz1j6cWBk5t7QqrDT/SQKRH5JO4LEpbxO/786P2poID/ux4XPtrMI1fAd vdNAgyNG/IDHYcaHXYHQiIsrHLjkM+O3p7dTVcOdrmPLxH91/Ezd8+7vw6E1Q1ZZOhEKdj Fffop6+uppt/1QWtCSXRm4Uzkdm1WRopBktKJmtGMzt/d4JFxyxqTxdKmLadOAZMRXRx1V XWdI5TH88Sgpfde9vLBWbyxaf2NrAUQC8pt6k+UooAhTkaWzPEx3vv6rTT0a1Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1653771196; a=rsa-sha256; cv=none; b=fyQ5lEDUdLuFEKg4UB9ZQ3qn06ivkPJTfQvp+aImOfaYXOFCXCqQyzEqqPD5aygIxt7y0g 2oPrYx/vC7rhzaczmk76alAOQ0V65u0m+HYDqqdXhUdQz4aPRGMsBZckJDu45oVEX5mCCq UiJDl2XwZ4dcnSARbtXtwKSbCZKvvP3ccDmoaIU4E5VjRwpl9w0+QHu607JZ/YF33HxZHP C7SGqJTwxU6heFxUpXC8B5SHHqN5QVBAM0OFnsY0H8EOclNBg4C4FXFL6zv8cXxyYGhIDA l3a2X7ytPQxrG2EBUh1955ntZexWCkZZed7zFjteJEi7f38/wMkvkptXRBFfmg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=3a99aac66f8d12386e8382aaf29d2e82e6b5353b commit 3a99aac66f8d12386e8382aaf29d2e82e6b5353b Author: Dmitry Chagin AuthorDate: 2022-05-28 20:29:12 +0000 Commit: Dmitry Chagin CommitDate: 2022-05-28 20:29:12 +0000 linux(4): Check the socket before any others sanity checks Strictly speaking, this check is performed by the kern_recvit(), but in the Linux emulation layer before calling the kernel we do other sanity checks and conversions from Linux types to the native types. This changes an order of the error returning that is critical for some buggy Linux applications. For recvmmsg() syscall this fixes a panic in case when the user-supplied vlen value is 0, then error is not initialized and garbage passed to the bsd_to_linux_errno(). MFC after: 2 weeks --- sys/compat/linux/linux_socket.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index b5ec32835981..8aa425bc14c0 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -1731,7 +1731,14 @@ int linux_recvmsg(struct thread *td, struct linux_recvmsg_args *args) { struct msghdr bsd_msg; + struct file *fp; + int error; + error = getsock_cap(td, args->s, &cap_recv_rights, + &fp, NULL, NULL); + if (error != 0) + return (error); + fdrop(fp, td); return (linux_recvmsg_common(td, args->s, PTRIN(args->msg), args->flags, &bsd_msg)); } @@ -1742,9 +1749,14 @@ linux_recvmmsg_common(struct thread *td, l_int s, struct l_mmsghdr *msg, { struct msghdr bsd_msg; struct timespec ts; + struct file *fp; l_uint retval; int error, datagrams; + error = getsock_cap(td, s, &cap_recv_rights, + &fp, NULL, NULL); + if (error != 0) + return (error); datagrams = 0; while (datagrams < vlen) { error = linux_recvmsg_common(td, s, &msg->msg_hdr, @@ -1780,6 +1792,7 @@ linux_recvmmsg_common(struct thread *td, l_int s, struct l_mmsghdr *msg, } if (error == 0) td->td_retval[0] = datagrams; + fdrop(fp, td); return (error); }