On Wed, Oct 23, 2019 at 08:21:50AM +0200, Holger Glaess wrote:
> hi
> 
> 
> here the traceback , i hope ;)

Hi Holger & Tech,

I have made my octeon router work again and I have a patch.  But I'm not an
openbsd developer, nor is this patch official in any way.  It was a lot of
debugging and refactoring I had to do in /sys/net/if_spppsubr.c because
the varargs were really screwy.  size_t is not a standard builtin vararg
I believe and there was some sideffects with that.  I also applied a header
include for strlen() in this patch.

This patch should be CC'ed to tech@ and they can disect it and use it for
hints.  I have not tested this patch on any arch other than octeon.  In the
end it was not time wasted I spent 2 mornings and 2 nights on this.

You should be OK extracing sys.tar.gz in your octeon and build a kernel like
the normal way.  I know the octeons are usually low on diskspace.

Best Regards,
-peter


--- if_spppsubr.c.orig  Tue Oct 22 18:49:47 2019
+++ if_spppsubr.c       Wed Oct 23 08:03:35 2019
@@ -64,6 +64,7 @@
 #endif
 
 #include <net/if_sppp.h>
+#include <lib/libkern/libkern.h>
 
 # define UNTIMEOUT(fun, arg, handle)   \
        timeout_del(&(handle))
@@ -233,7 +234,7 @@
                                 int newstate);
 void sppp_auth_send(const struct cp *cp,
                           struct sppp *sp, unsigned int type, u_int id,
-                          ...);
+                           u_int bitmask, ...);
 
 void sppp_up_event(const struct cp *cp, struct sppp *sp);
 void sppp_down_event(const struct cp *cp, struct sppp *sp);
@@ -3277,7 +3278,8 @@
        STDDCL;
        struct lcp_header *h;
        int len, x;
-       u_char *value, *name, digest[AUTHCHALEN], dsize;
+       u_char *value, *name, digest[AUTHCHALEN];
+       int dsize;
        int value_len, name_len;
        MD5_CTX ctx;
 
@@ -3335,8 +3337,8 @@
                MD5Final(digest, &ctx);
                dsize = sizeof digest;
 
