From 17d60030ae57fb53f5977fa6928d7d5006f42881 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 7 Jan 2021 12:04:15 +0000 Subject: [PATCH] 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. --- 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 + + 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 * 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, "\\\\?\\"); -- 2.30.2