[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