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
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
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);