diff options
| author | Paul Eggert | 2011-07-16 20:00:19 -0700 |
|---|---|---|
| committer | Paul Eggert | 2011-07-16 20:00:19 -0700 |
| commit | b13995dbbdab5254bc77ad5ed7318db9797be321 (patch) | |
| tree | a2c8aefa66dfa3d78ce0c87b09769ac54827e916 | |
| parent | 8d576a545d08182fae5c7d705a53da2a84e0d85a (diff) | |
| download | emacs-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.
| -rw-r--r-- | src/ChangeLog | 13 | ||||
| -rw-r--r-- | src/keyboard.c | 21 |
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 @@ | |||
| 1 | 2011-07-17 Paul Eggert <eggert@cs.ucla.edu> | 1 | 2011-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 *); | |||
| 444 | static Lisp_Object make_lispy_movement (struct frame *, Lisp_Object, | 444 | static 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 |
| 449 | static Lisp_Object modify_event_symbol (EMACS_INT, unsigned, Lisp_Object, | 449 | static 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 | ||
| 1303 | static int read_key_sequence (Lisp_Object *, size_t, Lisp_Object, | 1303 | static int read_key_sequence (Lisp_Object *, int, Lisp_Object, |
| 1304 | int, int, int); | 1304 | int, int, int); |
| 1305 | void safe_run_hooks (Lisp_Object); | 1305 | void safe_run_hooks (Lisp_Object); |
| 1306 | static void adjust_point_for_property (EMACS_INT, int); | 1306 | static 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 | ||
| 8851 | static int | 8852 | static int |
| 8852 | keyremap_step (Lisp_Object *keybuf, size_t bufsize, volatile keyremap *fkey, | 8853 | keyremap_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 | ||
| 8944 | static int | 8945 | static int |
| 8945 | read_key_sequence (Lisp_Object *keybuf, size_t bufsize, Lisp_Object prompt, | 8946 | read_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; |