# HG changeset patch # User Andreas Schwab # Date 1197802262 0 # Node ID 591bf917aa895025a92d89177c625f83d2f5e39f # Parent 1d6e3255f024e3c5505e7a9d8f0ae9e200d16638 (Finsert_file_contents): Fix overflow check to not depend on undefined integer overflow. diff -r 1d6e3255f024 -r 591bf917aa89 src/fileio.c --- a/src/fileio.c Sun Dec 16 04:31:49 2007 +0000 +++ b/src/fileio.c Sun Dec 16 10:51:02 2007 +0000 @@ -21,6 +21,7 @@ Boston, MA 02110-1301, USA. */ #include +#include #ifdef HAVE_FCNTL_H #include @@ -3693,26 +3694,26 @@ DEFUN ("insert-file-contents", Finsert_file_contents, Sinsert_file_contents, 1, 5, 0, doc: /* Insert contents of file FILENAME after point. -Returns list of absolute file name and number of characters inserted. -If second argument VISIT is non-nil, the buffer's visited filename and -last save file modtime are set, and it is marked unmodified. If -visiting and the file does not exist, visiting is completed before the -error is signaled. - -The optional third and fourth arguments BEG and END specify what portion -of the file to insert. These arguments count bytes in the file, not -characters in the buffer. If VISIT is non-nil, BEG and END must be nil. - -If optional fifth argument REPLACE is non-nil, replace the current -buffer contents (in the accessible portion) with the file contents. -This is better than simply deleting and inserting the whole thing -because (1) it preserves some marker positions and (2) it puts less data -in the undo list. When REPLACE is non-nil, the second return value is -the number of characters that replace previous buffer contents. - -This function does code conversion according to the value of -`coding-system-for-read' or `file-coding-system-alist', and sets the -variable `last-coding-system-used' to the coding system actually used. */) + Returns list of absolute file name and number of characters inserted. + If second argument VISIT is non-nil, the buffer's visited filename and + last save file modtime are set, and it is marked unmodified. If + visiting and the file does not exist, visiting is completed before the + error is signaled. + + The optional third and fourth arguments BEG and END specify what portion + of the file to insert. These arguments count bytes in the file, not + characters in the buffer. If VISIT is non-nil, BEG and END must be nil. + + If optional fifth argument REPLACE is non-nil, replace the current + buffer contents (in the accessible portion) with the file contents. + This is better than simply deleting and inserting the whole thing + because (1) it preserves some marker positions and (2) it puts less data + in the undo list. When REPLACE is non-nil, the second return value is + the number of characters that replace previous buffer contents. + + This function does code conversion according to the value of + `coding-system-for-read' or `file-coding-system-alist', and sets the + variable `last-coding-system-used' to the coding system actually used. */) (filename, visit, beg, end, replace) Lisp_Object filename, visit, beg, end, replace; { @@ -3863,7 +3864,7 @@ 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 - || ((int) st.st_size * 4) / 4 != st.st_size) + || st.st_size > INT_MAX / 4) error ("Maximum buffer size exceeded"); /* The file size returned from stat may be zero, but data