[binutils-gdb] Fix another path length problem opening files on Win32 systems.
Nick Clifton
nickc@sourceware.org
Thu Jan 7 12:05:48 GMT 2021
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=17d60030ae57fb53f5977fa6928d7d5006f42881
commit 17d60030ae57fb53f5977fa6928d7d5006f42881
Author: Nick Clifton <nickc@redhat.com>
Date: Thu Jan 7 12:04:15 2021 +0000
Fix another path length problem opening files on Win32 systems.
PR 25713
* bfdio.c (_bfd_real_fopen): For Win32 convert relative paths to
absolute paths and check to see if they are longer than MAX_PATH.
Diff:
---
bfd/ChangeLog | 6 ++++++
bfd/bfdio.c | 23 +++++++++++++++++++++--
2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 75fb3a5f5a1..ec3ab0a1f75 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2021-01-07 Nick Clifton <nickc@redhat.com>
+
+ PR 25713
+ * bfdio.c (_bfd_real_fopen): For Win32 convert relative paths to
+ absolute paths and check to see if they are longer than MAX_PATH.
+
2021-01-07 Philipp Tomsich <prt@gnu.org>
* elfxx-riscv.c (riscv_std_z_ext_strtab): Added zihintpause.
diff --git a/bfd/bfdio.c b/bfd/bfdio.c
index 1b3e13ea3a7..463b3879c52 100644
--- a/bfd/bfdio.c
+++ b/bfd/bfdio.c
@@ -116,14 +116,33 @@ _bfd_real_fopen (const char *filename, const char *modes)
}
#elif defined (_WIN32)
- size_t filelen = strlen (filename) + 1;
+ size_t filelen;
+
+ /* PR 25713: Handle extra long path names.
+ For relative paths, convert them to absolute, in case that version is too long. */
+ if (! IS_ABSOLUTE_PATH (filename) && (strstr (filename, ".o") != NULL))
+ {
+ char cwd[1024];
+
+ getcwd (cwd, sizeof (cwd));
+ filelen = strlen (cwd) + 1;
+ strncat (cwd, "\\", sizeof (cwd) - filelen);
+ ++ filelen;
+ strncat (cwd, filename, sizeof (cwd) - filelen);
+
+ filename = cwd;
+ }
+
+ filelen = strlen (filename) + 1;
if (filelen > MAX_PATH - 1)
{
FILE * file;
- char * fullpath = (char *) malloc (filelen + 8);
+ char * fullpath;
int i;
+ fullpath = (char *) malloc (filelen + 8);
+
/* Add a Microsoft recommended prefix that
will allow the extra-long path to work. */
strcpy (fullpath, "\\\\?\\");
More information about the Binutils-cvs
mailing list