PCI: syscall: Set the ~0 value on access failure
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.
--- drivers/pci/syscall.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/pci/syscall.c +2 -1
@@ -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
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
@@ -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
Bjorn Helgaas
AppliedRe: [PATCH 2/2] PCI: syscall: Change type of err variable from long to int
Quoted 5 lines · Krzysztof Wilczyński
The
pciconfig_readsyscall uses an err variable is currently declared as long and even though it matches the function signature as generated by theSYSCALL_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_writesyscall.Related:
commitef9e4005cbaf("PCI: Align checking of syscall user config accessors")Signed-off-by Krzysztof Wilczyński <[email protected]>
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@@ -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