Apply by doing:
       cd /usr/src
       patch -p0 < 033_pppd.patch

Then rebuild and install pppd:
       cd usr.sbin/pppd
       make obj
       make
       make install

Index: usr.sbin/pppd/cbcp.c
===================================================================
RCS file: /cvs/src/usr.sbin/pppd/cbcp.c,v
retrieving revision 1.5
retrieving revision 1.5.6.1
diff -u -p -r1.5 -r1.5.6.1
--- usr.sbin/pppd/cbcp.c        13 Sep 2002 18:19:45 -0000      1.5
+++ usr.sbin/pppd/cbcp.c        5 Nov 2004 01:54:12 -0000       1.5.6.1
@@ -147,13 +147,10 @@ cbcp_input(unit, inpacket, pktlen)
    GETCHAR(id, inp);
    GETSHORT(len, inp);

-#if 0
-    if (len > pktlen) {
+    if (len < CBCP_MINLEN || len > pktlen) {
        syslog(LOG_ERR, "CBCP packet: invalid length");
        return;
    }
-#endif
-
    len -= CBCP_MINLEN;

    switch(code) {
@@ -286,12 +283,16 @@ cbcp_recvreq(us, pckt, pcktlen)

    address[0] = 0;

-    while (len) {
+    while (len > 1) {
        syslog(LOG_DEBUG, "length: %d", len);

       GETCHAR(type, pckt);
       GETCHAR(opt_len, pckt);

+       if (len < opt_len)
+           break;
+       len -= opt_len;
+
       if (opt_len > 2)
           GETCHAR(delay, pckt);

@@ -320,7 +321,6 @@ cbcp_recvreq(us, pckt, pcktlen)
       case CB_CONF_LIST:
           break;
       }
-       len -= opt_len;
    }

    cbcp_resp(us);
@@ -414,10 +414,13 @@ cbcp_recvack(us, pckt, len)
    int opt_len;
    char address[256];

-    if (len) {
+    if (len > 1) {
        GETCHAR(type, pckt);
       GETCHAR(opt_len, pckt);
-
+
+       if (opt_len > len)
+           return;
+
       if (opt_len > 2)
           GETCHAR(delay, pckt);