teknoraver / rpms / systemd

Forked from rpms/systemd 4 months ago
Clone

Blame 0002-udev-net_id-Only-read-the-first-64-bytes-of-PCI-conf.patch

Zbigniew Jędrzejewski-Szmek 436654
From 4db1a8d691a85aa1f75b7eeb283246f488e47a3b Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 436654
From: "Jason S. McMullan" <jason.mcmullan@gmail.com>
Zbigniew Jędrzejewski-Szmek 436654
Date: Fri, 22 May 2015 20:30:01 +0200
Zbigniew Jędrzejewski-Szmek 436654
Subject: [PATCH] udev/net_id: Only read the first 64 bytes of PCI config space
Zbigniew Jędrzejewski-Szmek 436654
Zbigniew Jędrzejewski-Szmek 436654
The original code used fread(), which on some libc implementions
Zbigniew Jędrzejewski-Szmek 436654
(ie glibc 2.17) would pre-read a full 4K (PAGE_SIZE) of the
Zbigniew Jędrzejewski-Szmek 436654
PCI config space, when only 64 bytes were requested.
Zbigniew Jędrzejewski-Szmek 436654
Zbigniew Jędrzejewski-Szmek 436654
I have recently come across PCIe hardware which responds with
Zbigniew Jędrzejewski-Szmek 436654
Completion Timeouts when accesses above 256 bytes are attempted.
Zbigniew Jędrzejewski-Szmek 436654
Zbigniew Jędrzejewski-Szmek 436654
This can cause server systems with GHES/AEPI support to cause
Zbigniew Jędrzejewski-Szmek 436654
and immediate kernel panic due to the failed PCI transaction.
Zbigniew Jędrzejewski-Szmek 436654
Zbigniew Jędrzejewski-Szmek 436654
This change replaces the buffered fread() with an explict
Zbigniew Jędrzejewski-Szmek 436654
unbuffered read() of 64 bytes, which corrects this issue by
Zbigniew Jędrzejewski-Szmek 436654
only reading the guaranteed first 64 bytes of PCIe config space.
Zbigniew Jędrzejewski-Szmek 436654
Zbigniew Jędrzejewski-Szmek 436654
(cherry picked from commit 0454229c100a2113ba82df55703436d6cb2c492b)
Zbigniew Jędrzejewski-Szmek 436654
---
Zbigniew Jędrzejewski-Szmek 436654
 src/udev/udev-builtin-net_id.c | 9 +++++----
Zbigniew Jędrzejewski-Szmek 436654
 1 file changed, 5 insertions(+), 4 deletions(-)
Zbigniew Jędrzejewski-Szmek 436654
Zbigniew Jędrzejewski-Szmek 436654
diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
Zbigniew Jędrzejewski-Szmek 436654
index 78aef206b2..448920507a 100644
Zbigniew Jędrzejewski-Szmek 436654
--- a/src/udev/udev-builtin-net_id.c
Zbigniew Jędrzejewski-Szmek 436654
+++ b/src/udev/udev-builtin-net_id.c
Zbigniew Jędrzejewski-Szmek 436654
@@ -91,6 +91,7 @@
Zbigniew Jędrzejewski-Szmek 436654
 #include <stdlib.h>
Zbigniew Jędrzejewski-Szmek 436654
 #include <stdarg.h>
Zbigniew Jędrzejewski-Szmek 436654
 #include <unistd.h>
Zbigniew Jędrzejewski-Szmek 436654
+#include <fcntl.h>
Zbigniew Jędrzejewski-Szmek 436654
 #include <string.h>
Zbigniew Jędrzejewski-Szmek 436654
 #include <errno.h>
Zbigniew Jędrzejewski-Szmek 436654
 #include <net/if.h>
Zbigniew Jędrzejewski-Szmek 436654
@@ -166,15 +167,15 @@ static int dev_pci_onboard(struct udev_device *dev, struct netnames *names) {
Zbigniew Jędrzejewski-Szmek 436654
 
Zbigniew Jędrzejewski-Szmek 436654
 /* read the 256 bytes PCI configuration space to check the multi-function bit */
Zbigniew Jędrzejewski-Szmek 436654
 static bool is_pci_multifunction(struct udev_device *dev) {
Zbigniew Jędrzejewski-Szmek 436654
-        _cleanup_fclose_ FILE *f = NULL;
Zbigniew Jędrzejewski-Szmek 436654
+        _cleanup_close_ int fd = -1;
Zbigniew Jędrzejewski-Szmek 436654
         const char *filename;
Zbigniew Jędrzejewski-Szmek 436654
         uint8_t config[64];
Zbigniew Jędrzejewski-Szmek 436654
 
Zbigniew Jędrzejewski-Szmek 436654
         filename = strjoina(udev_device_get_syspath(dev), "/config");
Zbigniew Jędrzejewski-Szmek 436654
-        f = fopen(filename, "re");
Zbigniew Jędrzejewski-Szmek 436654
-        if (!f)
Zbigniew Jędrzejewski-Szmek 436654
+        fd = open(filename, O_RDONLY | O_CLOEXEC);
Zbigniew Jędrzejewski-Szmek 436654
+        if (fd < 0)
Zbigniew Jędrzejewski-Szmek 436654
                 return false;
Zbigniew Jędrzejewski-Szmek 436654
-        if (fread(&config, sizeof(config), 1, f) != 1)
Zbigniew Jędrzejewski-Szmek 436654
+        if (read(fd, &config, sizeof(config)) != sizeof(config))
Zbigniew Jędrzejewski-Szmek 436654
                 return false;
Zbigniew Jędrzejewski-Szmek 436654
 
Zbigniew Jędrzejewski-Szmek 436654
         /* bit 0-6 header type, bit 7 multi/single function device */