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>
This commit is contained in:
Pierre-Emmanuel Patry
2023-02-09 10:47:15 +01:00
committed by Arthur Cohen
parent e81f5be60d
commit b56d093e95

View 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;
}
}
}
/**