1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-10 05:30:45 -08:00

Don’t trust st_size when scanning file head+tail

* src/fileio.c (Finsert_file_contents): Do not look at st_size
when scanning the file’s head and tail for a coding system comment.
Instead, just use read and SEEK_END and don’t worry if the latter fails.
st_size and lseek might not work in a /proc file system.
This commit is contained in:
Paul Eggert 2025-01-22 11:06:06 -08:00
parent ffd65be227
commit 0a3c8a4df3

View file

@ -4271,24 +4271,21 @@ by calling `format-decode', which see. */)
{
/* Find a coding system specified in the heading two
lines or in the tailing several lines of the file.
We assume that the 1K-byte and 3K-byte for heading
Assume that the 1 KiB and 3 KiB for heading
and tailing respectively are sufficient for this
purpose. */
int nread;
if (st.st_size <= (1024 * 4))
nread = emacs_fd_read (fd, read_buf, 1024 * 4);
else
purpose. Because the file may be in /proc,
do not use st_size or report any SEEK_END failure. */
ptrdiff_t nread = emacs_fd_read (fd, read_buf, 4 * 1024);
if (nread == 4 * 1024)
{
nread = emacs_fd_read (fd, read_buf, 1024);
if (nread == 1024)
off_t tailoff = emacs_fd_lseek (fd, - 3 * 1024, SEEK_END);
if (tailoff < 0)
seekable = false;
else if (1024 < tailoff)
{
int ntail;
if (emacs_fd_lseek (fd, st.st_size - 1024 * 3, SEEK_CUR) < 0)
report_file_error ("Setting file position",
orig_filename);
ntail = emacs_fd_read (fd, read_buf + nread, 1024 * 3);
nread = ntail < 0 ? ntail : nread + ntail;
ptrdiff_t ntail = emacs_fd_read (fd, read_buf + 1024,
3 * 1024);
nread = ntail < 0 ? ntail : 1024 + ntail;
}
}