Skip to contentSkip to conversation

PCI: syscall: Set the ~0 value on access failure

PATCH Applied Krzysztof Wilczyński 2 participants 3 messages Jul 29, 2021 – Jul 30, 2021 PCI

lore
Share & tools
lore
#0 lore raw

PATCH 1/2 PCI: syscall: Set the ~0 value on access failure

The pciconfig_read syscall has a special provision to handle users that don't check the return value for a possible error code and rely solely on checking for the value of ~0 to be set as a result of the PCI configuration read failure.

The commit e4585da22ad0 ("pci syscall.c: Switch to refcounting API") changed this semantic of setting the results to the value of ~0 to indicate read error concerning CAP_SYS_ADMIN capability flag validation. After this commit, the syscall would simply return -EPERM early should the user does not have the required permissions. This changes the original behaviour which might not be something that the users of this syscall expect, especially since some of the problematic users do not check the return code whatsoever.

Thus, restore the original behaviour of setting the results to a value of ~0 on read failure to include the capabilities check.

Fixes e4585da22ad0 ("pci syscall.c: Switch to refcounting API")
---
 drivers/pci/syscall.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/pci/syscall.c +2 -1
index 8b003c890b87..b842af1e06b8 100644
@@ -22,8 +22,9 @@ SYSCALL_DEFINE5(pciconfig_read, unsigned long, bus, unsigned long, dfn,
 	long err;
 	int cfg_ret;
 
+	err = -EPERM;
 	if (!capable(CAP_SYS_ADMIN))
-		return -EPERM;
+		goto error;
 
 	err = -ENODEV;
 	dev = pci_get_domain_bus_and_slot(0, bus, dfn);
Signature · 1 line
2.32.0
#1 lore raw

PATCH 2/2 PCI: syscall: Change type of err variable from long to int

The pciconfig_read syscall uses an err variable is currently declared as long and even though it matches the function signature as generated by the SYSCALL_DEFINEx() macro is a bit wasteful as the syscall returns a handful of simple error codes.

Thus, change the err value type from long to int to lower the storage requirements and also align it with the pciconfig_write syscall.

Related:
commit ef9e4005cbaf ("PCI: Align checking of syscall user config accessors")

---
 drivers/pci/syscall.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/pci/syscall.c +1 -2
index b842af1e06b8..525f16caed1d 100644
@@ -19,8 +19,7 @@ SYSCALL_DEFINE5(pciconfig_read, unsigned long, bus, unsigned long, dfn,
 	u8 byte;
 	u16 word;
 	u32 dword;
-	long err;
-	int cfg_ret;
+	int err, cfg_ret;
 
 	err = -EPERM;
 	if (!capable(CAP_SYS_ADMIN))
Signature · 1 line
2.32.0
#2 lore raw

Re: [PATCH 2/2] PCI: syscall: Change type of err variable from long to int

Quoted 5 lines · Krzysztof Wilczyński

The pciconfig_read syscall uses an err variable is currently declared as long and even though it matches the function signature as generated by the SYSCALL_DEFINEx() macro is a bit wasteful as the syscall returns a handful of simple error codes.

Quoted 7 lines

Thus, change the err value type from long to int to lower the storage requirements and also align it with the pciconfig_write syscall.

Related:
commit ef9e4005cbaf ("PCI: Align checking of syscall user config accessors")

Applied both to pci/enumeration for v5.15, thanks!

Quoted 21 lines
---
 drivers/pci/syscall.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/pci/syscall.c +1 -2
index b842af1e06b8..525f16caed1d 100644
@@ -19,8 +19,7 @@ SYSCALL_DEFINE5(pciconfig_read, unsigned long, bus, unsigned long, dfn,
 	u8 byte;
 	u16 word;
 	u32 dword;
-	long err;
-	int cfg_ret;
+	int err, cfg_ret;
 
 	err = -EPERM;
 	if (!capable(CAP_SYS_ADMIN))
Signature · 1 line
2.32.0