summaryrefslogtreecommitdiff
path: root/src/fileio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fileio.c')
-rw-r--r--src/fileio.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/src/fileio.c b/src/fileio.c
index 552044f7272..676eb7f53ac 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -3239,9 +3239,16 @@ variable `last-coding-system-used' to the coding system actually used. */)
record_unwind_protect (close_file_unwind, make_number (fd));
- /* Can happen on any platform that uses long as type of off_t, but allows
- file sizes to exceed 2Gb, so give a suitable message. */
- if (! not_regular && st.st_size < 0)
+
+ /* Arithmetic overflow can occur if an Emacs integer cannot represent the
+ file size, or if the calculations below overflow. The calculations below
+ double the file size twice, so check that it can be multiplied by 4
+ safely.
+
+ Also check whether the size is negative, which can happen on a platform
+ that allows file sizes greater than the maximum off_t value. */
+ if (! not_regular
+ && ! (0 <= st.st_size && st.st_size <= MOST_POSITIVE_FIXNUM / 4))
error ("Maximum buffer size exceeded");
/* Prevent redisplay optimizations. */
@@ -3268,18 +3275,6 @@ variable `last-coding-system-used' to the coding system actually used. */)
{
XSETINT (end, st.st_size);
- /* Arithmetic overflow can occur if an Emacs integer cannot
- represent the file size, or if the calculations below
- overflow. The calculations below double the file size
- twice, so check that it can be multiplied by 4 safely. */
- if (XINT (end) != st.st_size
- /* Actually, it should test either INT_MAX or LONG_MAX
- depending on which one is used for EMACS_INT. But in
- any case, in practice, this test is redundant with the
- one above.
- || st.st_size > INT_MAX / 4 */)
- error ("Maximum buffer size exceeded");
-
/* The file size returned from stat may be zero, but data
may be readable nonetheless, for example when this is a
file in the /proc filesystem. */