summaryrefslogtreecommitdiffstats
path: root/src/mouse.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-10-14 11:32:28 +0200
committerChristian Brabandt <cb@256bit.org>2023-10-14 11:32:28 +0200
commitb583eda7031b1f6a3469a2537d0c10ca5fa5568e (patch)
tree60bfbbf0770516cb9411197ad049048a2c74a9cc /src/mouse.c
parentcd6ee6935811ab223605a3f39a550d26a617867d (diff)
patch 9.0.2022: getmousepos() returns wrong index for TAB charv9.0.2022
Problem: When clicking in the middle of a TAB, getmousepos() returns the column of the next char instead of the TAB. Solution: Break out of the loop when the vcol to find is inside current char. Fix invalid memory access when calling virtcol2col() on an empty line. closes: #13321 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: zeertzjq <zeertzjq@outlook.com>
Diffstat (limited to 'src/mouse.c')
-rw-r--r--src/mouse.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/mouse.c b/src/mouse.c
index f3342f9056..fe5c14cac5 100644
--- a/src/mouse.c
+++ b/src/mouse.c
@@ -3201,7 +3201,7 @@ mouse_find_win(int *rowp, int *colp, mouse_find_T popup UNUSED)
|| defined(FEAT_EVAL) || defined(PROTO)
/*
* Convert a virtual (screen) column to a character column.
- * The first column is one.
+ * The first column is zero.
*/
int
vcol2col(win_T *wp, linenr_T lnum, int vcol)
@@ -3214,7 +3214,10 @@ vcol2col(win_T *wp, linenr_T lnum, int vcol)
init_chartabsize_arg(&cts, wp, lnum, 0, line, line);
while (cts.cts_vcol < vcol && *cts.cts_ptr != NUL)
{
- cts.cts_vcol += win_lbr_chartabsize(&cts, NULL);
+ int size = win_lbr_chartabsize(&cts, NULL);
+ if (cts.cts_vcol + size > vcol)
+ break;
+ cts.cts_vcol += size;
MB_PTR_ADV(cts.cts_ptr);
}
clear_chartabsize_arg(&cts);