From: Pali Rohár Date: Fri, 18 Nov 2022 22:40:39 +0000 (+0100) Subject: libpci: windows: Handle long paths generated by GetModuleFileName() X-Git-Tag: v3.10.0~14^2~1 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=64d7bab6f27418199d244481664255b24c7ffc20;p=pciutils.git libpci: windows: Handle long paths generated by GetModuleFileName() C function fopen() implemented by msvcrt.dll requires special prefix "\\\\?\\" for paths longer than 260 bytes. Because GetModuleFileName() returns absolute path, it may be longer than 260 bytes. Add fixup to handle long paths. --- diff --git a/lib/init.c b/lib/init.c index a310cc5..4d28a2e 100644 --- a/lib/init.c +++ b/lib/init.c @@ -336,9 +336,16 @@ retry: * directory, hence something completely different. So prepend missing * "\\\\?\\" prefix to make path valid again. * Reproduce: CreateProcessW("\\??\\UNC\\10.0.2.4\\qemu\\lspci.exe", ...) + * + * If path starts with DOS drive letter and with appended PCI_IDS is + * longer than 260 bytes and is without "\\\\?\\" prefix then append it. + * This prefix is required for paths and file names with DOS drive letter + * longer than 260 bytes. */ if (strncmp(path, "\\UNC\\", 5) == 0 || - strncmp(path, "UNC\\", 4) == 0) + strncmp(path, "UNC\\", 4) == 0 || + (((path[0] >= 'a' && path[0] <= 'z') || (path[0] >= 'A' && path[0] <= 'Z')) && + len + sizeof(PCI_IDS) >= 260)) { memmove(path+4, path, len); memcpy(path, "\\\\?\\", 4);