From: Paul Eggert Date: Mon, 29 Aug 2011 19:07:18 +0000 (-0700) Subject: * macros.c (executing_kbd_macro_iterations): Now EMACS_INT, not int. X-Git-Url: https://git.hcoop.net/bpt/emacs.git/commitdiff_plain/48e3079369b75be22bcc429bc77bc5e61843562d * macros.c (executing_kbd_macro_iterations): Now EMACS_INT, not int. (Fend_kbd_macro): Don't mishandle MOST_NEGATIVE_FIXNUM by treating it as a large positive number. (Fexecute_kbd_macro): Don't assume repeat count fits in int. * macros.h (executing_kbd_macro_iterations): Now EMACS_INT, not int. --- diff --git a/src/ChangeLog b/src/ChangeLog index ac83d07cba..b69830b23a 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -68,6 +68,12 @@ * lread.c (dir_warning): Don't blindly alloca buffer; use SAFE_ALLOCA. Use esprintf, not sprintf, in case result does not fit in int. + * macros.c (executing_kbd_macro_iterations): Now EMACS_INT, not int. + (Fend_kbd_macro): Don't mishandle MOST_NEGATIVE_FIXNUM by treating + it as a large positive number. + (Fexecute_kbd_macro): Don't assume repeat count fits in int. + * macros.h (executing_kbd_macro_iterations): Now EMACS_INT, not int. + 2011-08-26 Paul Eggert Integer and memory overflow issues (Bug#9196). diff --git a/src/macros.c b/src/macros.c index f6cd3a3cca..4ecf49834a 100644 --- a/src/macros.c +++ b/src/macros.c @@ -35,7 +35,7 @@ static Lisp_Object Qkbd_macro_termination_hook; This is not bound at each level, so after an error, it describes the innermost interrupted macro. */ -int executing_kbd_macro_iterations; +EMACS_INT executing_kbd_macro_iterations; /* This is the macro that was executing. This is not bound at each level, @@ -175,11 +175,11 @@ each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */) if (XFASTINT (repeat) == 0) Fexecute_kbd_macro (KVAR (current_kboard, Vlast_kbd_macro), repeat, loopfunc); - else + else if (XINT (repeat) > 1) { XSETINT (repeat, XINT (repeat)-1); - if (XINT (repeat) > 0) - Fexecute_kbd_macro (KVAR (current_kboard, Vlast_kbd_macro), repeat, loopfunc); + Fexecute_kbd_macro (KVAR (current_kboard, Vlast_kbd_macro), + repeat, loopfunc); } return Qnil; } @@ -302,9 +302,9 @@ each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */) Lisp_Object final; Lisp_Object tem; int pdlcount = SPECPDL_INDEX (); - int repeat = 1; + EMACS_INT repeat = 1; struct gcpro gcpro1, gcpro2; - int success_count = 0; + EMACS_INT success_count = 0; executing_kbd_macro_iterations = 0; diff --git a/src/macros.h b/src/macros.h index 32a97e457e..7a5d532fbb 100644 --- a/src/macros.h +++ b/src/macros.h @@ -22,7 +22,7 @@ along with GNU Emacs. If not, see . */ This is not bound at each level, so after an error, it describes the innermost interrupted macro. */ -extern int executing_kbd_macro_iterations; +extern EMACS_INT executing_kbd_macro_iterations; /* This is the macro that was executing. This is not bound at each level, @@ -42,4 +42,3 @@ extern void finalize_kbd_macro_chars (void); /* Store a character into kbd macro being defined */ extern void store_kbd_macro_char (Lisp_Object); -