diff options
| author | Eli Zaretskii | 2024-08-06 21:19:49 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2024-08-06 21:19:49 +0300 |
| commit | f1e37ae423f3be6224f88a21f30ed40e73a4ce22 (patch) | |
| tree | f4c7c73964f199d6706d92a65378a711cabb74e5 /src | |
| parent | 3817355aed503e79c03bca5d203bd73716d10d9e (diff) | |
| download | emacs-f1e37ae423f3be6224f88a21f30ed40e73a4ce22.tar.gz emacs-f1e37ae423f3be6224f88a21f30ed40e73a4ce22.zip | |
Avoid crashes in very large buffers with long lines
* src/xdisp.c (get_large_narrowing_begv, get_large_narrowing_zv)
(get_medium_narrowing_begv, get_medium_narrowing_zv): Use
'ptrdiff_t' instead of 'int', to prevent integer overflow in
large buffers. (Bug#72497)
Diffstat (limited to 'src')
| -rw-r--r-- | src/xdisp.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/xdisp.c b/src/xdisp.c index 1dadb372911..5add42ef11b 100644 --- a/src/xdisp.c +++ b/src/xdisp.c | |||
| @@ -3621,14 +3621,14 @@ get_narrowed_len (struct window *w) | |||
| 3621 | static ptrdiff_t | 3621 | static ptrdiff_t |
| 3622 | get_medium_narrowing_begv (struct window *w, ptrdiff_t pos) | 3622 | get_medium_narrowing_begv (struct window *w, ptrdiff_t pos) |
| 3623 | { | 3623 | { |
| 3624 | int len = get_narrowed_len (w); | 3624 | ptrdiff_t len = get_narrowed_len (w); |
| 3625 | return max ((pos / len - 1) * len, BEGV); | 3625 | return max ((pos / len - 1) * len, BEGV); |
| 3626 | } | 3626 | } |
| 3627 | 3627 | ||
| 3628 | static ptrdiff_t | 3628 | static ptrdiff_t |
| 3629 | get_medium_narrowing_zv (struct window *w, ptrdiff_t pos) | 3629 | get_medium_narrowing_zv (struct window *w, ptrdiff_t pos) |
| 3630 | { | 3630 | { |
| 3631 | int len = get_narrowed_len (w); | 3631 | ptrdiff_t len = get_narrowed_len (w); |
| 3632 | return min ((pos / len + 1) * len, ZV); | 3632 | return min ((pos / len + 1) * len, ZV); |
| 3633 | } | 3633 | } |
| 3634 | 3634 | ||
| @@ -3678,9 +3678,9 @@ get_large_narrowing_begv (ptrdiff_t pos) | |||
| 3678 | { | 3678 | { |
| 3679 | if (long_line_optimizations_region_size <= 0) | 3679 | if (long_line_optimizations_region_size <= 0) |
| 3680 | return BEGV; | 3680 | return BEGV; |
| 3681 | int len = long_line_optimizations_region_size / 2; | 3681 | ptrdiff_t len = long_line_optimizations_region_size / 2; |
| 3682 | int begv = max (pos - len, BEGV); | 3682 | ptrdiff_t begv = max (pos - len, BEGV); |
| 3683 | int limit = long_line_optimizations_bol_search_limit; | 3683 | ptrdiff_t limit = long_line_optimizations_bol_search_limit; |
| 3684 | while (limit > 0) | 3684 | while (limit > 0) |
| 3685 | { | 3685 | { |
| 3686 | if (begv == BEGV || FETCH_BYTE (CHAR_TO_BYTE (begv) - 1) == '\n') | 3686 | if (begv == BEGV || FETCH_BYTE (CHAR_TO_BYTE (begv) - 1) == '\n') |
| @@ -3696,7 +3696,7 @@ get_large_narrowing_zv (ptrdiff_t pos) | |||
| 3696 | { | 3696 | { |
| 3697 | if (long_line_optimizations_region_size <= 0) | 3697 | if (long_line_optimizations_region_size <= 0) |
| 3698 | return ZV; | 3698 | return ZV; |
| 3699 | int len = long_line_optimizations_region_size / 2; | 3699 | ptrdiff_t len = long_line_optimizations_region_size / 2; |
| 3700 | return min (pos + len, ZV); | 3700 | return min (pos + len, ZV); |
| 3701 | } | 3701 | } |
| 3702 | 3702 | ||