Hi,

Issuing the following commands to delete a backwards sentence will trigger a
segfault on vi(1):

echo "\nfoo" > a && vi a
d(

The patch below from rin@NetBSD, via nvi2 project, fixes it.

OK?


Index: common/delete.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/common/delete.c,v
retrieving revision 1.11
diff -u -p -u -r1.11 delete.c
--- common/delete.c     6 Jan 2016 22:28:52 -0000       1.11
+++ common/delete.c     23 Nov 2017 12:52:38 -0000
@@ -87,14 +87,16 @@ del(SCR *sp, MARK *fm, MARK *tm, int lmo
        if (tm->lno == fm->lno) {
                if (db_get(sp, fm->lno, DBG_FATAL, &p, &len))
                        return (1);
-               GET_SPACE_RET(sp, bp, blen, len);
-               if (fm->cno != 0)
-                       memcpy(bp, p, fm->cno);
-               memcpy(bp + fm->cno, p + (tm->cno + 1), len - (tm->cno + 1));
-               if (db_set(sp, fm->lno,
-                   bp, len - ((tm->cno - fm->cno) + 1)))
-                       goto err;
-               goto done;
+               if (len != 0) {
+                       GET_SPACE_RET(sp, bp, blen, len);
+                       if (fm->cno != 0)
+                               memcpy(bp, p, fm->cno);
+                       memcpy(bp + fm->cno, p + (tm->cno + 1), len - (tm->cno 
+ 1));
+                       if (db_set(sp, fm->lno,
+                           bp, len - ((tm->cno - fm->cno) + 1)))
+                               goto err;
+                       goto done;
+               }
        }
 
        /*

Reply via email to