From: Pierre-Emmanuel Patry Date: Thu, 9 Feb 2023 09:47:15 +0000 (+0100) Subject: gccrs: lex: Prevent directories in RAIIFile X-Git-Tag: basepoints/gcc-14~114 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b56d093e95221cd2d95b3c030f6102378eeffe69;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/rust/lex/rust-lex.h b/gcc/rust/lex/rust-lex.h index 2dd60b365ef7..50424713df9a 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; + } + } } /**