[glib: 2/3] gfileutils: Try creating complete path first



commit ca98741251cacf0e70d054b1dac7a17ded120cbb
Author: Robert Nagy <robert openbsd org>
Date:   Mon May 13 18:36:55 2019 +0200

    gfileutils: Try creating complete path first
    
    Try to create the complete path right away and fall back
    to creating all path elements one by one.
    
    This also helps to avoid TOCTTOU problems and avoids walking
    the path all the time, providing a nice performance gain, by
    avoiding syscalls.

 glib/gfileutils.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
---
diff --git a/glib/gfileutils.c b/glib/gfileutils.c
index 8bff0e9c5..16ee66384 100644
--- a/glib/gfileutils.c
+++ b/glib/gfileutils.c
@@ -226,6 +226,20 @@ g_mkdir_with_parents (const gchar *pathname,
       return -1;
     }
 
+  /* try to create the full path first */
+  if (g_mkdir (pathname, mode) == 0)
+    return 0;
+  else if (errno == EEXIST)
+    {
+      if (!g_file_test (pathname, G_FILE_TEST_IS_DIR))
+        {
+          errno = ENOTDIR;
+          return -1;
+        }
+      return 0;
+    }
+
+  /* walk the full path and try creating each element */
   fn = g_strdup (pathname);
 
   if (g_path_is_absolute (fn))


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]