Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp539408ybz; Wed, 22 Apr 2020 03:16:02 -0700 (PDT) X-Google-Smtp-Source: APiQypLAUGAWmRLwLoIMzAHC8PiPy+KlJC+279ZYRpPAk2KCp9ThgHQPbpyyRhpVDUKroPjPDUwO X-Received: by 2002:a17:906:4ecb:: with SMTP id i11mr24367409ejv.79.1587550562243; Wed, 22 Apr 2020 03:16:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587550562; cv=none; d=google.com; s=arc-20160816; b=bjyUwfVeCOuDKAaxKd9l0bAexGzsu0FZ5hm279KlA0AqKLst1ugPgW9olwZ0Ioa5B2 5B2R27xRH2kBzTHuuOhwxyqDkn+Tq3RB9a8OrhP/Kdjj8T9yGowjbmyjK2bPZzNc1YU7 qgu+QkRoMeX47A1SoXtsLkXWU2OBzMwBQnCs0adbVqP7HIMyY3yH6FT4x7i3cpzVwRz9 mOuKylzj5STxHMf4Y4LEl7H28mjZP++Z8AAb78kBsVQfEwD5aVwTtNPXCy2iF+35Fm6H OMq9GhFGlWeHAyRLrg76vTHkAC88c+3ucu9zOrPHUzpiZK0g+YMuxeXE3adg3uTnXOJ/ F9Yg== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=5fSAQzpYuiKjSMw1XH0wc8fHvlePytvcPTExsF9NIWI=; b=r3W7uvW7JnHdn1MQvHiC/2Pw5wvW3wcGA38+CPB0tO9CIJoXszQs/u8WgVrcGyAoCJ ozKWDf0WK7tKe2CAyHRzRlceWeFcMkg/WHwS6OJHiUemteL9aEAN75nn5h22EUWdP86d qqwXmSCRG/AGQ26FgZ+RsMo8s2TZ5dz9zd+X4TTjw3MFe3zHtF5MS5N3E4PeTKvJBBty VdNrMEbJc6/GKw7cAGxxbdq4kCND7256YE3oQIOE8at1laBob/sSA9rWs2fJgAygjwKp tvt/daex3NgDAj8z3iFgLMFo8xXV+60jeAjlf3oLAAU7aKGCOPN9aseioXfQUndg4jvY Wl7g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Vcyq16Mj; 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 t9si3305457edj.538.2020.04.22.03.15.38; Wed, 22 Apr 2020 03:16:02 -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=pass header.i=@kernel.org header.s=default header.b=Vcyq16Mj; 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 S1728681AbgDVKLc (ORCPT + 99 others); Wed, 22 Apr 2020 06:11:32 -0400 Received: from mail.kernel.org ([198.145.29.99]:43104 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728519AbgDVKLX (ORCPT ); Wed, 22 Apr 2020 06:11:23 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id EFC4F20575; Wed, 22 Apr 2020 10:11:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587550282; bh=SJKfbcTMFH18rnumuVrFY/CSI7v7IEsH07v35ULM5S0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Vcyq16MjoJcbyGlsZ9uMocatMvEsliFwlbwWESDrk9EwfUM+DNTgpxV7iBCC8NXPy HxsU0NFVwjitRyu4p22cZBKf9VY9ksu5DG15UaWjAOl/l0xp1y39zIDyAt9Zfc4pVT jKDBtom4ae75jWP0JZo0BbAX4pi4pFjEbCauJrDo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Eric Biggers , Andrew Morton , Kees Cook , Jessica Yu , Luis Chamberlain , Alexei Starovoitov , Jeff Vander Stoep , Ben Hutchings , Josh Triplett , Linus Torvalds Subject: [PATCH 4.14 083/199] kmod: make request_module() return an error when autoloading is disabled Date: Wed, 22 Apr 2020 11:56:49 +0200 Message-Id: <20200422095106.398010265@linuxfoundation.org> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200422095057.806111593@linuxfoundation.org> References: <20200422095057.806111593@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Eric Biggers commit d7d27cfc5cf0766a26a8f56868c5ad5434735126 upstream. Patch series "module autoloading fixes and cleanups", v5. This series fixes a bug where request_module() was reporting success to kernel code when module autoloading had been completely disabled via 'echo > /proc/sys/kernel/modprobe'. It also addresses the issues raised on the original thread (https://lkml.kernel.org/lkml/20200310223731.126894-1-ebiggers@kernel.org/T/#u) bydocumenting the modprobe sysctl, adding a self-test for the empty path case, and downgrading a user-reachable WARN_ONCE(). This patch (of 4): It's long been possible to disable kernel module autoloading completely (while still allowing manual module insertion) by setting /proc/sys/kernel/modprobe to the empty string. This can be preferable to setting it to a nonexistent file since it avoids the overhead of an attempted execve(), avoids potential deadlocks, and avoids the call to security_kernel_module_request() and thus on SELinux-based systems eliminates the need to write SELinux rules to dontaudit module_request. However, when module autoloading is disabled in this way, request_module() returns 0. This is broken because callers expect 0 to mean that the module was successfully loaded. Apparently this was never noticed because this method of disabling module autoloading isn't used much, and also most callers don't use the return value of request_module() since it's always necessary to check whether the module registered its functionality or not anyway. But improperly returning 0 can indeed confuse a few callers, for example get_fs_type() in fs/filesystems.c where it causes a WARNING to be hit: if (!fs && (request_module("fs-%.*s", len, name) == 0)) { fs = __get_fs_type(name, len); WARN_ONCE(!fs, "request_module fs-%.*s succeeded, but still no fs?\n", len, name); } This is easily reproduced with: echo > /proc/sys/kernel/modprobe mount -t NONEXISTENT none / It causes: request_module fs-NONEXISTENT succeeded, but still no fs? WARNING: CPU: 1 PID: 1106 at fs/filesystems.c:275 get_fs_type+0xd6/0xf0 [...] This should actually use pr_warn_once() rather than WARN_ONCE(), since it's also user-reachable if userspace immediately unloads the module. Regardless, request_module() should correctly return an error when it fails. So let's make it return -ENOENT, which matches the error when the modprobe binary doesn't exist. I've also sent patches to document and test this case. Signed-off-by: Eric Biggers Signed-off-by: Andrew Morton Reviewed-by: Kees Cook Reviewed-by: Jessica Yu Acked-by: Luis Chamberlain Cc: Alexei Starovoitov Cc: Greg Kroah-Hartman Cc: Jeff Vander Stoep Cc: Ben Hutchings Cc: Josh Triplett Cc: Link: http://lkml.kernel.org/r/20200310223731.126894-1-ebiggers@kernel.org Link: http://lkml.kernel.org/r/20200312202552.241885-1-ebiggers@kernel.org Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- kernel/kmod.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) --- a/kernel/kmod.c +++ b/kernel/kmod.c @@ -120,7 +120,7 @@ out: * invoke it. * * If module auto-loading support is disabled then this function - * becomes a no-operation. + * simply returns -ENOENT. */ int __request_module(bool wait, const char *fmt, ...) { @@ -137,7 +137,7 @@ int __request_module(bool wait, const ch WARN_ON_ONCE(wait && current_is_async()); if (!modprobe_path[0]) - return 0; + return -ENOENT; va_start(args, fmt); ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args);