aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-02-09 10:47:15 +0100
committerCohenArthur <arthur.cohen@embecosm.com>2023-02-14 19:43:16 +0000
commit3c22361370f618b2414ff47da2ff9f2d27adb5e1 (patch)
tree0785a2dd8d34a9f5cc06e10ba35d60ef467096d7 /gcc
parentdf00fb8f5b8f8b6e68b6376b31d04efe22fc3107 (diff)
downloadgcc-3c22361370f618b2414ff47da2ff9f2d27adb5e1.zip
gcc-3c22361370f618b2414ff47da2ff9f2d27adb5e1.tar.gz
gcc-3c22361370f618b2414ff47da2ff9f2d27adb5e1.tar.bz2
lex: Prevent directories in RAIIFile
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>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/lex/rust-lex.h28
1 files changed, 26 insertions, 2 deletions
diff --git a/gcc/rust/lex/rust-lex.h b/gcc/rust/lex/rust-lex.h
index 2dd60b3..5042471 100644
--- a/gcc/rust/lex/rust-lex.h
+++ b/gcc/rust/lex/rust-lex.h
@@ -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;
+ }
+ }
}
/**