summaryrefslogtreecommitdiff
path: root/src/textprop.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-01-06 12:54:55 +0100
committerBram Moolenaar <Bram@vim.org>2019-01-06 12:54:55 +0100
commit4614f53e0f853b513963d1a639398348a571ecf1 (patch)
tree3d9172faf423bff164f5cad88c39b6cb0e9f7af6 /src/textprop.c
parentf780b8a1c1aefb0c4b4866e50080594e3f7f16cb (diff)
downloadvim-git-4614f53e0f853b513963d1a639398348a571ecf1.tar.gz
patch 8.1.0694: when using text props may free memory that is not allocatedv8.1.0694
Problem: When using text props may free memory that is not allocated. (Andy Massimino) Solution: Allocate the line when adjusting text props. (closes #3766)
Diffstat (limited to 'src/textprop.c')
-rw-r--r--src/textprop.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/textprop.c b/src/textprop.c
index 7bc10e080..8b7d3f15e 100644
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -979,7 +979,9 @@ adjust_prop_columns(
pt = text_prop_type_by_id(curbuf, tmp_prop.tp_type);
if (bytes_added > 0
- ? (tmp_prop.tp_col >= col + (pt != NULL && (pt->pt_flags & PT_FLAG_INS_START_INCL) ? 2 : 1))
+ ? (tmp_prop.tp_col >= col
+ + (pt != NULL && (pt->pt_flags & PT_FLAG_INS_START_INCL)
+ ? 2 : 1))
: (tmp_prop.tp_col > col + 1))
{
tmp_prop.tp_col += bytes_added;
@@ -987,7 +989,7 @@ adjust_prop_columns(
}
else if (tmp_prop.tp_len > 0
&& tmp_prop.tp_col + tmp_prop.tp_len > col
- + ((pt != NULL && (pt->pt_flags & PT_FLAG_INS_END_INCL))
+ + ((pt != NULL && (pt->pt_flags & PT_FLAG_INS_END_INCL))
? 0 : 1))
{
tmp_prop.tp_len += bytes_added;
@@ -1001,8 +1003,13 @@ adjust_prop_columns(
}
if (dirty)
{
+ colnr_T newlen = (int)textlen + wi * (colnr_T)sizeof(textprop_T);
+
+ if ((curbuf->b_ml.ml_flags & ML_LINE_DIRTY) == 0)
+ curbuf->b_ml.ml_line_ptr =
+ vim_memsave(curbuf->b_ml.ml_line_ptr, newlen);
curbuf->b_ml.ml_flags |= ML_LINE_DIRTY;
- curbuf->b_ml.ml_line_len = (int)textlen + wi * sizeof(textprop_T);
+ curbuf->b_ml.ml_line_len = newlen;
}
}