aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii2024-08-06 21:19:49 +0300
committerEli Zaretskii2024-08-06 21:19:49 +0300
commitf1e37ae423f3be6224f88a21f30ed40e73a4ce22 (patch)
treef4c7c73964f199d6706d92a65378a711cabb74e5 /src
parent3817355aed503e79c03bca5d203bd73716d10d9e (diff)
downloademacs-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.c12
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)
3621static ptrdiff_t 3621static ptrdiff_t
3622get_medium_narrowing_begv (struct window *w, ptrdiff_t pos) 3622get_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
3628static ptrdiff_t 3628static ptrdiff_t
3629get_medium_narrowing_zv (struct window *w, ptrdiff_t pos) 3629get_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