powerpc-utils/SOURCES/powerpc-utils-1.3.9-sanitize-devspec-output.patch

63 lines
2.3 KiB
Diff
Raw Normal View History

2022-05-17 10:27:17 +00:00
commit d8408b429ff022ff446ac2607bc26eaf60627658
Author: Tyrel Datwyler <tyreld@linux.ibm.com>
Date: Mon Jan 10 16:55:58 2022 -0500
errinjct: sanitize devspec output of a newline if one is present
Linux Kernel Commit: 14c19b2a40b6 ("PCI/sysfs: Add 'devspec' newline")
introduced a newline character at the end of the devspec result which
historically did not have one before. When a newline is present the
errinjct utility constructs an invalid pathname for a PCI devices /reg
property in the device tree. As a result the tool fails to provide a
valid config address to RTAS resulting in a (-3) Parameter Error.
errinjct eeh -v -f 6 -s net/eth1 -a 0xe0800000 -m 0xff800000
errinjct: Could not open file /proc/device-tree//pci@800000020000154/ethernet@0,1
/reg, No such file or directory
Injecting an ioa-bus-error with the following data:
BUS ADDR: e0800000
ADDR MASK: ff800000
CONFIG ADDR: 1
PHB UNIT_ID: 800000020000154
FUNCTION: 6
Store to PCI Memory Address Space - inject an Address Parity Error
errinjct: RTAS error injection failed!
errinjct: RTAS: ioa-bus-error: Argument error (-3)
Fix this issue by nul terminating the devspec output string at the newline
if present.
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
diff --git a/src/errinjct/ioa_bus_error.c b/src/errinjct/ioa_bus_error.c
index 281b56b..fc38037 100644
--- a/src/errinjct/ioa_bus_error.c
+++ b/src/errinjct/ioa_bus_error.c
@@ -232,7 +232,7 @@ static int parse_sysfsname(void)
{
char path[BUFSZ];
char *devspec;
- char *at;
+ char *at, *nl;
uint32_t addr;
uint64_t phb_id;
@@ -247,6 +247,14 @@ static int parse_sysfsname(void)
if (!devspec)
return 1;
+ /* Linux Kernel Commit: 14c19b2a40b6 ("PCI/sysfs: Add 'devspec' newline")
+ * began reporting the devspec value for pci devices with a trailing newline.
+ * Remove the newline if present to ensure our built pathname for obtaining
+ * the config address is valid. */
+ nl = strchr(devspec, '\n');
+ if (nl)
+ *nl = '\0';
+
/* Now we parse something like /pci@400000000112/pci@2/ethernet@1 for
* BUID HI =4000 and LOW 00000112 */
at = strchr(devspec, '@');