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. */
{
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. */