Perform a copy with a memmove for potentially overlapping regions.
authormikeb <mikeb@openbsd.org>
Fri, 12 Jun 2015 14:18:25 +0000 (14:18 +0000)
committermikeb <mikeb@openbsd.org>
Fri, 12 Jun 2015 14:18:25 +0000 (14:18 +0000)
Reported and fixed by Sergey Ryazanov <ryazanov ! s ! a at gmail ! com>,
thanks!

usr.sbin/pppd/lcp.c
usr.sbin/pppd/pppd.h

index 9f73296..d09659d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: lcp.c,v 1.11 2015/01/15 23:19:48 tedu Exp $   */
+/*     $OpenBSD: lcp.c,v 1.12 2015/06/12 14:18:25 mikeb Exp $  */
 
 /*
  * lcp.c - PPP Link Control Protocol.
@@ -1441,7 +1441,7 @@ endswitch:
        if (orc == CONFREJ) {           /* Reject this CI */
            rc = CONFREJ;
            if (cip != rejp)            /* Need to move rejected CI? */
-               BCOPY(cip, rejp, cilen); /* Move it */
+               BMOVE(cip, rejp, cilen); /* Move it (NB: overlapped regions) */
            INCPTR(cilen, rejp);        /* Update output pointer */
        }
     }
index eaef54a..76f5906 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pppd.h,v 1.18 2015/01/16 06:40:19 deraadt Exp $       */
+/*     $OpenBSD: pppd.h,v 1.19 2015/06/12 14:18:25 mikeb Exp $ */
 
 /*
  * pppd.h - PPP daemon global declarations.
@@ -402,6 +402,7 @@ extern struct option_info devnam_info;
 #define UNTIMEOUT(r, f)                untimeout((r), (f))
 
 #define BCOPY(s, d, l)         memcpy(d, s, l)
+#define BMOVE(s, d, l)         memmove(d, s, l)
 #define BZERO(s, n)            memset(s, 0, n)
 #define EXIT(u)                        quit()