]> granicus.if.org Git - vim/commitdiff
patch 8.2.5164: invalid memory access after diff buffer manipulations v8.2.5164
authorBram Moolenaar <Bram@vim.org>
Sun, 26 Jun 2022 15:53:34 +0000 (16:53 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 26 Jun 2022 15:53:34 +0000 (16:53 +0100)
Problem:    Invalid memory access after diff buffer manipulations.
Solution:   Use zero offset when change removes all lines in a diff block.

src/diff.c
src/testdir/test_diffmode.vim
src/version.c

index eddf33165628da7c3a06411133c8c4e2dbbe62fa..91e5ae2f2f6890cbcba1901d12cb1babdeeb94fc 100644 (file)
@@ -403,9 +403,9 @@ diff_mark_adjust_tp(
                // 2. 3. 4. 5.: inserted/deleted lines touching this diff.
                if (deleted > 0)
                {
+                   off = 0;
                    if (dp->df_lnum[idx] >= line1)
                    {
-                       off = dp->df_lnum[idx] - lnum_deleted;
                        if (last <= line2)
                        {
                            // 4. delete all lines of diff
@@ -426,6 +426,7 @@ diff_mark_adjust_tp(
                        else
                        {
                            // 5. delete lines at or just before top of diff
+                           off = dp->df_lnum[idx] - lnum_deleted;
                            n = off;
                            dp->df_count[idx] -= line2 - dp->df_lnum[idx] + 1;
                            check_unchanged = TRUE;
@@ -434,7 +435,6 @@ diff_mark_adjust_tp(
                    }
                    else
                    {
-                       off = 0;
                        if (last < line2)
                        {
                            // 2. delete at end of diff
index afa8f891be5539aa1a7ee51ff329f68e68e6262f..4c7aff5ccb6e3ef4f002f99633082e15ed98ef52 100644 (file)
@@ -1615,5 +1615,17 @@ func Test_diff_only()
   %bwipe!
 endfunc
 
+" This was causing invalid diff block values
+" FIXME: somehow this causes a valgrind error when run directly but not when
+" run as a test.
+func Test_diff_manipulations()
+  set diff
+  split 0
+  sil! norm R\r\edoo\ebdeu\17\18R\r\edoo\ebdeu\17\18R\r\edoo\ebdeu
+
+  set nodiff
+  %bwipe!
+endfunc
+
 
 " vim: shiftwidth=2 sts=2 expandtab
index c847d590527ccd2ea2b96670b961c081d9255b00..d7f0a83f3e42eb14241f39327b7922f7aec68155 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    5164,
 /**/
     5163,
 /**/