-               sppp_auth_send(&chap, sp, CHAP_RESPONSE, h->ident,
-                              sizeof dsize, (const char *)&dsize,
+               sppp_auth_send(&chap, sp, CHAP_RESPONSE, h->ident, 0x1,
+                              1, dsize,
                               sizeof digest, digest,
                               strlen(sp->myauth.name),
                               sp->myauth.name,
@@ -3458,7 +3460,7 @@
                if (value_len != sizeof digest ||
                    timingsafe_bcmp(digest, value, value_len) != 0) {
                        /* action scn, tld */
-                       sppp_auth_send(&chap, sp, CHAP_FAILURE, h->ident,
+                       sppp_auth_send(&chap, sp, CHAP_FAILURE, h->ident, 0, 
                                       sizeof(FAILMSG) - 1, (u_char *)FAILMSG,
                                       0);
                        chap.tld(sp);
@@ -3467,7 +3469,7 @@
                /* action sca, perhaps tlu */
                if (sp->state[IDX_CHAP] == STATE_REQ_SENT ||
                    sp->state[IDX_CHAP] == STATE_OPENED)
-                       sppp_auth_send(&chap, sp, CHAP_SUCCESS, h->ident,
+                       sppp_auth_send(&chap, sp, CHAP_SUCCESS, h->ident, 0,
                                       sizeof(SUCCMSG) - 1, (u_char *)SUCCMSG,
                                       0);
                if (sp->state[IDX_CHAP] == STATE_REQ_SENT) {
@@ -3634,7 +3636,7 @@
 void
 sppp_chap_scr(struct sppp *sp)
 {
-       u_char clen;
+       int clen;
 
        /* Compute random challenge. */
        arc4random_buf(sp->chap_challenge, sizeof(sp->chap_challenge));
@@ -3642,8 +3644,8 @@
 
        sp->confid[IDX_CHAP] = ++sp->pp_seq;
 
-       sppp_auth_send(&chap, sp, CHAP_CHALLENGE, sp->confid[IDX_CHAP],
-                      sizeof clen, (const char *)&clen,
+       sppp_auth_send(&chap, sp, CHAP_CHALLENGE, sp->confid[IDX_CHAP], 0x1,
+                      1, clen,
                       (size_t)AUTHCHALEN, sp->chap_challenge,
                       strlen(sp->myauth.name),
                       sp->myauth.name,
@@ -3671,7 +3673,8 @@
        STDDCL;
        struct lcp_header *h;
        int len, x;
-       u_char *name, *passwd, mlen;
+       u_char *name, *passwd;
+       int mlen;
        int name_len, passwd_len;
 
        len = m->m_pkthdr.len;
@@ -3724,7 +3727,8 @@
                        /* action scn, tld */
                        mlen = sizeof(FAILMSG) - 1;
                        sppp_auth_send(&pap, sp, PAP_NAK, h->ident,
-                                      sizeof mlen, (const char *)&mlen,
+                                      0x1,
+                                      1, mlen,
                                       sizeof(FAILMSG) - 1, (u_char *)FAILMSG,
                                       0);
                        pap.tld(sp);
@@ -3735,7 +3739,8 @@
                    sp->state[IDX_PAP] == STATE_OPENED) {
                        mlen = sizeof(SUCCMSG) - 1;
                        sppp_auth_send(&pap, sp, PAP_ACK, h->ident,
-                                      sizeof mlen, (const char *)&mlen,
+                                      0x1,
+                                      1, mlen,
                                       sizeof(SUCCMSG) - 1, (u_char *)SUCCMSG,
                                       0);
                }
@@ -3941,17 +3946,19 @@
 void
 sppp_pap_scr(struct sppp *sp)
 {
-       u_char idlen, pwdlen;
+       int s_id, s_pwd;
 
        sp->confid[IDX_PAP] = ++sp->pp_seq;
-       pwdlen = strlen(sp->myauth.secret);
-       idlen = strlen(sp->myauth.name);
 
+       s_pwd = strlen(sp->myauth.secret);
+       s_id = strlen(sp->myauth.name);
+
        sppp_auth_send(&pap, sp, PAP_REQ, sp->confid[IDX_PAP],
-                      sizeof idlen, (const char *)&idlen,
-                      (size_t)idlen, sp->myauth.name,
-                      sizeof pwdlen, (const char *)&pwdlen,
-                      (size_t)pwdlen, sp->myauth.secret,
+                      0x5,
+                      1, s_id,
+                      s_id, sp->myauth.name,
+                      1, s_pwd,
+                      s_pwd, sp->myauth.secret,
                       0);
 }
 /*
@@ -3968,15 +3975,16 @@
 
 void
 sppp_auth_send(const struct cp *cp, struct sppp *sp,
-               unsigned int type, u_int id, ...)
+               unsigned int type, u_int id, u_int bitmask, ...)
 {
        STDDCL;
        struct lcp_header *lh;
        struct mbuf *m;
-       u_char *p;
-       int len, s;
-       unsigned int mlen;
-       const char *msg;
+       char *p;
+       int s, myval;
+       u_int seq = 1;
+       unsigned int mlen, len;
+       char *msg;
        va_list ap;
 
        MGETHDR (m, M_DONTWAIT, MT_DATA);
@@ -3992,11 +4000,15 @@
        lh->ident = id;
        p = (u_char*) (lh+1);
 
-       va_start(ap, id);
+       va_start(ap, bitmask);
        len = 0;
 
-       while ((mlen = (unsigned int)va_arg(ap, size_t)) != 0) {
-               msg = va_arg(ap, const char *);
+       while ((mlen = (unsigned int)va_arg(ap, int)) != 0) {
+               if (bitmask & seq)
+                       myval = va_arg(ap, int);
+               else
+                       msg = va_arg(ap, char *);
+
                len += mlen;
                if (len > MHLEN - PKTHDRLEN - LCP_HEADER_LEN) {
                        va_end(ap);
@@ -4004,10 +4016,16 @@
                        return;
                }
 
-               bcopy(msg, p, mlen);
+               if (bitmask & seq)
+                       *p = myval;
+               else
+                       memcpy(p, msg, mlen);
+
                p += mlen;
+               seq <<= 1;
        }
        va_end(ap);
+
 
        m->m_pkthdr.len = m->m_len = PKTHDRLEN + LCP_HEADER_LEN + len;
        lh->len = htons (LCP_HEADER_LEN + len);


Reply via email to