Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp528069ybz; Fri, 1 May 2020 03:43:00 -0700 (PDT) X-Google-Smtp-Source: APiQypLuDU0Y9YvT9P/qG062PDJGs1GFuK4jZkL20LkKTx/0WkGsj3hqXhIVcKvwO2M+NiOixClI X-Received: by 2002:a17:906:6a84:: with SMTP id p4mr2694396ejr.21.1588329780475; Fri, 01 May 2020 03:43:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588329780; cv=none; d=google.com; s=arc-20160816; b=FarrgqDyoDvfc4l4liyqRKgYZ7ecJvrDQVjuYXU2Uglg3TJwj5a6OmXpUtRnSs04yT umqYzm1f32dsUTdUHbjn2VBFt+2znSk51xwhpdHnp39HjMt5/Gvk3Q9rbF1hn9cGq8i7 cdirBLdZSWnxY5sZE3evBYzkmgqToy/LFJW/KccBVs1g+Kx17lyIP/IfLWBU/HU4Im7Y kQOMNiXj80Hw9+d3yPG/EhX9XtTlm4IWFuG8pp7AIgHoYrH/qjAwFSugrkHVGXR9qOlb RPpOJman/AVir8xkyodxjic+Dub8fUL6mYbTlEIObvyWhynwkRWFtRYVBS2Id2wdevm+ LMHQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=fIab+kvSHvWldEaksOi58PY4axrTcwshKa/iccnwt70=; b=Pyt3VfVn356vW4VJFAJBtOBjxmdiea9lgxgBKf5WIXjYBRsqKj7jHPajtnA4G6Jrn+ 665U3q9Z0JonpaScqlGVrKqzbga0KFgNWAn6DtHl7HY0NC2hqR/nhfMWA60sPRC5YPsD W1t/uX2d80v9JwNL/gXzVAE9QIAbLvWUw9I7FbWnOUmQSPRbdoYAARLQymP/rwG4R7pF JiTy4QAhtrvPODG4oKUXEIWlA15rcXcAUVYcOZZlJHjBu9kbtlLR/DNJi2N/ukJps03Y LQNUC9u+KgMHbUXmBF6uA1OplOjbhKPLuD1ncX9a7mZVvephYs1AAyD3vZh5f+DKUJCR oEBg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=JMUIcCeb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bz17si1460449ejc.528.2020.05.01.03.42.37; Fri, 01 May 2020 03:43:00 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=JMUIcCeb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728604AbgEAKlO (ORCPT + 99 others); Fri, 1 May 2020 06:41:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52468 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1728119AbgEAKlN (ORCPT ); Fri, 1 May 2020 06:41:13 -0400 Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 42382C08E859; Fri, 1 May 2020 03:41:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=fIab+kvSHvWldEaksOi58PY4axrTcwshKa/iccnwt70=; b=JMUIcCebvCFzuJYPe0WDF9UNvG vGVT9KMOIVrtcTVQIn+xKPAMS0PMMg55zuGultoXjy3AFKFpgOCOWWmf8Vfq6GI9Dx+378ExkkV74 VeJWVeOxedxrZl7GGHohzOfsq0RdRaT/NqdVrKr8yqgSXFLf9fYKl6QrWL07aziOFEVygmb1KWyWP WHDPAkF7scUNX58obdg+1x1ASQ5rtYmACDRjPKMlQceO6XJcV/HNq7pwcHaxOpKlukI8sYno0dsZg pZKf95K6IaIOn189UFpfYaqZaFCplKG6CkACtQaLfnxjm3zAke+fIE8Btyl8cmQEFstb2agzY0WSA 3APt/E9g==; Received: from [2001:4bb8:18c:10bd:c70:4a89:bc61:2] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jUT6W-0008EC-9l; Fri, 01 May 2020 10:41:12 +0000 From: Christoph Hellwig To: Alexander Viro , Andrew Morton Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/2] exec: open code copy_string_kernel Date: Fri, 1 May 2020 12:41:05 +0200 Message-Id: <20200501104105.2621149-3-hch@lst.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200501104105.2621149-1-hch@lst.de> References: <20200501104105.2621149-1-hch@lst.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently copy_string_kernel is just a wrapper around copy_strings that simplifies the calling conventions and uses set_fs to allow passing a kernel pointer. But due to the fact the we only need to handle a single kernel argument pointer, the logic can be sigificantly simplified while getting rid of the set_fs. Signed-off-by: Christoph Hellwig --- fs/exec.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/fs/exec.c b/fs/exec.c index b2a77d5acedef..ea90af1fb2368 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -592,17 +592,42 @@ static int copy_strings(int argc, struct user_arg_ptr argv, */ int copy_string_kernel(const char *arg, struct linux_binprm *bprm) { - int r; - mm_segment_t oldfs = get_fs(); - struct user_arg_ptr argv = { - .ptr.native = (const char __user *const __user *)&arg, - }; + int len = strnlen(arg, MAX_ARG_STRLEN) + 1 /* terminating NUL */; + unsigned long pos = bprm->p; + + if (len == 0) + return -EFAULT; + if (!valid_arg_len(bprm, len)) + return -E2BIG; + + /* We're going to work our way backwards. */ + arg += len; + bprm->p -= len; + if (IS_ENABLED(CONFIG_MMU) && bprm->p < bprm->argmin) + return -E2BIG; + + while (len > 0) { + unsigned int bytes_to_copy = min_t(unsigned int, len, + min_not_zero(offset_in_page(pos), PAGE_SIZE)); + struct page *page; + char *kaddr; - set_fs(KERNEL_DS); - r = copy_strings(1, argv, bprm); - set_fs(oldfs); + pos -= bytes_to_copy; + arg -= bytes_to_copy; + len -= bytes_to_copy; - return r; + page = get_arg_page(bprm, pos, 1); + if (!page) + return -E2BIG; + kaddr = kmap_atomic(page); + flush_arg_page(bprm, pos & PAGE_MASK, page); + memcpy(kaddr + offset_in_page(pos), arg, bytes_to_copy); + flush_kernel_dcache_page(page); + kunmap_atomic(kaddr); + put_arg_page(page); + } + + return 0; } EXPORT_SYMBOL(copy_string_kernel); -- 2.26.2