Fix TOCTOU issues 76/240076/2
authorDaehyeon Jung <darrenh.jung@samsung.com>
Mon, 3 Aug 2020 06:14:50 +0000 (15:14 +0900)
committerDaehyeon Jung <darrenh.jung@samsung.com>
Thu, 13 Aug 2020 04:47:36 +0000 (13:47 +0900)
Change-Id: I5932271916b9a8c9f2da34ef1fa9c2dc1dc3b572
Signed-off-by: Daehyeon Jung <darrenh.jung@samsung.com>
xdgmime/src/xdgmime.c
xdgmime/src/xdgmimecache.c
xdgmime/src/xdgmimeglobs2.c

index 9e0e5e7..f898cc1 100644 (file)
@@ -533,6 +533,7 @@ xdg_mime_get_mime_type_for_file (const char  *file_name,
   struct stat buf;
   const char *base_name;
   int n;
+  int fd;
 
   if (file_name == NULL)
     return NULL;
@@ -550,9 +551,17 @@ xdg_mime_get_mime_type_for_file (const char  *file_name,
   if (n == 1)
     return mime_types[0];
 
+  file = fopen (file_name, "r");
+  if (file == NULL)
+    {
+      free (data);
+      return XDG_MIME_TYPE_UNKNOWN;
+    }
+
   if (!statbuf)
     {
-      if (stat (file_name, &buf) != 0)
+      fd = fileno(file);
+      if (fstat (fd, &buf) != 0)
        return XDG_MIME_TYPE_UNKNOWN;
 
       statbuf = &buf;
@@ -569,13 +578,6 @@ xdg_mime_get_mime_type_for_file (const char  *file_name,
   if (data == NULL)
     return XDG_MIME_TYPE_UNKNOWN;
         
-  file = fopen (file_name, "r");
-  if (file == NULL)
-    {
-      free (data);
-      return XDG_MIME_TYPE_UNKNOWN;
-    }
-
   bytes_read = fread (data, 1, max_extent, file);
   if (ferror (file))
     {
index ddcb90c..dd52f21 100644 (file)
@@ -729,6 +729,7 @@ _xdg_mime_cache_get_mime_type_for_file (const char  *file_name,
   struct stat buf;
   const char *base_name;
   int n;
+  int fd;
 
   if (file_name == NULL)
     return NULL;
@@ -742,9 +743,17 @@ _xdg_mime_cache_get_mime_type_for_file (const char  *file_name,
   if (n == 1)
     return mime_types[0];
 
+  file = fopen (file_name, "r");
+  if (file == NULL)
+    {
+      free (data);
+      return XDG_MIME_TYPE_UNKNOWN;
+    }
+
   if (!statbuf)
     {
-      if (stat (file_name, &buf) != 0)
+      fd = fileno(file);
+      if (fstat (fd, &buf) != 0)
        return XDG_MIME_TYPE_UNKNOWN;
 
       statbuf = &buf;
@@ -760,13 +769,6 @@ _xdg_mime_cache_get_mime_type_for_file (const char  *file_name,
   data = malloc (max_extent);
   if (data == NULL)
     return XDG_MIME_TYPE_UNKNOWN;
-        
-  file = fopen (file_name, "r");
-  if (file == NULL)
-    {
-      free (data);
-      return XDG_MIME_TYPE_UNKNOWN;
-    }
 
   bytes_read = fread (data, 1, max_extent, file);
   if (ferror (file))
index 0bd61e8..65d3c8f 100644 (file)
@@ -225,13 +225,19 @@ mime_type_info_list_reload(mime_type_info_list *mtil)
        FILE *globs2 = NULL;
        struct stat globs2_stat;
        int r;
+       int fd;
        char buf[256];
 
        if(!mtil) return;
 
+       /* read globs2, and construct data structure */
+       globs2 = fopen(GLOBS2_PATH, "r");
+       if (!globs2) return;
+
        /* Check glob2's mtime.
         * If reconstruction is not needed, just exit function */
-       if( stat(GLOBS2_PATH, &globs2_stat) ||
+       fd = fileno(globs2);
+       if (fstat(fd, &globs2_stat) ||
                        globs2_stat.st_mtime <= mtil->globs2_mtime ) return;
 
        /* clean old mtil */
@@ -246,10 +252,6 @@ mime_type_info_list_reload(mime_type_info_list *mtil)
        /* save globs2's mtime */
        mtil->globs2_mtime = globs2_stat.st_mtime;
 
-       /* read globs2, and construct data structure */
-       globs2 = fopen(GLOBS2_PATH, "r");
-       if (!globs2) return;
-
        char *weight, *mime_type, *file_name, *saveptr = NULL;
        while(fgets(buf, 255, globs2)) {
                /* skip comment */