gccrs: lex: Prevent directories in RAIIFile
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Thu, 9 Feb 2023 09:47:15 +0000 (10:47 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Thu, 6 Apr 2023 08:47:23 +0000 (10:47 +0200)
RAIIFile constructor was accepting directory filename. This lead to
unattended directory opening in some part of the code (load_file_bytes)
wich resulted in ice. Since RAIIFile are used for the lexer, removing
the ability to open directories with RAIIFile fixes those issues and
prevent future mistakes.

gcc/rust/ChangeLog:

* lex/rust-lex.h: Add file type check.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/lex/rust-lex.h

index 2dd60b3..5042471 100644 (file)
@@ -38,13 +38,37 @@ private:
       fclose (file);
   }
 
+  static bool allowed_filetype (const struct stat &statbuf)
+  {
+    // The file could be either
+    // - a regular file
+    // - a char device (/dev/null...)
+    return S_ISREG (statbuf.st_mode) || S_ISCHR (statbuf.st_mode);
+  }
+
 public:
   RAIIFile (const char *filename) : filename (filename)
   {
     if (strcmp (filename, "-") == 0)
-      file = stdin;
+      {
+       file = stdin;
+      }
     else
-      file = fopen (filename, "r");
+      {
+       struct stat statbuf;
+       if (!(file = fopen (filename, "r")))
+         {
+           return;
+         }
+
+       if (-1 == fstat (fileno (file), &statbuf)
+           || !allowed_filetype (statbuf))
+         {
+           fclose (file);
+           file = nullptr;
+           errno = EISDIR;
+         }
+      }
   }
 
   /**