diff options
| author | Eli Zaretskii | 2020-05-25 17:07:22 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2020-05-25 17:07:22 +0300 |
| commit | df91c94ca8e87a106c1e8e573802d4e299d26404 (patch) | |
| tree | 7c0636ae55ff905cffe57bceea0e9541281d05c6 | |
| parent | 478638e4706716b74de5b1aa3e85c8fd943f17ba (diff) | |
| download | emacs-df91c94ca8e87a106c1e8e573802d4e299d26404.tar.gz emacs-df91c94ca8e87a106c1e8e573802d4e299d26404.zip | |
Fix access to single-byte characters in buffer text
* src/xdisp.c (get_visually_first_element)
(Fbidi_find_overridden_directionality):
* src/cmds.c (Fend_of_line): Use FETCH_BYTE instead of FETCH_CHAR,
and byte position instead of character position, to access
individual bytes of buffer text. This avoids producing invalid
characters and accessing wrong buffer positions. (Bug#41520)
| -rw-r--r-- | src/cmds.c | 4 | ||||
| -rw-r--r-- | src/xdisp.c | 6 |
2 files changed, 5 insertions, 5 deletions
diff --git a/src/cmds.c b/src/cmds.c index 5d7a45e65f6..9914b7a01f7 100644 --- a/src/cmds.c +++ b/src/cmds.c | |||
| @@ -203,7 +203,7 @@ to t. */) | |||
| 203 | SET_PT (newpos); | 203 | SET_PT (newpos); |
| 204 | 204 | ||
| 205 | if (PT > newpos | 205 | if (PT > newpos |
| 206 | && FETCH_CHAR (PT - 1) == '\n') | 206 | && FETCH_BYTE (PT_BYTE - 1) == '\n') |
| 207 | { | 207 | { |
| 208 | /* If we skipped over a newline that follows | 208 | /* If we skipped over a newline that follows |
| 209 | an invisible intangible run, | 209 | an invisible intangible run, |
| @@ -214,7 +214,7 @@ to t. */) | |||
| 214 | break; | 214 | break; |
| 215 | } | 215 | } |
| 216 | else if (PT > newpos && PT < ZV | 216 | else if (PT > newpos && PT < ZV |
| 217 | && FETCH_CHAR (PT) != '\n') | 217 | && FETCH_BYTE (PT_BYTE) != '\n') |
| 218 | /* If we skipped something intangible | 218 | /* If we skipped something intangible |
| 219 | and now we're not really at eol, | 219 | and now we're not really at eol, |
| 220 | keep going. */ | 220 | keep going. */ |
diff --git a/src/xdisp.c b/src/xdisp.c index 1e865898e37..bff6218106b 100644 --- a/src/xdisp.c +++ b/src/xdisp.c | |||
| @@ -8264,8 +8264,8 @@ get_visually_first_element (struct it *it) | |||
| 8264 | } | 8264 | } |
| 8265 | else if (it->bidi_it.charpos == bob | 8265 | else if (it->bidi_it.charpos == bob |
| 8266 | || (!string_p | 8266 | || (!string_p |
| 8267 | && (FETCH_CHAR (it->bidi_it.bytepos - 1) == '\n' | 8267 | && (FETCH_BYTE (it->bidi_it.bytepos - 1) == '\n' |
| 8268 | || FETCH_CHAR (it->bidi_it.bytepos) == '\n'))) | 8268 | || FETCH_BYTE (it->bidi_it.bytepos) == '\n'))) |
| 8269 | { | 8269 | { |
| 8270 | /* If we are at the beginning of a line/string, we can produce | 8270 | /* If we are at the beginning of a line/string, we can produce |
| 8271 | the next element right away. */ | 8271 | the next element right away. */ |
| @@ -24157,7 +24157,7 @@ the `bidi-class' property of a character. */) | |||
| 24157 | itb.charpos = BEGV; | 24157 | itb.charpos = BEGV; |
| 24158 | itb.bytepos = BEGV_BYTE; | 24158 | itb.bytepos = BEGV_BYTE; |
| 24159 | } | 24159 | } |
| 24160 | else if (FETCH_CHAR (from_bpos - 1) == '\n') | 24160 | else if (FETCH_BYTE (from_bpos - 1) == '\n') |
| 24161 | { | 24161 | { |
| 24162 | itb.charpos = from_pos; | 24162 | itb.charpos = from_pos; |
| 24163 | itb.bytepos = from_bpos; | 24163 | itb.bytepos = from_bpos; |