aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-02-09 10:47:15 +0100
committerArthur Cohen <arthur.cohen@embecosm.com>2023-04-06 10:47:23 +0200
commitb56d093e95221cd2d95b3c030f6102378eeffe69 (patch)
treef2db1034d1aa7691fc8c069a25e778b6891ecb61 /gcc
parente81f5be60d1ff504f9b1b2c5cfad0a808bec4ff7 (diff)
downloadgcc-b56d093e95221cd2d95b3c030f6102378eeffe69.zip
gcc-b56d093e95221cd2d95b3c030f6102378eeffe69.tar.gz
gcc-b56d093e95221cd2d95b3c030f6102378eeffe69.tar.bz2
gccrs: 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;
+ }
+ }
}
/**