aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2011-07-16 20:00:19 -0700
committerPaul Eggert2011-07-16 20:00:19 -0700
commitb13995dbbdab5254bc77ad5ed7318db9797be321 (patch)
treea2c8aefa66dfa3d78ce0c87b09769ac54827e916 /src
parent8d576a545d08182fae5c7d705a53da2a84e0d85a (diff)
downloademacs-b13995dbbdab5254bc77ad5ed7318db9797be321.tar.gz
emacs-b13995dbbdab5254bc77ad5ed7318db9797be321.zip
* keyboard.c: Overflow, signedness and related fixes.
(make_lispy_movement): Use same integer type in forward decl that is used in the definition. (read_key_sequence, keyremap_step): Change bufsize argument back to int, undoing my 2011-03-30 change. We prefer signed types, and int is wide enough here. (parse_tool_bar_item): Don't assume tool_bar_max_label_size is less than TYPE_MAXIMUM (EMACS_INT) / 2. Don't let the label size grow larger than STRING_BYTES_BOUND. Use ptrdiff_t for Emacs string length, not size_t. Use ptrdiff_t for index, not int. (keyremap_step, read_key_sequence): Redo bufsize check to avoid possibility of integer overflow.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog13
-rw-r--r--src/keyboard.c21
2 files changed, 24 insertions, 10 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 1dcf39498f3..32a117ed767 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,18 @@
12011-07-17 Paul Eggert <eggert@cs.ucla.edu> 12011-07-17 Paul Eggert <eggert@cs.ucla.edu>
2 2
3 * keyboard.c: Overflow, signedness and related fixes.
4 (make_lispy_movement): Use same integer type in forward decl
5 that is used in the definition.
6 (read_key_sequence, keyremap_step):
7 Change bufsize argument back to int, undoing my 2011-03-30 change.
8 We prefer signed types, and int is wide enough here.
9 (parse_tool_bar_item): Don't assume tool_bar_max_label_size is less
10 than TYPE_MAXIMUM (EMACS_INT) / 2. Don't let the label size grow
11 larger than STRING_BYTES_BOUND. Use ptrdiff_t for Emacs string
12 length, not size_t. Use ptrdiff_t for index, not int.
13 (keyremap_step, read_key_sequence): Redo bufsize check to avoid
14 possibility of integer overflow.
15
3 Overflow, signedness and related fixes for images. 16 Overflow, signedness and related fixes for images.
4 17
5 * dispextern.h (struct it.stack[0].u.image.image_id) 18 * dispextern.h (struct it.stack[0].u.image.image_id)
diff --git a/src/keyboard.c b/src/keyboard.c
index 7e144b80a09..30fe0d917c4 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -444,7 +444,7 @@ static Lisp_Object make_lispy_event (struct input_event *);
444static Lisp_Object make_lispy_movement (struct frame *, Lisp_Object, 444static Lisp_Object make_lispy_movement (struct frame *, Lisp_Object,
445 enum scroll_bar_part, 445 enum scroll_bar_part,
446 Lisp_Object, Lisp_Object, 446 Lisp_Object, Lisp_Object,
447 unsigned long); 447 Time);
448#endif 448#endif
449static Lisp_Object modify_event_symbol (EMACS_INT, unsigned, Lisp_Object, 449static Lisp_Object modify_event_symbol (EMACS_INT, unsigned, Lisp_Object,
450 Lisp_Object, const char *const *, 450 Lisp_Object, const char *const *,
@@ -1300,7 +1300,7 @@ some_mouse_moved (void)
1300/* This is the actual command reading loop, 1300/* This is the actual command reading loop,
1301 sans error-handling encapsulation. */ 1301 sans error-handling encapsulation. */
1302 1302
1303static int read_key_sequence (Lisp_Object *, size_t, Lisp_Object, 1303static int read_key_sequence (Lisp_Object *, int, Lisp_Object,
1304 int, int, int); 1304 int, int, int);
1305void safe_run_hooks (Lisp_Object); 1305void safe_run_hooks (Lisp_Object);
1306static void adjust_point_for_property (EMACS_INT, int); 1306static void adjust_point_for_property (EMACS_INT, int);
@@ -8274,10 +8274,11 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item)
8274 Lisp_Object tcapt = PROP (TOOL_BAR_ITEM_CAPTION); 8274 Lisp_Object tcapt = PROP (TOOL_BAR_ITEM_CAPTION);
8275 const char *label = SYMBOLP (tkey) ? SSDATA (SYMBOL_NAME (tkey)) : ""; 8275 const char *label = SYMBOLP (tkey) ? SSDATA (SYMBOL_NAME (tkey)) : "";
8276 const char *capt = STRINGP (tcapt) ? SSDATA (tcapt) : ""; 8276 const char *capt = STRINGP (tcapt) ? SSDATA (tcapt) : "";
8277 EMACS_INT max_lbl = 2 * tool_bar_max_label_size; 8277 ptrdiff_t max_lbl =
8278 2 * max (0, min (tool_bar_max_label_size, STRING_BYTES_BOUND / 2));
8278 char *buf = (char *) xmalloc (max_lbl + 1); 8279 char *buf = (char *) xmalloc (max_lbl + 1);
8279 Lisp_Object new_lbl; 8280 Lisp_Object new_lbl;
8280 size_t caption_len = strlen (capt); 8281 ptrdiff_t caption_len = strlen (capt);
8281 8282
8282 if (caption_len <= max_lbl && capt[0] != '\0') 8283 if (caption_len <= max_lbl && capt[0] != '\0')
8283 { 8284 {
@@ -8290,7 +8291,7 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item)
8290 8291
8291 if (strlen (label) <= max_lbl && label[0] != '\0') 8292 if (strlen (label) <= max_lbl && label[0] != '\0')
8292 { 8293 {
8293 int j; 8294 ptrdiff_t j;
8294 if (label != buf) 8295 if (label != buf)
8295 strcpy (buf, label); 8296 strcpy (buf, label);
8296 8297
@@ -8849,7 +8850,7 @@ access_keymap_keyremap (Lisp_Object map, Lisp_Object key, Lisp_Object prompt,
8849 The return value is non-zero if the remapping actually took place. */ 8850 The return value is non-zero if the remapping actually took place. */
8850 8851
8851static int 8852static int
8852keyremap_step (Lisp_Object *keybuf, size_t bufsize, volatile keyremap *fkey, 8853keyremap_step (Lisp_Object *keybuf, int bufsize, volatile keyremap *fkey,
8853 int input, int doit, int *diff, Lisp_Object prompt) 8854 int input, int doit, int *diff, Lisp_Object prompt)
8854{ 8855{
8855 Lisp_Object next, key; 8856 Lisp_Object next, key;
@@ -8871,7 +8872,7 @@ keyremap_step (Lisp_Object *keybuf, size_t bufsize, volatile keyremap *fkey,
8871 8872
8872 *diff = len - (fkey->end - fkey->start); 8873 *diff = len - (fkey->end - fkey->start);
8873 8874
8874 if (input + *diff >= bufsize) 8875 if (bufsize - input <= *diff)
8875 error ("Key sequence too long"); 8876 error ("Key sequence too long");
8876 8877
8877 /* Shift the keys that follow fkey->end. */ 8878 /* Shift the keys that follow fkey->end. */
@@ -8942,7 +8943,7 @@ keyremap_step (Lisp_Object *keybuf, size_t bufsize, volatile keyremap *fkey,
8942 from the selected window's buffer. */ 8943 from the selected window's buffer. */
8943 8944
8944static int 8945static int
8945read_key_sequence (Lisp_Object *keybuf, size_t bufsize, Lisp_Object prompt, 8946read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt,
8946 int dont_downcase_last, int can_return_switch_frame, 8947 int dont_downcase_last, int can_return_switch_frame,
8947 int fix_current_buffer) 8948 int fix_current_buffer)
8948{ 8949{
@@ -9549,7 +9550,7 @@ read_key_sequence (Lisp_Object *keybuf, size_t bufsize, Lisp_Object prompt,
9549 && (NILP (fake_prefixed_keys) 9550 && (NILP (fake_prefixed_keys)
9550 || NILP (Fmemq (key, fake_prefixed_keys)))) 9551 || NILP (Fmemq (key, fake_prefixed_keys))))
9551 { 9552 {
9552 if (t + 1 >= bufsize) 9553 if (bufsize - t <= 1)
9553 error ("Key sequence too long"); 9554 error ("Key sequence too long");
9554 9555
9555 keybuf[t] = posn; 9556 keybuf[t] = posn;
@@ -9630,7 +9631,7 @@ read_key_sequence (Lisp_Object *keybuf, size_t bufsize, Lisp_Object prompt,
9630 insert the dummy prefix event `menu-bar'. */ 9631 insert the dummy prefix event `menu-bar'. */
9631 if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar)) 9632 if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
9632 { 9633 {
9633 if (t + 1 >= bufsize) 9634 if (bufsize - t <= 1)
9634 error ("Key sequence too long"); 9635 error ("Key sequence too long");
9635 keybuf[t] = posn; 9636 keybuf[t] = posn;
9636 keybuf[t+1] = key; 9637 keybuf[t+1] = key;