From f201d3a068d2bbdc36b89d248b521ba2da3ad741 Mon Sep 17 00:00:00 2001 From: chrfranke 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