From: Lennart Poettering Date: Mon, 10 Jun 2024 12:55:24 +0000 (+0200) Subject: fileio: add new flag READ_FULL_FILE_VERIFY_REGULAR() that checks if file we operate... X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7ecc69c33b749ec98eaba6e3c34fe42da79d3a8d;p=thirdparty%2Fsystemd.git fileio: add new flag READ_FULL_FILE_VERIFY_REGULAR() that checks if file we operate on is regular --- diff --git a/src/basic/fileio.c b/src/basic/fileio.c index 5d9ccbfb848..a493384c52d 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -664,6 +664,12 @@ int read_full_stream_full( if (fstat(fd, &st) < 0) return -errno; + if (FLAGS_SET(flags, READ_FULL_FILE_VERIFY_REGULAR)) { + r = stat_verify_regular(&st); + if (r < 0) + return r; + } + if (S_ISREG(st.st_mode)) { /* Try to start with the right file size if we shall read the file in full. Note @@ -685,7 +691,8 @@ int read_full_stream_full( if (flags & READ_FULL_FILE_WARN_WORLD_READABLE) (void) warn_file_is_world_accessible(filename, &st, NULL, 0); } - } + } else if (FLAGS_SET(flags, READ_FULL_FILE_VERIFY_REGULAR)) + return -EBADFD; /* If we don't know how much to read, figure it out now. If we shall read a part of the file, then * allocate the requested size. If we shall load the full file start with LINE_MAX. Note that if diff --git a/src/basic/fileio.h b/src/basic/fileio.h index 96a8773620c..578c16c0ee3 100644 --- a/src/basic/fileio.h +++ b/src/basic/fileio.h @@ -30,6 +30,7 @@ typedef enum { READ_FULL_FILE_WARN_WORLD_READABLE = 1 << 3, /* if regular file, log at LOG_WARNING level if access mode above 0700 */ READ_FULL_FILE_CONNECT_SOCKET = 1 << 4, /* if socket inode, connect to it and read off it */ READ_FULL_FILE_FAIL_WHEN_LARGER = 1 << 5, /* fail loading if file is larger than specified size */ + READ_FULL_FILE_VERIFY_REGULAR = 1 << 6, /* before reading, verify this is a regular file */ } ReadFullFileFlags; int fdopen_unlocked(int fd, const char *options, FILE **ret);