smartmontools/6009-os_linux.cpp-Fix-d-megaraid-open-crash-on-missing-pr.patch

63 lines
2.4 KiB
Diff
Raw Normal View History

2019-09-30 11:17:14 -04:00
From f201d3a068d2bbdc36b89d248b521ba2da3ad741 Mon Sep 17 00:00:00 2001
From: chrfranke <authors@smartmontools.org>
Date: Thu, 11 Oct 2018 18:51:35 +0000
Subject: [PATCH 204/291] os_linux.cpp: Fix '-d megaraid' open crash on missing
/proc/devices. There is no /proc/devices on ESXi (see #800) and WSL.
git-svn-id: http://svn.code.sf.net/p/smartmontools/code/trunk@4809 4ea69e1a-61f1-4043-bf83-b5c94c648137
---
smartmontools/ChangeLog | 5 +++++
smartmontools/os_linux.cpp | 34 ++++++++++++++++++----------------
2 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/smartmontools/os_linux.cpp b/smartmontools/os_linux.cpp
index 1a1b0858..9790818a 100644
--- a/smartmontools/os_linux.cpp
+++ b/smartmontools/os_linux.cpp
@@ -1299,24 +1299,26 @@ bool linux_megaraid_device::open()
}
/* Perform mknod of device ioctl node */
FILE * fp = fopen("/proc/devices", "r");
- while (fgets(line, sizeof(line), fp) != NULL) {
- int n1 = 0;
- if (sscanf(line, "%d megaraid_sas_ioctl%n", &mjr, &n1) == 1 && n1 == 22) {
- n1=mknod("/dev/megaraid_sas_ioctl_node", S_IFCHR, makedev(mjr, 0));
- if(report > 0)
- pout("Creating /dev/megaraid_sas_ioctl_node = %d\n", n1 >= 0 ? 0 : errno);
- if (n1 >= 0 || errno == EEXIST)
- break;
- }
- else if (sscanf(line, "%d megadev%n", &mjr, &n1) == 1 && n1 == 11) {
- n1=mknod("/dev/megadev0", S_IFCHR, makedev(mjr, 0));
- if(report > 0)
- pout("Creating /dev/megadev0 = %d\n", n1 >= 0 ? 0 : errno);
- if (n1 >= 0 || errno == EEXIST)
- break;
+ if (fp) {
+ while (fgets(line, sizeof(line), fp) != NULL) {
+ int n1 = 0;
+ if (sscanf(line, "%d megaraid_sas_ioctl%n", &mjr, &n1) == 1 && n1 == 22) {
+ n1=mknod("/dev/megaraid_sas_ioctl_node", S_IFCHR, makedev(mjr, 0));
+ if(report > 0)
+ pout("Creating /dev/megaraid_sas_ioctl_node = %d\n", n1 >= 0 ? 0 : errno);
+ if (n1 >= 0 || errno == EEXIST)
+ break;
+ }
+ else if (sscanf(line, "%d megadev%n", &mjr, &n1) == 1 && n1 == 11) {
+ n1=mknod("/dev/megadev0", S_IFCHR, makedev(mjr, 0));
+ if(report > 0)
+ pout("Creating /dev/megadev0 = %d\n", n1 >= 0 ? 0 : errno);
+ if (n1 >= 0 || errno == EEXIST)
+ break;
+ }
}
+ fclose(fp);
}
- fclose(fp);
/* Open Device IOCTL node */
if ((m_fd = ::open("/dev/megaraid_sas_ioctl_node", O_RDWR)) >= 0) {
--
2.19.1