From patchwork Tue Jul 6 01:06:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Krzysztof_Wilczy=C5=84ski?= X-Patchwork-Id: 12359669 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 10AF9C07E99 for ; Tue, 6 Jul 2021 01:06:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E4A306196C for ; Tue, 6 Jul 2021 01:06:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229773AbhGFBJD (ORCPT ); Mon, 5 Jul 2021 21:09:03 -0400 Received: from mail-wr1-f54.google.com ([209.85.221.54]:40884 "EHLO mail-wr1-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229722AbhGFBJC (ORCPT ); Mon, 5 Jul 2021 21:09:02 -0400 Received: by mail-wr1-f54.google.com with SMTP id l5so7238307wrv.7 for ; Mon, 05 Jul 2021 18:06:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=bGeSwqA1PGXcdIOF0QAiLqEJhbJ0OkQQxp/nfQHOIqY=; b=OYP3oaakbLGt5d96vuoLiXNSjgL9UUXm57ghMj3KUUYOw8v56NyOsvVa3u6UNF5Mt8 AlbRD3mQ9A16jrRqkAKGjxUmCww+Xo5rCC1reH9y9gsL+1xTlbo2PJozad3XAHZuvmBW Z0HccCl85AY2wG+0R4R0uYqES1EFqpLmFUnb6hTAatq7Akh9x0CaAOFIm8dbbegaV8dd na6Zc3LmPXrMcjpAMY5l5m8yO58pBXKuuD7stTEyCw+yafpa6HBKfYgkK1YkcPmgvM+K 64Kb7no/i5PaBowsG0M01LBWGtotJSzGFEYMjWyqucaF/61l6aXZ/OzNT6iqhMfU5iNl nerA== X-Gm-Message-State: AOAM531knCy05JRz7OvpsU21PwjBhGMK1CXa1EZ+1fswNyk8+pkIsW9z Qh4iMwYkQcpEVTPArEdYRLU= X-Google-Smtp-Source: ABdhPJzu+bvTv2ETAmmA8H/698dPtkwc+wD9tZ9AfXts1Srn6oiDegxVlnRzKu4dhvG2ov+0cXFpWw== X-Received: by 2002:a5d:638b:: with SMTP id p11mr18656371wru.380.1625533583857; Mon, 05 Jul 2021 18:06:23 -0700 (PDT) Received: from workstation.lan ([95.155.85.46]) by smtp.gmail.com with ESMTPSA id m12sm13379418wms.24.2021.07.05.18.06.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jul 2021 18:06:23 -0700 (PDT) From: =?utf-8?q?Krzysztof_Wilczy=C5=84ski?= To: Bjorn Helgaas Cc: Lorenzo Pieralisi , Kishon Vijay Abraham I , linux-pci@vger.kernel.org Subject: [PATCH v2 1/4] PCI/sysfs: Move to kstrtobool() to handle user input Date: Tue, 6 Jul 2021 01:06:19 +0000 Message-Id: <20210706010622.3058968-1-kw@linux.com> X-Mailer: git-send-email 2.32.0 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org A common use case for many PCI sysfs objects is to either enable some functionality or trigger an action following a write to a given attribute where the value is written would be simply either "1" or "0" synonymous with either disabling or enabling something. Parsing and validation of the input values are currently done using the kstrtoul() function to convert anything in the string buffer into an integer value - anything non-zero would be accepted as "enable" and zero simply as "disable". For a while now, the kernel offers another function called kstrtobool() which was created to parse common user inputs into a boolean value, so that a range of values such as "y", "n", "1", "0", "on" and "off" handled in a case-insensitive manner would yield a boolean true or false result accordingly after the input string has been parsed. Thus, move to kstrtobool() over kstrtoul() as it's a better fit for parsing user input, and it also implicitly offers a range check as only a finite amount of possible input values will be considered as valid. Related: commit d0f1fed29e6e ("Add a strtobool function matching semantics of existing in kernel equivalents") commit ef951599074b ("lib: move strtobool() to kstrtobool()") commit a81a5a17d44b ("lib: add "on"/"off" support to kstrtobool") commit 1404297ebf76 ("lib: update single-char callers of strtobool()") Signed-off-by: Krzysztof Wilczyński --- drivers/pci/pci-sysfs.c | 97 ++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 50 deletions(-) diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index beb8d1f4fafe..0f98c4843764 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -63,13 +63,13 @@ static ssize_t broken_parity_status_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { + bool enable; struct pci_dev *pdev = to_pci_dev(dev); - unsigned long val; - if (kstrtoul(buf, 0, &val) < 0) + if (kstrtobool(buf, &enable) < 0) return -EINVAL; - pdev->broken_parity_status = !!val; + pdev->broken_parity_status = enable; return count; } @@ -271,12 +271,12 @@ static DEVICE_ATTR_RO(modalias); static ssize_t enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { + bool enable; struct pci_dev *pdev = to_pci_dev(dev); - unsigned long val; - ssize_t result = kstrtoul(buf, 0, &val); + ssize_t result = 0; - if (result < 0) - return result; + if (kstrtobool(buf, &enable) < 0) + return -EINVAL; /* this can crash the machine when done on the "wrong" device */ if (!capable(CAP_SYS_ADMIN)) @@ -285,7 +285,7 @@ static ssize_t enable_store(struct device *dev, struct device_attribute *attr, device_lock(dev); if (dev->driver) result = -EBUSY; - else if (val) + else if (enable) result = pci_enable_device(pdev); else if (pci_is_enabled(pdev)) pci_disable_device(pdev); @@ -311,15 +311,14 @@ static ssize_t numa_node_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { + int node; struct pci_dev *pdev = to_pci_dev(dev); - int node, ret; if (!capable(CAP_SYS_ADMIN)) return -EPERM; - ret = kstrtoint(buf, 0, &node); - if (ret) - return ret; + if (kstrtoint(buf, 0, &node) < 0) + return -EINVAL; if ((node < 0 && node != NUMA_NO_NODE) || node >= MAX_NUMNODES) return -EINVAL; @@ -374,11 +373,11 @@ static ssize_t msi_bus_show(struct device *dev, struct device_attribute *attr, static ssize_t msi_bus_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { + bool enable; struct pci_dev *pdev = to_pci_dev(dev); struct pci_bus *subordinate = pdev->subordinate; - unsigned long val; - if (kstrtoul(buf, 0, &val) < 0) + if (kstrtobool(buf, &enable) < 0) return -EINVAL; if (!capable(CAP_SYS_ADMIN)) @@ -390,32 +389,32 @@ static ssize_t msi_bus_store(struct device *dev, struct device_attribute *attr, * already requested MSI or MSI-X. */ if (!subordinate) { - pdev->no_msi = !val; + pdev->no_msi = !enable; pci_info(pdev, "MSI/MSI-X %s for future drivers\n", - val ? "allowed" : "disallowed"); + enable ? "allowed" : "disallowed"); return count; } - if (val) + if (enable) subordinate->bus_flags &= ~PCI_BUS_FLAGS_NO_MSI; else subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI; dev_info(&subordinate->dev, "MSI/MSI-X %s for future drivers of devices on this bus\n", - val ? "allowed" : "disallowed"); + enable ? "allowed" : "disallowed"); return count; } static DEVICE_ATTR_RW(msi_bus); static ssize_t rescan_store(struct bus_type *bus, const char *buf, size_t count) { - unsigned long val; + bool rescan; struct pci_bus *b = NULL; - if (kstrtoul(buf, 0, &val) < 0) + if (kstrtobool(buf, &rescan) < 0) return -EINVAL; - if (val) { + if (rescan) { pci_lock_rescan_remove(); while ((b = pci_find_next_bus(b)) != NULL) pci_rescan_bus(b); @@ -443,13 +442,13 @@ static ssize_t dev_rescan_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - unsigned long val; + bool rescan; struct pci_dev *pdev = to_pci_dev(dev); - if (kstrtoul(buf, 0, &val) < 0) + if (kstrtobool(buf, &rescan) < 0) return -EINVAL; - if (val) { + if (rescan) { pci_lock_rescan_remove(); pci_rescan_bus(pdev->bus); pci_unlock_rescan_remove(); @@ -462,12 +461,12 @@ static struct device_attribute dev_attr_dev_rescan = __ATTR(rescan, 0200, NULL, static ssize_t remove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - unsigned long val; + bool remove; - if (kstrtoul(buf, 0, &val) < 0) + if (kstrtobool(buf, &remove) < 0) return -EINVAL; - if (val && device_remove_file_self(dev, attr)) + if (remove && device_remove_file_self(dev, attr)) pci_stop_and_remove_bus_device_locked(to_pci_dev(dev)); return count; } @@ -478,13 +477,13 @@ static ssize_t bus_rescan_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - unsigned long val; + bool rescan; struct pci_bus *bus = to_pci_bus(dev); - if (kstrtoul(buf, 0, &val) < 0) + if (kstrtobool(buf, &rescan) < 0) return -EINVAL; - if (val) { + if (rescan) { pci_lock_rescan_remove(); if (!pci_is_root_bus(bus) && list_empty(&bus->devices)) pci_rescan_bus_bridge_resize(bus->self); @@ -502,14 +501,14 @@ static ssize_t d3cold_allowed_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { + bool allowed; struct pci_dev *pdev = to_pci_dev(dev); - unsigned long val; - if (kstrtoul(buf, 0, &val) < 0) + if (kstrtobool(buf, &allowed) < 0) return -EINVAL; - pdev->d3cold_allowed = !!val; - if (pdev->d3cold_allowed) + pdev->d3cold_allowed = allowed; + if (allowed) pci_d3cold_enable(pdev); else pci_d3cold_disable(pdev); @@ -1257,12 +1256,13 @@ static ssize_t pci_write_rom(struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf, loff_t off, size_t count) { + bool enable; struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj)); - if ((off == 0) && (*buf == '0') && (count == 2)) - pdev->rom_attr_enabled = 0; - else - pdev->rom_attr_enabled = 1; + if (kstrtobool(buf, &enable) < 0) + return -EINVAL; + + pdev->rom_attr_enabled = enable; return count; } @@ -1337,23 +1337,20 @@ static const struct attribute_group pci_dev_rom_attr_group = { static ssize_t reset_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { + bool reset; struct pci_dev *pdev = to_pci_dev(dev); - unsigned long val; - ssize_t result = kstrtoul(buf, 0, &val); - - if (result < 0) - return result; + ssize_t result = 0; - if (val != 1) + if (kstrtobool(buf, &reset) < 0) return -EINVAL; - pm_runtime_get_sync(dev); - result = pci_reset_function(pdev); - pm_runtime_put(dev); - if (result < 0) - return result; + if (reset) { + pm_runtime_get_sync(dev); + result = pci_reset_function(pdev); + pm_runtime_put(dev); + } - return count; + return result < 0 ? result : count; } static DEVICE_ATTR_WO(reset); From patchwork Tue Jul 6 01:06:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Krzysztof_Wilczy=C5=84ski?= X-Patchwork-Id: 12359671 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C7B20C07E99 for ; Tue, 6 Jul 2021 01:06:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A52216196C for ; Tue, 6 Jul 2021 01:06:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229722AbhGFBJD (ORCPT ); Mon, 5 Jul 2021 21:09:03 -0400 Received: from mail-wr1-f54.google.com ([209.85.221.54]:41788 "EHLO mail-wr1-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229753AbhGFBJD (ORCPT ); Mon, 5 Jul 2021 21:09:03 -0400 Received: by mail-wr1-f54.google.com with SMTP id u8so23956518wrq.8 for ; Mon, 05 Jul 2021 18:06:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=AAt2/9fsX8msYKcUtaCFzrmkaM3hAZjJLNAanXNK3v4=; b=EF/JzakONreT6F/dLDtZ3HebP/QNk2f/eRSnJNMitA2O+O65Q9Pkyc7jKjQbBuCylh yn/m29WhooKPITyrQtXBucjiJaG67RcrNsjFrq6jejwFKsWC0gi9UXqSf4vH35OHaYnO 24xzrlN7eMw9OeDn18FKQPH3vH8JvzXLvXsyqOvoYg3k3EKUThBqG+rMEFK51Pr+iMXC 1ic8t5rKzmTHwh14a6bExS2hiTRavVgvXkpxHOg9lib7+uawn9AJd/olOmdViZxkUTl/ 9/QJzV5csKjdUSD7y5XH+FOajDK239UOV42B0z+lv5myzFKLVmDSFWEU46aEEEH/wmLc X7OA== X-Gm-Message-State: AOAM532MmGl44H9ZPmtnTVyWjt3DtptOppAuH9zhBV5B56K74SFJc6zR xuA4zJOPlbjQY8o8ZNfiysQ= X-Google-Smtp-Source: ABdhPJyB5uRbyrgCQ8HHumPxTdwQWDi30dLZloF8VoL7Hk1WgvKffYPggolbnLfCigN9HsE0raocqw== X-Received: by 2002:a5d:508b:: with SMTP id a11mr18100207wrt.280.1625533584782; Mon, 05 Jul 2021 18:06:24 -0700 (PDT) Received: from workstation.lan ([95.155.85.46]) by smtp.gmail.com with ESMTPSA id m12sm13379418wms.24.2021.07.05.18.06.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jul 2021 18:06:24 -0700 (PDT) From: =?utf-8?q?Krzysztof_Wilczy=C5=84ski?= To: Bjorn Helgaas Cc: Lorenzo Pieralisi , Kishon Vijay Abraham I , linux-pci@vger.kernel.org Subject: [PATCH v2 2/4] PCI/sysfs: Check CAP_SYS_ADMIN before parsing user input Date: Tue, 6 Jul 2021 01:06:20 +0000 Message-Id: <20210706010622.3058968-2-kw@linux.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210706010622.3058968-1-kw@linux.com> References: <20210706010622.3058968-1-kw@linux.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Check if the "CAP_SYS_ADMIN" capability flag is set before parsing user input as it makes more sense to first check whether the current user actually has the right permissions before accepting any input from such user. This will also make order in which enable_store() and msi_bus_store() perform the "CAP_SYS_ADMIN" capability check consistent with other PCI-related sysfs objects that first verify whether user has this capability set. Signed-off-by: Krzysztof Wilczyński --- drivers/pci/pci-sysfs.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 0f98c4843764..bc4c141e4c1c 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -275,13 +275,13 @@ static ssize_t enable_store(struct device *dev, struct device_attribute *attr, struct pci_dev *pdev = to_pci_dev(dev); ssize_t result = 0; - if (kstrtobool(buf, &enable) < 0) - return -EINVAL; - /* this can crash the machine when done on the "wrong" device */ if (!capable(CAP_SYS_ADMIN)) return -EPERM; + if (kstrtobool(buf, &enable) < 0) + return -EINVAL; + device_lock(dev); if (dev->driver) result = -EBUSY; @@ -377,12 +377,12 @@ static ssize_t msi_bus_store(struct device *dev, struct device_attribute *attr, struct pci_dev *pdev = to_pci_dev(dev); struct pci_bus *subordinate = pdev->subordinate; - if (kstrtobool(buf, &enable) < 0) - return -EINVAL; - if (!capable(CAP_SYS_ADMIN)) return -EPERM; + if (kstrtobool(buf, &enable) < 0) + return -EINVAL; + /* * "no_msi" and "bus_flags" only affect what happens when a driver * requests MSI or MSI-X. They don't affect any drivers that have From patchwork Tue Jul 6 01:06:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Krzysztof_Wilczy=C5=84ski?= X-Patchwork-Id: 12359675 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8B848C07E99 for ; Tue, 6 Jul 2021 01:06:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 716EA6196C for ; Tue, 6 Jul 2021 01:06:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229753AbhGFBJI (ORCPT ); Mon, 5 Jul 2021 21:09:08 -0400 Received: from mail-wr1-f53.google.com ([209.85.221.53]:33694 "EHLO mail-wr1-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229740AbhGFBJH (ORCPT ); Mon, 5 Jul 2021 21:09:07 -0400 Received: by mail-wr1-f53.google.com with SMTP id d2so356898wrn.0 for ; Mon, 05 Jul 2021 18:06:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=G5l5HS8HtMP4QvlUzB+iBOyLd9yEm79Z8nrFxj2kFU4=; b=Ukd/ir6OOcsidttaRcavIpKBc0CNwIRD+owDnCUWbYRuXZVEix2mngSzC2KF2If5Rd TNuOvbxlHDD6JTCGhA0BPdKIBm4nOQ9yuU6hSBwTstwBiUlvuBAyldrySuOYsXPYjcHs oXbaIWK5yq7Vz8B9LRY8X4wGKRJ7t6SGaj6Viv69QJqa7wduwQ0O286L0EcK36u0EZ3O 2FeoB1Dq2O5v2fx3x6bN4ozdYPfrtXE5u18p7PMk9Oow3+sYZ8tD4cLZcMugsOj3cPdh Pt+jJz5e6axfs5jRVxAGzRA8+t9GsaRmBcW35xV2ttVKsx9yw1gWsXxv++epjUG/P63M TVxw== X-Gm-Message-State: AOAM532wu9dMVHjJElQduaZGYBZIFS0pRqc7xRamYFwzLJFUv62DPHTs llBPGtPjonK5QKWayeptolc= X-Google-Smtp-Source: ABdhPJx3FFxbFtI9nA8A2lslQNhRQkYIyPM2LYSde7h/vG1w6nhu/BnMbCK3YtnxTlVP5RYLq4LSmQ== X-Received: by 2002:a05:6000:180f:: with SMTP id m15mr18617401wrh.388.1625533585712; Mon, 05 Jul 2021 18:06:25 -0700 (PDT) Received: from workstation.lan ([95.155.85.46]) by smtp.gmail.com with ESMTPSA id m12sm13379418wms.24.2021.07.05.18.06.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jul 2021 18:06:25 -0700 (PDT) From: =?utf-8?q?Krzysztof_Wilczy=C5=84ski?= To: Bjorn Helgaas Cc: Lorenzo Pieralisi , Kishon Vijay Abraham I , linux-pci@vger.kernel.org Subject: [PATCH v2 3/4] PCI/sysfs: Return -EINVAL consistently from "store" functions Date: Tue, 6 Jul 2021 01:06:21 +0000 Message-Id: <20210706010622.3058968-3-kw@linux.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210706010622.3058968-1-kw@linux.com> References: <20210706010622.3058968-1-kw@linux.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org At the moment, most of the "store" functions that handle input from the userspace via the sysfs objects commonly returns the -EINVAL error code should the value provided fail validation and/or type conversion. This error code is a clear message to the userspace that the provided value is not a valid input. However, some of the "show" functions return the error code as-is as returned from the helper functions used to parse the input value, and in which case the error code can be either -EINVAL or -ERANGE. The former would often be a return from the kstrtobool() function and the latter will most likely be originating from other kstr*() functions family such as e.g., kstrtou8(), kstrtou32(), etc. The -EINVAL is commonly returned as the error code to indicate that the value provided is invalid, and the -ERANGE code is not very useful in the userspace, thus normalize the return error code to be -EINVAL for when the validation and/or type conversion fails. Signed-off-by: Krzysztof Wilczyński --- Changes in v2: Make sure that "ret" variables are correctly initialised in functions sriov_vf_msix_count_store() and sriov_numvfs_store(). drivers/pci/endpoint/functions/pci-epf-ntb.c | 18 ++++------ drivers/pci/endpoint/pci-ep-cfs.c | 35 +++++++------------- drivers/pci/iov.c | 14 ++++---- 3 files changed, 24 insertions(+), 43 deletions(-) diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c index bce274d02dcf..c5a9cfa4c4a4 100644 --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c @@ -1928,11 +1928,9 @@ static ssize_t epf_ntb_##_name##_store(struct config_item *item, \ struct config_group *group = to_config_group(item); \ struct epf_ntb *ntb = to_epf_ntb(group); \ u32 val; \ - int ret; \ \ - ret = kstrtou32(page, 0, &val); \ - if (ret) \ - return ret; \ + if (kstrtou32(page, 0, &val) < 0) \ + return -EINVAL; \ \ ntb->_name = val; \ \ @@ -1961,11 +1959,9 @@ static ssize_t epf_ntb_##_name##_store(struct config_item *item, \ struct device *dev = &ntb->epf->dev; \ int win_no; \ u64 val; \ - int ret; \ \ - ret = kstrtou64(page, 0, &val); \ - if (ret) \ - return ret; \ + if (kstrtou64(page, 0, &val) < 0) \ + return -EINVAL; \ \ if (sscanf(#_name, "mw%d", &win_no) != 1) \ return -EINVAL; \ @@ -1986,11 +1982,9 @@ static ssize_t epf_ntb_num_mws_store(struct config_item *item, struct config_group *group = to_config_group(item); struct epf_ntb *ntb = to_epf_ntb(group); u32 val; - int ret; - ret = kstrtou32(page, 0, &val); - if (ret) - return ret; + if (kstrtou32(page, 0, &val) < 0) + return -EINVAL; if (val > MAX_MW) return -EINVAL; diff --git a/drivers/pci/endpoint/pci-ep-cfs.c b/drivers/pci/endpoint/pci-ep-cfs.c index f3a8b833b479..c77459048ef7 100644 --- a/drivers/pci/endpoint/pci-ep-cfs.c +++ b/drivers/pci/endpoint/pci-ep-cfs.c @@ -175,9 +175,8 @@ static ssize_t pci_epc_start_store(struct config_item *item, const char *page, epc = epc_group->epc; - ret = kstrtobool(page, &start); - if (ret) - return ret; + if (kstrtobool(page, &start) < 0) + return -EINVAL; if (!start) { pci_epc_stop(epc); @@ -329,13 +328,11 @@ static ssize_t pci_epf_##_name##_store(struct config_item *item, \ const char *page, size_t len) \ { \ u32 val; \ - int ret; \ struct pci_epf *epf = to_pci_epf_group(item)->epf; \ if (WARN_ON_ONCE(!epf->header)) \ return -EINVAL; \ - ret = kstrtou32(page, 0, &val); \ - if (ret) \ - return ret; \ + if (kstrtou32(page, 0, &val) < 0) \ + return -EINVAL; \ epf->header->_name = val; \ return len; \ } @@ -345,13 +342,11 @@ static ssize_t pci_epf_##_name##_store(struct config_item *item, \ const char *page, size_t len) \ { \ u16 val; \ - int ret; \ struct pci_epf *epf = to_pci_epf_group(item)->epf; \ if (WARN_ON_ONCE(!epf->header)) \ return -EINVAL; \ - ret = kstrtou16(page, 0, &val); \ - if (ret) \ - return ret; \ + if (kstrtou16(page, 0, &val) < 0) \ + return -EINVAL; \ epf->header->_name = val; \ return len; \ } @@ -361,13 +356,11 @@ static ssize_t pci_epf_##_name##_store(struct config_item *item, \ const char *page, size_t len) \ { \ u8 val; \ - int ret; \ struct pci_epf *epf = to_pci_epf_group(item)->epf; \ if (WARN_ON_ONCE(!epf->header)) \ return -EINVAL; \ - ret = kstrtou8(page, 0, &val); \ - if (ret) \ - return ret; \ + if (kstrtou8(page, 0, &val) < 0) \ + return -EINVAL; \ epf->header->_name = val; \ return len; \ } @@ -376,11 +369,9 @@ static ssize_t pci_epf_msi_interrupts_store(struct config_item *item, const char *page, size_t len) { u8 val; - int ret; - ret = kstrtou8(page, 0, &val); - if (ret) - return ret; + if (kstrtou8(page, 0, &val) < 0) + return -EINVAL; to_pci_epf_group(item)->epf->msi_interrupts = val; @@ -398,11 +389,9 @@ static ssize_t pci_epf_msix_interrupts_store(struct config_item *item, const char *page, size_t len) { u16 val; - int ret; - ret = kstrtou16(page, 0, &val); - if (ret) - return ret; + if (kstrtou16(page, 0, &val) < 0) + return -EINVAL; to_pci_epf_group(item)->epf->msix_interrupts = val; diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index afc06e6ce115..b4b5e66be92d 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -183,11 +183,10 @@ static ssize_t sriov_vf_msix_count_store(struct device *dev, { struct pci_dev *vf_dev = to_pci_dev(dev); struct pci_dev *pdev = pci_physfn(vf_dev); - int val, ret; + int val, ret = 0; - ret = kstrtoint(buf, 0, &val); - if (ret) - return ret; + if (kstrtoint(buf, 0, &val) < 0) + return -EINVAL; if (val < 0) return -EINVAL; @@ -376,12 +375,11 @@ static ssize_t sriov_numvfs_store(struct device *dev, const char *buf, size_t count) { struct pci_dev *pdev = to_pci_dev(dev); - int ret; + int ret = 0; u16 num_vfs; - ret = kstrtou16(buf, 0, &num_vfs); - if (ret < 0) - return ret; + if (kstrtou16(buf, 0, &num_vfs) < 0) + return -EINVAL; if (num_vfs > pci_sriov_get_totalvfs(pdev)) return -ERANGE; From patchwork Tue Jul 6 01:06:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Krzysztof_Wilczy=C5=84ski?= X-Patchwork-Id: 12359673 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 071ECC07E99 for ; Tue, 6 Jul 2021 01:06:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DDF406196C for ; Tue, 6 Jul 2021 01:06:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229734AbhGFBJI (ORCPT ); Mon, 5 Jul 2021 21:09:08 -0400 Received: from mail-wm1-f45.google.com ([209.85.128.45]:42664 "EHLO mail-wm1-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229753AbhGFBJH (ORCPT ); Mon, 5 Jul 2021 21:09:07 -0400 Received: by mail-wm1-f45.google.com with SMTP id j16-20020a05600c1c10b0290204b096b0caso1045792wms.1 for ; Mon, 05 Jul 2021 18:06:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Z25jV3Lc+Jaa1XrFF2O29mwDomdRuLImlWbMu42JCcw=; b=VRcR+dU34ddDdYVV8oaKpwy9Vo2eul8I8vtdXOPP1ziHrFQaY5XBx+Pn+bK4chjdEk 0KWdDTO0nn4KkaqdHJxqAkzs34tqpkicB3BuGLWmapV5QdmOtm4N21HxTTpWX84Hp5YT qs2zj933MoRMTbuxFpUPLIdvUON88jQaN48fXUxLuhi412YZ0j3zghNVJexIGU+FG9u6 3wF4/+jF7oQV1dkkhQ1zFvuCXytOEQ+H9hplMHL/EDDHfvVP9Rh2NGoQAiJBJwC2Ol+o pOuEINFJV/ZKmCxbfAiZG0/oUQgMOavhRUYsi7o2pAzVjaL9AmTtzVwsjCLBG8uskG+m M1Qw== X-Gm-Message-State: AOAM530Dei0B+QcjY7x6zUCU2Ll7W7kCZqBsWAaqsGqRMzsn+9URFUj1 V3zDt+If9KeWTzEA6TWVeyU= X-Google-Smtp-Source: ABdhPJy29D/kapi3QBnrARt5PTsnp6mp0ODbE04H5cqA4Uradm7R5k9/obJSnSSJOWT/oEHqBvXtiQ== X-Received: by 2002:a05:600c:2288:: with SMTP id 8mr1719528wmf.96.1625533586616; Mon, 05 Jul 2021 18:06:26 -0700 (PDT) Received: from workstation.lan ([95.155.85.46]) by smtp.gmail.com with ESMTPSA id m12sm13379418wms.24.2021.07.05.18.06.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jul 2021 18:06:26 -0700 (PDT) From: =?utf-8?q?Krzysztof_Wilczy=C5=84ski?= To: Bjorn Helgaas Cc: Lorenzo Pieralisi , Kishon Vijay Abraham I , linux-pci@vger.kernel.org Subject: [PATCH v2 4/4] PCI: Don't use the strtobool() wrapper for kstrtobool() Date: Tue, 6 Jul 2021 01:06:22 +0000 Message-Id: <20210706010622.3058968-4-kw@linux.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210706010622.3058968-1-kw@linux.com> References: <20210706010622.3058968-1-kw@linux.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org The strtobool() function is a wrapper over the kstrtobool() function that has been added for backward compatibility. There is no reason to use the old API, thus rather than using the wrapper use the kstrtobool() directly. Related: commit ef951599074b ("lib: move strtobool() to kstrtobool()") Signed-off-by: Krzysztof Wilczyński --- drivers/pci/p2pdma.c | 6 +++--- drivers/pci/pcie/aspm.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c index 196382630363..1bd299cf3872 100644 --- a/drivers/pci/p2pdma.c +++ b/drivers/pci/p2pdma.c @@ -911,7 +911,7 @@ EXPORT_SYMBOL_GPL(pci_p2pdma_unmap_sg_attrs); * * Parses an attribute value to decide whether to enable p2pdma. * The value can select a PCI device (using its full BDF device - * name) or a boolean (in any format strtobool() accepts). A false + * name) or a boolean (in any format kstrtobool() accepts). A false * value disables p2pdma, a true value expects the caller * to automatically find a compatible device and specifying a PCI device * expects the caller to use the specific provider. @@ -943,11 +943,11 @@ int pci_p2pdma_enable_store(const char *page, struct pci_dev **p2p_dev, } else if ((page[0] == '0' || page[0] == '1') && !iscntrl(page[1])) { /* * If the user enters a PCI device that doesn't exist - * like "0000:01:00.1", we don't want strtobool to think + * like "0000:01:00.1", we don't want kstrtobool to think * it's a '0' when it's clearly not what the user wanted. * So we require 0's and 1's to be exactly one character. */ - } else if (!strtobool(page, use_p2pdma)) { + } else if (!kstrtobool(page, use_p2pdma)) { return 0; } diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index ac0557a305af..ba8b17000d94 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -1219,7 +1219,7 @@ static ssize_t aspm_attr_store_common(struct device *dev, struct pcie_link_state *link = pcie_aspm_get_link(pdev); bool state_enable; - if (strtobool(buf, &state_enable) < 0) + if (kstrtobool(buf, &state_enable) < 0) return -EINVAL; down_read(&pci_bus_sem); @@ -1276,7 +1276,7 @@ static ssize_t clkpm_store(struct device *dev, struct pcie_link_state *link = pcie_aspm_get_link(pdev); bool state_enable; - if (strtobool(buf, &state_enable) < 0) + if (kstrtobool(buf, &state_enable) < 0) return -EINVAL; down_read(&pci_bus_sem);