aboutsummaryrefslogtreecommitdiffstats
path: root/src/fileio.c
diff options
context:
space:
mode:
authorPaul Eggert2025-01-22 11:06:06 -0800
committerPaul Eggert2025-07-13 21:09:38 -0700
commit0a3c8a4df3f9e15737e4e5b4aecd2e63d2abbc4f (patch)
treecec0652bfdb92bfd6f470753a83820cfd79a6a57 /src/fileio.c
parentffd65be2277b9a30e77a00ad69c9ba21459f72c5 (diff)
downloademacs-0a3c8a4df3f9e15737e4e5b4aecd2e63d2abbc4f.tar.gz
emacs-0a3c8a4df3f9e15737e4e5b4aecd2e63d2abbc4f.zip
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.
Diffstat (limited to 'src/fileio.c')
-rw-r--r--src/fileio.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/src/fileio.c b/src/fileio.c
index 82ee22d2187..a3a49d179c4 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -4271,24 +4271,21 @@ by calling `format-decode', which see. */)
4271 { 4271 {
4272 /* Find a coding system specified in the heading two 4272 /* Find a coding system specified in the heading two
4273 lines or in the tailing several lines of the file. 4273 lines or in the tailing several lines of the file.
4274 We assume that the 1K-byte and 3K-byte for heading 4274 Assume that the 1 KiB and 3 KiB for heading
4275 and tailing respectively are sufficient for this 4275 and tailing respectively are sufficient for this
4276 purpose. */ 4276 purpose. Because the file may be in /proc,
4277 int nread; 4277 do not use st_size or report any SEEK_END failure. */
4278 4278 ptrdiff_t nread = emacs_fd_read (fd, read_buf, 4 * 1024);
4279 if (st.st_size <= (1024 * 4)) 4279 if (nread == 4 * 1024)
4280 nread = emacs_fd_read (fd, read_buf, 1024 * 4);
4281 else
4282 { 4280 {
4283 nread = emacs_fd_read (fd, read_buf, 1024); 4281 off_t tailoff = emacs_fd_lseek (fd, - 3 * 1024, SEEK_END);
4284 if (nread == 1024) 4282 if (tailoff < 0)
4283 seekable = false;
4284 else if (1024 < tailoff)
4285 { 4285 {
4286 int ntail; 4286 ptrdiff_t ntail = emacs_fd_read (fd, read_buf + 1024,
4287 if (emacs_fd_lseek (fd, st.st_size - 1024 * 3, SEEK_CUR) < 0) 4287 3 * 1024);
4288 report_file_error ("Setting file position", 4288 nread = ntail < 0 ? ntail : 1024 + ntail;
4289 orig_filename);
4290 ntail = emacs_fd_read (fd, read_buf + nread, 1024 * 3);
4291 nread = ntail < 0 ? ntail : nread + ntail;
4292 } 4289 }
4293 } 4290 }
4294 4291