On Wed, 26 Sep 2012 14:44:58 +0900 (JST)
YASUOKA Masahiko <[email protected]> wrote:
> On Tue, 25 Sep 2012 16:16:12 +0200
> csszep <[email protected]> wrote:
>> I wanted to try a simple npppd setup and i got a panic.
> 
> I'm looking into this problem and fixing it.  But it will take more
> days.

oops, I forgot about this bug

> To workaround the problem, please add
> 
>   mppe no
> 
> to the tunnel configuration.

Can you try below diff instead of the above workaround?

Index: sys/net/pipex.c
===================================================================
RCS file: /cvs/src/sys/net/pipex.c,v
retrieving revision 1.37
diff -u -p -r1.37 pipex.c
--- sys/net/pipex.c     14 Dec 2012 01:19:26 -0000      1.37
+++ sys/net/pipex.c     13 Feb 2013 14:55:16 -0000
@@ -396,14 +396,24 @@ pipex_add_session(struct pipex_session_r
        }
 #endif
 #ifdef PIPEX_MPPE
-       if ((req->pr_ppp_flags & PIPEX_PPP_MPPE_ACCEPTED) != 0)
+       if ((req->pr_ppp_flags & PIPEX_PPP_MPPE_ACCEPTED) != 0) {
+               if (req->pr_mppe_recv.keylenbits <= 0) {
+                       free(session, M_TEMP);
+                       return (EINVAL);
+               }
                pipex_session_init_mppe_recv(session,
                    req->pr_mppe_recv.stateless, req->pr_mppe_recv.keylenbits,
                    req->pr_mppe_recv.master_key);
-       if ((req->pr_ppp_flags & PIPEX_PPP_MPPE_ENABLED) != 0)
+       }
+       if ((req->pr_ppp_flags & PIPEX_PPP_MPPE_ENABLED) != 0) {
+               if (req->pr_mppe_send.keylenbits <= 0) {
+                       free(session, M_TEMP);
+                       return (EINVAL);
+               }
                pipex_session_init_mppe_send(session,
                    req->pr_mppe_send.stateless, req->pr_mppe_send.keylenbits,
                    req->pr_mppe_send.master_key);
+       }
 
        if (pipex_session_is_mppe_required(session)) {
                if (!pipex_session_is_mppe_enabled(session) ||
Index: usr.sbin/npppd/npppd/mppe.c
===================================================================
RCS file: /cvs/src/usr.sbin/npppd/npppd/mppe.c,v
retrieving revision 1.9
diff -u -p -r1.9 mppe.c
--- usr.sbin/npppd/npppd/mppe.c 19 Dec 2012 09:23:54 -0000      1.9
+++ usr.sbin/npppd/npppd/mppe.c 13 Feb 2013 14:55:16 -0000
@@ -119,9 +119,6 @@ mppe_init(mppe *_this, npppd_ppp *ppp)
 
        _this->required = conf->mppe_required;
 
-       if (_this->required == 0)
-               goto mppe_config_done;
-
        if (conf->mppe_keystate == (NPPPD_MPPE_STATEFUL|NPPPD_MPPE_STATELESS)) {
                /* no need to change from default. */
        } else if (conf->mppe_keystate == NPPPD_MPPE_STATELESS) {
@@ -230,21 +227,21 @@ mppe_start(mppe *_this)
                _this->recv.keybits = 128;
        }
 
-       mppe_rc4_init(_this, &_this->send, 0);
-       mppe_rc4_init(_this, &_this->recv, _this->recv.stateless);
-
-       GetNewKeyFromSHA(_this->recv.master_key, _this->recv.master_key,
-           _this->recv.keylen, _this->recv.session_key);
-       GetNewKeyFromSHA(_this->send.master_key, _this->send.master_key,
-           _this->send.keylen, _this->send.session_key);
-
-       mppe_reduce_key(&_this->recv);
-       mppe_reduce_key(&_this->send);
-
-       mppe_rc4_setkey(_this, &_this->recv);
-       mppe_rc4_setkey(_this, &_this->send);
+       if (_this->send.keybits > 0) {
+               mppe_rc4_init(_this, &_this->send, 0);
+               GetNewKeyFromSHA(_this->send.master_key, _this->send.master_key,
+                   _this->send.keylen, _this->send.session_key);
+               mppe_reduce_key(&_this->send);
+               mppe_rc4_setkey(_this, &_this->send);
+       }
+       if (_this->recv.keybits > 0) {
+               mppe_rc4_init(_this, &_this->recv, _this->recv.stateless);
+               GetNewKeyFromSHA(_this->recv.master_key, _this->recv.master_key,
+                   _this->recv.keylen, _this->recv.session_key);
+               mppe_reduce_key(&_this->recv);
+               mppe_rc4_setkey(_this, &_this->recv);
+       }
 }
-
 
 /**
  * creating the mppe bits. In case of first proposal, it specifies the
Index: usr.sbin/npppd/npppd/npppd.c
===================================================================
RCS file: /cvs/src/usr.sbin/npppd/npppd/npppd.c,v
retrieving revision 1.26
diff -u -p -r1.26 npppd.c
--- usr.sbin/npppd/npppd/npppd.c        5 Dec 2012 23:20:26 -0000       1.26
+++ usr.sbin/npppd/npppd/npppd.c        13 Feb 2013 14:55:17 -0000
@@ -899,19 +899,21 @@ pipex_setup_common(npppd_ppp *ppp, struc
 
 #ifdef USE_NPPPD_MPPE
        req->pr_ccp_id = ppp->ccp.fsm.id;
-       memcpy(req->pr_mppe_send.master_key,
-           ppp->mppe.send.master_key, sizeof(req->pr_mppe_send.master_key));
-       req->pr_mppe_send.stateless = ppp->mppe.send.stateless;
-       req->pr_mppe_send.keylenbits = ppp->mppe.send.keybits;
-
-       memcpy(req->pr_mppe_recv.master_key,
-           ppp->mppe.recv.master_key, sizeof(req->pr_mppe_recv.master_key));
-       req->pr_mppe_recv.stateless = ppp->mppe.recv.stateless;
-       req->pr_mppe_recv.keylenbits = ppp->mppe.recv.keybits;
-
-       if (ppp->mppe_started != 0) {
-               req->pr_ppp_flags |= PIPEX_PPP_MPPE_ACCEPTED;
+       if (ppp->mppe.send.keybits) {
+               memcpy(req->pr_mppe_send.master_key,
+                   ppp->mppe.send.master_key,
+                   sizeof(req->pr_mppe_send.master_key));
+               req->pr_mppe_send.stateless = ppp->mppe.send.stateless;
+               req->pr_mppe_send.keylenbits = ppp->mppe.send.keybits;
                req->pr_ppp_flags |= PIPEX_PPP_MPPE_ENABLED;
+       }
+       if (ppp->mppe.recv.keybits > 0) {
+               memcpy(req->pr_mppe_recv.master_key,
+                   ppp->mppe.recv.master_key,
+                   sizeof(req->pr_mppe_recv.master_key));
+               req->pr_mppe_recv.stateless = ppp->mppe.recv.stateless;
+               req->pr_mppe_recv.keylenbits = ppp->mppe.recv.keybits;
+               req->pr_ppp_flags |= PIPEX_PPP_MPPE_ACCEPTED;
        }
        if (ppp->mppe.required)
                req->pr_ppp_flags |= PIPEX_PPP_MPPE_REQUIRED;
Index: usr.sbin/npppd/npppd/npppd_iface.c
===================================================================
RCS file: /cvs/src/usr.sbin/npppd/npppd/npppd_iface.c,v
retrieving revision 1.7
diff -u -p -r1.7 npppd_iface.c
--- usr.sbin/npppd/npppd/npppd_iface.c  18 Sep 2012 13:14:08 -0000      1.7
+++ usr.sbin/npppd/npppd/npppd_iface.c  13 Feb 2013 14:55:17 -0000
@@ -467,7 +467,7 @@ npppd_iface_network_input_delegate(struc
                if (ppp_iface(ppp) != args->_this)
                        return 0;
 #ifdef USE_NPPPD_MPPE
-               if (MPPE_READY(ppp)) {
+               if (MPPE_SEND_READY(ppp)) {
                        /* output via MPPE if MPPE started */
                        mppe_pkt_output(&ppp->mppe, PPP_PROTO_IP, args->pktp,
                            args->lpktp);
@@ -528,7 +528,7 @@ npppd_iface_network_input_ipv4(npppd_ifa
                ppp_reset_idle_timeout(ppp);
 
 #ifdef USE_NPPPD_MPPE
-       if (MPPE_READY(ppp)) {
+       if (MPPE_SEND_READY(ppp)) {
                /* output via MPPE if MPPE started */
                mppe_pkt_output(&ppp->mppe, PPP_PROTO_IP, pktp, lpktp);
                return;
Index: usr.sbin/npppd/npppd/ppp.c
===================================================================
RCS file: /cvs/src/usr.sbin/npppd/npppd/ppp.c,v
retrieving revision 1.17
diff -u -p -r1.17 ppp.c
--- usr.sbin/npppd/npppd/ppp.c  7 Jan 2013 18:12:08 -0000       1.17
+++ usr.sbin/npppd/npppd/ppp.c  13 Feb 2013 14:55:18 -0000
@@ -869,7 +869,7 @@ ppp_recv_packet(npppd_ppp *_this, unsign
 
                                return 1;
                        }
-                       if (MPPE_READY(_this)) {
+                       if (MPPE_RECV_READY(_this)) {
                                /* MPPE is opened but naked ip packet */
                                ppp_log(_this, LOG_WARNING,
                                    "mppe is available but received naked IP.");
@@ -879,7 +879,7 @@ ppp_recv_packet(npppd_ppp *_this, unsign
                break;
        case PPP_PROTO_MPPE:
 #ifdef USE_NPPPD_MPPE
-               if (_this->mppe_started == 0)  {
+               if (!MPPE_RECV_READY(_this)) {
 #else
                {
 #endif
Index: usr.sbin/npppd/npppd/ppp.h
===================================================================
RCS file: /cvs/src/usr.sbin/npppd/npppd/ppp.h,v
retrieving revision 1.14
diff -u -p -r1.14 ppp.h
--- usr.sbin/npppd/npppd/ppp.h  7 Jan 2013 18:12:08 -0000       1.14
+++ usr.sbin/npppd/npppd/ppp.h  13 Feb 2013 14:55:18 -0000
@@ -645,7 +645,11 @@ typedef struct _dialin_proxy_info {
        (((ppp)->mppe.enabled != 0) && ((ppp)->mppe.required != 0))
 
 /** MPPE is ready to use */
-#define        MPPE_READY(ppp)         ((ppp)->mppe_started  != 0)
+#define        MPPE_SEND_READY(ppp)                            \
+    ((ppp)->mppe_started != 0 && (ppp)->mppe.send.keybits > 0)
+#define        MPPE_RECV_READY(ppp)                            \
+    ((ppp)->mppe_started != 0 && (ppp)->mppe.recv.keybits > 0)
+
 
 /* Adapted from NetBSD:/usr/src/usr.sbin/pppd/pppd/pppd.h */
 /*

Reply via email to