diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2017-02-10 08:34:57 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2017-02-10 08:36:42 -0800 |
commit | abcba32c262e575b562ec0e481e55538536f969f (patch) | |
tree | f873cc4c0190d9e4d77439031eeade3a9a59dc34 /src/composite.c | |
parent | cef233eeb8366580f76e8324695e6f964cb160d0 (diff) | |
download | emacs-abcba32c262e575b562ec0e481e55538536f969f.tar.gz |
Fix a few integer-overflow glitches
* src/composite.c (composition_compute_stop_pos, composition_reseat_it):
* src/dispextern.h (struct composition_it.rule_idx):
* src/keyboard.c (Fset__this_command_keys):
* src/xwidget.c (webkit_js_to_lisp):
Don’t assume object sizes fit in ‘int’.
* src/xwidget.c (Fxwidget_resize):
Don’t assume Emacs integers fit in ‘int’.
Diffstat (limited to 'src/composite.c')
-rw-r--r-- | src/composite.c | 89 |
1 files changed, 42 insertions, 47 deletions
diff --git a/src/composite.c b/src/composite.c index f23bb17c57a..b673c53ac83 100644 --- a/src/composite.c +++ b/src/composite.c @@ -1012,7 +1012,7 @@ composition_compute_stop_pos (struct composition_it *cmp_it, ptrdiff_t charpos, val = CHAR_TABLE_REF (Vcomposition_function_table, c); if (! NILP (val)) { - for (int ridx = 0; CONSP (val); val = XCDR (val), ridx++) + for (EMACS_INT ridx = 0; CONSP (val); val = XCDR (val), ridx++) { Lisp_Object elt = XCAR (val); if (VECTORP (elt) && ASIZE (elt) == 3 @@ -1063,54 +1063,48 @@ composition_compute_stop_pos (struct composition_it *cmp_it, ptrdiff_t charpos, while (char_composable_p (c)) { val = CHAR_TABLE_REF (Vcomposition_function_table, c); - if (! NILP (val)) + for (EMACS_INT ridx = 0; CONSP (val); val = XCDR (val), ridx++) { - Lisp_Object elt; - int ridx, blen; - - for (ridx = 0; CONSP (val); val = XCDR (val), ridx++) + Lisp_Object elt = XCAR (val); + if (VECTORP (elt) && ASIZE (elt) == 3 + && NATNUMP (AREF (elt, 1)) + && charpos - XFASTINT (AREF (elt, 1)) > endpos) { - elt = XCAR (val); - if (VECTORP (elt) && ASIZE (elt) == 3 - && NATNUMP (AREF (elt, 1)) - && charpos - XFASTINT (AREF (elt, 1)) > endpos) - { - ptrdiff_t back = XFASTINT (AREF (elt, 1)); - ptrdiff_t cpos = charpos - back, bpos; + ptrdiff_t back = XFASTINT (AREF (elt, 1)); + ptrdiff_t cpos = charpos - back, bpos; - if (back == 0) - bpos = bytepos; - else - bpos = (NILP (string) ? CHAR_TO_BYTE (cpos) - : string_char_to_byte (string, cpos)); - if (STRINGP (AREF (elt, 0))) - blen = fast_looking_at (AREF (elt, 0), cpos, bpos, - start + 1, limit, string); - else - blen = 1; - if (blen > 0) + if (back == 0) + bpos = bytepos; + else + bpos = (NILP (string) ? CHAR_TO_BYTE (cpos) + : string_char_to_byte (string, cpos)); + ptrdiff_t blen + = (STRINGP (AREF (elt, 0)) + ? fast_looking_at (AREF (elt, 0), cpos, bpos, + start + 1, limit, string) + : 1); + if (blen > 0) + { + /* Make CPOS point to the last character of + match. Note that BLEN is byte-length. */ + if (blen > 1) + { + bpos += blen; + if (NILP (string)) + cpos = BYTE_TO_CHAR (bpos) - 1; + else + cpos = string_byte_to_char (string, bpos) - 1; + } + back = cpos - (charpos - back); + if (cmp_it->stop_pos < cpos + || (cmp_it->stop_pos == cpos + && cmp_it->lookback < back)) { - /* Make CPOS point to the last character of - match. Note that BLEN is byte-length. */ - if (blen > 1) - { - bpos += blen; - if (NILP (string)) - cpos = BYTE_TO_CHAR (bpos) - 1; - else - cpos = string_byte_to_char (string, bpos) - 1; - } - back = cpos - (charpos - back); - if (cmp_it->stop_pos < cpos - || (cmp_it->stop_pos == cpos - && cmp_it->lookback < back)) - { - cmp_it->rule_idx = ridx; - cmp_it->stop_pos = cpos; - cmp_it->ch = c; - cmp_it->lookback = back; - cmp_it->nchars = back + 1; - } + cmp_it->rule_idx = ridx; + cmp_it->stop_pos = cpos; + cmp_it->ch = c; + cmp_it->lookback = back; + cmp_it->nchars = back + 1; } } } @@ -1203,10 +1197,10 @@ composition_reseat_it (struct composition_it *cmp_it, ptrdiff_t charpos, { Lisp_Object lgstring = Qnil; Lisp_Object val, elt; - ptrdiff_t i; val = CHAR_TABLE_REF (Vcomposition_function_table, cmp_it->ch); - for (i = 0; i < cmp_it->rule_idx; i++, val = XCDR (val)); + for (EMACS_INT i = 0; i < cmp_it->rule_idx; i++, val = XCDR (val)) + continue; if (charpos < endpos) { for (; CONSP (val); val = XCDR (val)) @@ -1255,6 +1249,7 @@ composition_reseat_it (struct composition_it *cmp_it, ptrdiff_t charpos, if (NILP (LGSTRING_ID (lgstring))) lgstring = composition_gstring_put_cache (lgstring, -1); cmp_it->id = XINT (LGSTRING_ID (lgstring)); + int i; for (i = 0; i < LGSTRING_GLYPH_LEN (lgstring); i++) if (NILP (LGSTRING_GLYPH (lgstring, i))) break; |