[binutils-gdb] Fix mkdir_recursive on windows when CWD is root

Ciaran Woodward ciaran@sourceware.org
Tue Feb 25 14:58:54 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f2cc668e2b0c75d8baaf1b754d9a311084508db3

commit f2cc668e2b0c75d8baaf1b754d9a311084508db3
Author: Ciaran Woodward <ciaranwoodward@xmos.com>
Date:   Wed Feb 12 17:57:32 2025 +0000

    Fix mkdir_recursive on windows when CWD is root
    
    On windows, when creating a directory with an absolute path,
    mkdir_recursive would start by trying to make 'C:'.
    
    On windows, this has a special meaning, which is "the current
    directory on the C drive". So the first thing it tries to do
    is create the current directory.
    
    Most of the time, this fails with EEXIST, so the function
    continues as expected. However if the current directory is
    C:/, trying to create that causes EPERM, which causes the
    function to prematurely terminate.
    
    (The same applies for any drive letter.)
    
    This patch resolves this issue, by skipping the drive letter
    so that it is never sent to the mkdir call.
    
    Approved-By: Tom Tromey <tom@tromey.com>

Diff:
---
 gdbsupport/filestuff.cc | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/gdbsupport/filestuff.cc b/gdbsupport/filestuff.cc
index 9e07af28dc2..eb3b3c0aade 100644
--- a/gdbsupport/filestuff.cc
+++ b/gdbsupport/filestuff.cc
@@ -465,6 +465,13 @@ mkdir_recursive (const char *dir)
   char *component_start = start;
   char *component_end = start;
 
+#ifdef WIN32
+  /* If we're making an absolute path on windows, need to skip the drive
+     letter, which is the form 'C:/'.  */
+  if (dir[0] != '\0' && dir[1] == ':' && dir[2] == '/')
+    component_start += 3;
+#endif
+
   while (1)
     {
       /* Find the beginning of the next component.  */


More information about the Gdb-cvs mailing list