From 3e87db234389271c91b9d8f707aa101ded52199a Mon Sep 17 00:00:00 2001 From: chrfranke <chrfranke@4ea69e1a-61f1-4043-bf83-b5c94c648137> Date: Sat, 21 Oct 2006 14:19:51 +0000 Subject: [PATCH] Improved parsing of device names sdX, pdN and tapeN, trailing garbage now detected. git-svn-id: https://smartmontools.svn.sourceforge.net/svnroot/smartmontools/trunk@2294 4ea69e1a-61f1-4043-bf83-b5c94c648137 --- sm5/os_win32.cpp | 53 ++++++++++++++++++++---------------------------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/sm5/os_win32.cpp b/sm5/os_win32.cpp index bf7b77769..fb00951dc 100644 --- a/sm5/os_win32.cpp +++ b/sm5/os_win32.cpp @@ -46,7 +46,7 @@ extern int64_t bytes; // malloc() byte count // Needed by '-V' option (CVS versioning) of smartd/smartctl -const char *os_XXXX_c_cvsid="$Id: os_win32.cpp,v 1.46 2006/10/20 21:56:03 chrfranke Exp $" +const char *os_XXXX_c_cvsid="$Id: os_win32.cpp,v 1.47 2006/10/21 14:19:51 chrfranke Exp $" ATACMDS_H_CVSID CONFIG_H_CVSID EXTERN_H_CVSID INT64_H_CVSID SCSICMDS_H_CVSID UTILITY_H_CVSID; @@ -256,18 +256,17 @@ int make_device_names (char*** devlist, const char* type) // within this file (see os_freebsd.cpp for an example). int deviceopen(const char * pathname, char *type) { - int len; pathname = skipdev(pathname); - len = strlen(pathname); + int len = strlen(pathname); if (!strcmp(type, "ATA")) { - // hd[a-j](:[saic]+)? => ATA 0-9 with options + // hd[a-j](:[saicp]+)? => ATA 0-9 with options char drive[1+1] = "", options[5+1] = ""; int n1 = -1, n2 = -1; if ( sscanf(pathname, "hd%1[a-j]%n:%5[saicp]%n", drive, &n1, options, &n2) >= 1 - && ((n1 == len && !options[0]) || n2 == len) ) { + && ((n1 == len && !options[0]) || n2 == len) ) { return ata_open(drive[0] - 'a', options, -1); } - // hd[a-j],N => Physical drive 0-9, RAID port N + // hd[a-j],N(:[saicp]+)? => Physical drive 0-9, RAID port N, with options drive[0] = 0; options[0] = 0; n1 = -1; n2 = -1; unsigned port = ~0; if ( sscanf(pathname, "hd%1[a-j],%u%n:%5[saicp]%n", drive, &port, &n1, options, &n2) >= 2 @@ -275,35 +274,27 @@ int deviceopen(const char * pathname, char *type) return ata_open(drive[0] - 'a', options, port); } } else if (!strcmp(type, "SCSI")) { - char letter; - int pd_num, tape_num, sub_addr, res; - - // scsi[0-9][0-f] => SCSI Adapter 0-9, ID 0-15, LUN 0 - unsigned adapter = ~0, id = ~0; int n = -1; - if (sscanf(pathname,"scsi%1u%1x%n", &adapter, &id, &n) == 2 && n == len) { + // scsi[0-9][0-f] => ASPI Adapter 0-9, ID 0-15, LUN 0 + unsigned adapter = ~0, id = ~0; int n1 = -1; + if (sscanf(pathname,"scsi%1u%1x%n", &adapter, &id, &n1) == 2 && n1 == len) { return aspi_open(adapter, id); } // sd[a-z],N => Physical drive 0-26, RAID port N - if (0 == strncmp("sd", pathname, 2)) { - letter = ' '; - res = sscanf(pathname, "sd%c,%d", &letter, &sub_addr); - pd_num = letter - 'a'; - if ((2 == res) && (pd_num >= 0) && (sub_addr >= 0)) - return spt_open(pd_num, -1, sub_addr); - if ((1 == res) && (pd_num >= 0)) - return spt_open(pd_num, -1, -1); + char drive[1+1] = ""; int sub_addr = -1; n1 = -1; int n2 = -1; + if ( sscanf(pathname, "sd%1[a-z]%n,%d%n", drive, &n1, &sub_addr, &n2) >= 1 + && ((n1 == len && sub_addr == -1) || (n2 == len && sub_addr >= 0)) ) { + return spt_open(drive[0] - 'a', -1, sub_addr); + } // pd<m>,N => Physical drive <m>, RAID port N - } else if (0 == strncmp("pd", pathname, 2)) { - res = sscanf(pathname, "pd%d,%d", &pd_num, &sub_addr); - if ((2 == res) && (pd_num >= 0) && (sub_addr >= 0)) - return spt_open(pd_num, -1, sub_addr); - if ((1 == res) && (pd_num >= 0)) - return spt_open(pd_num, -1, -1); + int pd_num = -1; sub_addr = -1; n1 = -1; n2 = -1; + if ( sscanf(pathname, "pd%d%n,%d%n", &pd_num, &n1, &sub_addr, &n2) >= 1 + && pd_num >= 0 && ((n1 == len && sub_addr == -1) || (n2 == len && sub_addr >= 0))) { + return spt_open(pd_num, -1, sub_addr); + } // tape<m> => tape drive <m> - } else if (0 == strncmp("tape", pathname, 4)) { - res = sscanf(pathname, "tape%d", &tape_num); - if ((1 == res) && (tape_num >= 0)) - return spt_open(-1, tape_num, -1); + int tape_num = -1; n1 = -1; + if (sscanf(pathname, "tape%d%n", &tape_num, &n1) == 1 && tape_num >= 0 && n1 == len) { + return spt_open(-1, tape_num, -1); } } @@ -1012,7 +1003,7 @@ static int ata_via_3ware_miniport_ioctl(HANDLE hdevice, IDEREGS * regs, char * d } sb; ASSERT_SIZEOF(sb, sizeof(SRB_IO_CONTROL)+sizeof(IDEREGS)+512); - if (!(0 <= datasize && datasize <= sizeof(sb.buffer) && port >= 0)) { + if (!(0 <= datasize && datasize <= (int)sizeof(sb.buffer) && port >= 0)) { errno = EINVAL; return -1; } -- GitLab