diff options
| author | Paul Eggert | 2013-06-18 22:45:35 -0700 |
|---|---|---|
| committer | Paul Eggert | 2013-06-18 22:45:35 -0700 |
| commit | 178ba3e6f51c48ab196e44f82fc7abb3c7cd3d46 (patch) | |
| tree | 7ca96e0d078f19be8b01a1b1a866b835b90abafd /src/syntax.c | |
| parent | 102626e2259a927c563187d8ce3393d54a1a6b35 (diff) | |
| download | emacs-178ba3e6f51c48ab196e44f82fc7abb3c7cd3d46.tar.gz emacs-178ba3e6f51c48ab196e44f82fc7abb3c7cd3d46.zip | |
* syntax.c (skip_chars): Don't use uninitialized storage
when searching a multibyte buffer for characters that are not in a
unibyte string that contains non-ASCII characters.
Diffstat (limited to 'src/syntax.c')
| -rw-r--r-- | src/syntax.c | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/src/syntax.c b/src/syntax.c index 390d732944d..1b76f56dea6 100644 --- a/src/syntax.c +++ b/src/syntax.c | |||
| @@ -1577,34 +1577,31 @@ skip_chars (int forwardp, Lisp_Object string, Lisp_Object lim, int handle_iso_cl | |||
| 1577 | the corresponding multibyte chars. */ | 1577 | the corresponding multibyte chars. */ |
| 1578 | if (multibyte && string_has_eight_bit) | 1578 | if (multibyte && string_has_eight_bit) |
| 1579 | { | 1579 | { |
| 1580 | unsigned char fastmap2[0400]; | 1580 | char *p1; |
| 1581 | int range_start_byte, range_start_char; | 1581 | char himap[0200 + 1]; |
| 1582 | 1582 | memcpy (himap, fastmap + 0200, 0200); | |
| 1583 | memcpy (fastmap + 0200, fastmap2 + 0200, 0200); | 1583 | himap[0200] = 0; |
| 1584 | memset (fastmap + 0200, 0, 0200); | 1584 | memset (fastmap + 0200, 0, 0200); |
| 1585 | /* We are sure that this loop stops. */ | ||
| 1586 | for (i = 0200; ! fastmap2[i]; i++); | ||
| 1587 | c = BYTE8_TO_CHAR (i); | ||
| 1588 | fastmap[CHAR_LEADING_CODE (c)] = 1; | ||
| 1589 | range_start_byte = i; | ||
| 1590 | range_start_char = c; | ||
| 1591 | char_ranges = alloca (sizeof *char_ranges * 128 * 2); | 1585 | char_ranges = alloca (sizeof *char_ranges * 128 * 2); |
| 1592 | for (i = 129; i < 0400; i++) | 1586 | i = 0; |
| 1587 | |||
| 1588 | while ((p1 = memchr (himap + i, 1, 0200 - i))) | ||
| 1593 | { | 1589 | { |
| 1594 | c = BYTE8_TO_CHAR (i); | 1590 | /* Deduce the next range C..C2 from the next clump of 1s |
| 1595 | fastmap[CHAR_LEADING_CODE (c)] = 1; | 1591 | in HIMAP starting with &HIMAP[I]. HIMAP is the high |
| 1596 | if (i - range_start_byte != c - range_start_char) | 1592 | order half of the old FASTMAP. */ |
| 1597 | { | 1593 | int c2, leading_code; |
| 1598 | char_ranges[n_char_ranges++] = range_start_char; | 1594 | i = p1 - himap; |
| 1599 | char_ranges[n_char_ranges++] = ((i - 1 - range_start_byte) | 1595 | c = BYTE8_TO_CHAR (i + 0200); |
| 1600 | + range_start_char); | 1596 | i += strlen (p1); |
| 1601 | range_start_byte = i; | 1597 | c2 = BYTE8_TO_CHAR (i + 0200 - 1); |
| 1602 | range_start_char = c; | 1598 | |
| 1603 | } | 1599 | char_ranges[n_char_ranges++] = c; |
| 1600 | char_ranges[n_char_ranges++] = c2; | ||
| 1601 | leading_code = CHAR_LEADING_CODE (c); | ||
| 1602 | memset (fastmap + leading_code, 1, | ||
| 1603 | CHAR_LEADING_CODE (c2) - leading_code + 1); | ||
| 1604 | } | 1604 | } |
| 1605 | char_ranges[n_char_ranges++] = range_start_char; | ||
| 1606 | char_ranges[n_char_ranges++] = ((i - 1 - range_start_byte) | ||
| 1607 | + range_start_char); | ||
| 1608 | } | 1605 | } |
| 1609 | } | 1606 | } |
| 1610 | else /* STRING is multibyte */ | 1607 | else /* STRING is multibyte */ |