]> git.ozlabs.org Git - ppp.git/blobdiff - modules/ppp.c
use uint instead of ulong, in case longs are 8 bytes
[ppp.git] / modules / ppp.c
index f2257eeaf5db33cab887f873551a51a302d470c9..2734cd6aec6a5c7af61acb87c0ee61ca089bec36 100644 (file)
@@ -24,7 +24,7 @@
  * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
  * OR MODIFICATIONS.
  *
  * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
  * OR MODIFICATIONS.
  *
- * $Id: ppp.c,v 1.11 1997/05/22 06:45:32 paulus Exp $
+ * $Id: ppp.c,v 1.15 1998/05/04 06:11:35 paulus Exp $
  */
 
 /*
  */
 
 /*
@@ -391,10 +391,12 @@ pppclose(q, flag)
     qprocsoff(q);
 
     up = (upperstr_t *) q->q_ptr;
     qprocsoff(q);
 
     up = (upperstr_t *) q->q_ptr;
+    if (up == 0) {
+       DPRINT("pppclose: q_ptr = 0\n");
+       return 0;
+    }
     if (up->flags & US_DBGLOG)
        DPRINT2("ppp/%d: close, flags=%x\n", up->mn, up->flags);
     if (up->flags & US_DBGLOG)
        DPRINT2("ppp/%d: close, flags=%x\n", up->mn, up->flags);
-    if (up == 0)
-       return 0;
     if (up->flags & US_CONTROL) {
 #ifdef LACHTCP
        struct ifstats *ifp, *pifp;
     if (up->flags & US_CONTROL) {
 #ifdef LACHTCP
        struct ifstats *ifp, *pifp;
@@ -494,6 +496,18 @@ pppuwput(q, mp)
 #endif /* PRIOQ */
 
     us = (upperstr_t *) q->q_ptr;
 #endif /* PRIOQ */
 
     us = (upperstr_t *) q->q_ptr;
+    if (us == 0) {
+       DPRINT("pppuwput: q_ptr = 0!\n");
+       return 0;
+    }
+    if (mp == 0) {
+       DPRINT1("pppuwput/%d: mp = 0!\n", us->mn);
+       return 0;
+    }
+    if (mp->b_datap == 0) {
+       DPRINT1("pppuwput/%d: mp->b_datap = 0!\n", us->mn);
+       return 0;
+    }
     switch (mp->b_datap->db_type) {
 #ifndef NO_DLPI
     case M_PCPROTO:
     switch (mp->b_datap->db_type) {
 #ifndef NO_DLPI
     case M_PCPROTO:
@@ -533,8 +547,16 @@ pppuwput(q, mp)
        case I_LINK:
            if ((us->flags & US_CONTROL) == 0 || us->lowerq != 0)
                break;
        case I_LINK:
            if ((us->flags & US_CONTROL) == 0 || us->lowerq != 0)
                break;
+           if (mp->b_cont == 0) {
+               DPRINT1("pppuwput/%d: ioctl I_LINK b_cont = 0!\n", us->mn);
+               break;
+           }
            lb = (struct linkblk *) mp->b_cont->b_rptr;
            us->lowerq = lq = lb->l_qbot;
            lb = (struct linkblk *) mp->b_cont->b_rptr;
            us->lowerq = lq = lb->l_qbot;
+           if (lq == 0) {
+               DPRINT1("pppuwput/%d: ioctl I_LINK l_qbot = 0!\n", us->mn);
+               break;
+           }
            lq->q_ptr = (caddr_t) us;
            RD(lq)->q_ptr = (caddr_t) us;
            noenable(RD(lq));
            lq->q_ptr = (caddr_t) us;
            RD(lq)->q_ptr = (caddr_t) us;
            noenable(RD(lq));
@@ -564,11 +586,17 @@ pppuwput(q, mp)
            break;
 
        case I_UNLINK:
            break;
 
        case I_UNLINK:
+           if (mp->b_cont == 0) {
+               DPRINT1("pppuwput/%d: ioctl I_UNLINK b_cont = 0!\n", us->mn);
+               break;
+           }
            lb = (struct linkblk *) mp->b_cont->b_rptr;
 #if DEBUG
            lb = (struct linkblk *) mp->b_cont->b_rptr;
 #if DEBUG
-           if (us->lowerq != lb->l_qbot)
+           if (us->lowerq != lb->l_qbot) {
                DPRINT2("ppp unlink: lowerq=%x qbot=%x\n",
                        us->lowerq, lb->l_qbot);
                DPRINT2("ppp unlink: lowerq=%x qbot=%x\n",
                        us->lowerq, lb->l_qbot);
+               break;
+           }
 #endif
            us->lowerq = 0;
            iop->ioc_count = 0;
 #endif
            us->lowerq = 0;
            iop->ioc_count = 0;
@@ -608,6 +636,10 @@ pppuwput(q, mp)
               the stream (like pppstats) */
            if (iop->ioc_count != sizeof(int) || us->ppa != 0)
                break;
               the stream (like pppstats) */
            if (iop->ioc_count != sizeof(int) || us->ppa != 0)
                break;
+           if (mp->b_cont == 0) {
+               DPRINT1("pppuwput/%d: ioctl PPPIO_ATTACH b_cont = 0!\n", us->mn);
+               break;
+           }
            n = *(int *)mp->b_cont->b_rptr;
            for (ppa = ppas; ppa != 0; ppa = ppa->nextppa)
                if (ppa->ppa_id == n)
            n = *(int *)mp->b_cont->b_rptr;
            for (ppa = ppas; ppa != 0; ppa = ppa->nextppa)
                if (ppa->ppa_id == n)
@@ -625,6 +657,10 @@ pppuwput(q, mp)
            /* Attach to a given SAP. */
            if (iop->ioc_count != sizeof(int) || us->ppa == 0)
                break;
            /* Attach to a given SAP. */
            if (iop->ioc_count != sizeof(int) || us->ppa == 0)
                break;
+           if (mp->b_cont == 0) {
+               DPRINT1("pppuwput/%d: ioctl PPPIO_BIND b_cont = 0!\n", us->mn);
+               break;
+           }
            n = *(int *)mp->b_cont->b_rptr;
            /* n must be a valid PPP network protocol number. */
            if (n < 0x21 || n > 0x3fff || (n & 0x101) != 1)
            n = *(int *)mp->b_cont->b_rptr;
            /* n must be a valid PPP network protocol number. */
            if (n < 0x21 || n > 0x3fff || (n & 0x101) != 1)
@@ -644,6 +680,10 @@ pppuwput(q, mp)
        case PPPIO_MRU:
            if (iop->ioc_count != sizeof(int) || (us->flags & US_CONTROL) == 0)
                break;
        case PPPIO_MRU:
            if (iop->ioc_count != sizeof(int) || (us->flags & US_CONTROL) == 0)
                break;
+           if (mp->b_cont == 0) {
+               DPRINT1("pppuwput/%d: ioctl PPPIO_MRU b_cont = 0!\n", us->mn);
+               break;
+           }
            n = *(int *)mp->b_cont->b_rptr;
            if (n <= 0 || n > PPP_MAXMRU)
                break;
            n = *(int *)mp->b_cont->b_rptr;
            if (n <= 0 || n > PPP_MAXMRU)
                break;
@@ -659,6 +699,10 @@ pppuwput(q, mp)
        case PPPIO_MTU:
            if (iop->ioc_count != sizeof(int) || (us->flags & US_CONTROL) == 0)
                break;
        case PPPIO_MTU:
            if (iop->ioc_count != sizeof(int) || (us->flags & US_CONTROL) == 0)
                break;
+           if (mp->b_cont == 0) {
+               DPRINT1("pppuwput/%d: ioctl PPPIO_MTU b_cont = 0!\n", us->mn);
+               break;
+           }
            n = *(int *)mp->b_cont->b_rptr;
            if (n <= 0 || n > PPP_MAXMTU)
                break;
            n = *(int *)mp->b_cont->b_rptr;
            if (n <= 0 || n > PPP_MAXMTU)
                break;
@@ -681,6 +725,10 @@ pppuwput(q, mp)
        case PPPIO_DEBUG:
            if (iop->ioc_count != sizeof(int))
                break;
        case PPPIO_DEBUG:
            if (iop->ioc_count != sizeof(int))
                break;
+           if (mp->b_cont == 0) {
+               DPRINT1("pppuwput/%d: ioctl PPPIO_DEBUG b_cont = 0!\n", us->mn);
+               break;
+           }
            n = *(int *)mp->b_cont->b_rptr;
            if (n == PPPDBG_DUMP + PPPDBG_DRIVER) {
                qwriter(q, NULL, debug_dump, PERIM_OUTER);
            n = *(int *)mp->b_cont->b_rptr;
            if (n == PPPDBG_DUMP + PPPDBG_DRIVER) {
                qwriter(q, NULL, debug_dump, PERIM_OUTER);
@@ -704,6 +752,10 @@ pppuwput(q, mp)
                break;
            if ((us->flags & US_CONTROL) == 0)
                break;
                break;
            if ((us->flags & US_CONTROL) == 0)
                break;
+           if (mp->b_cont == 0) {
+               DPRINT1("pppuwput/%d: ioctl PPPIO_NPMODE b_cont = 0!\n", us->mn);
+               break;
+           }
            sap = ((int *)mp->b_cont->b_rptr)[0];
            for (nps = us->next; nps != 0; nps = nps->next)
                if (nps->sap == sap)
            sap = ((int *)mp->b_cont->b_rptr)[0];
            for (nps = us->next; nps != 0; nps = nps->next)
                if (nps->sap == sap)
@@ -934,9 +986,9 @@ dlpi_request(q, mp, us)
        reply->b_wptr += sizeof(dl_info_ack_t);
        bzero((caddr_t) info, sizeof(dl_info_ack_t));
        info->dl_primitive = DL_INFO_ACK;
        reply->b_wptr += sizeof(dl_info_ack_t);
        bzero((caddr_t) info, sizeof(dl_info_ack_t));
        info->dl_primitive = DL_INFO_ACK;
-       info->dl_max_sdu = us->ppa->mtu;
+       info->dl_max_sdu = us->ppa? us->ppa->mtu: PPP_MAXMTU;
        info->dl_min_sdu = 1;
        info->dl_min_sdu = 1;
-       info->dl_addr_length = sizeof(ulong);
+       info->dl_addr_length = sizeof(uint);
 #ifdef DL_OTHER
        info->dl_mac_type = DL_OTHER;
 #else
 #ifdef DL_OTHER
        info->dl_mac_type = DL_OTHER;
 #else
@@ -946,7 +998,7 @@ dlpi_request(q, mp, us)
        info->dl_service_mode = DL_CLDLS;
        info->dl_provider_style = DL_STYLE2;
 #if DL_CURRENT_VERSION >= 2
        info->dl_service_mode = DL_CLDLS;
        info->dl_provider_style = DL_STYLE2;
 #if DL_CURRENT_VERSION >= 2
-       info->dl_sap_length = sizeof(ulong);
+       info->dl_sap_length = sizeof(uint);
        info->dl_version = DL_CURRENT_VERSION;
 #endif
        qreply(q, reply);
        info->dl_version = DL_CURRENT_VERSION;
 #endif
        qreply(q, reply);
@@ -1018,18 +1070,18 @@ dlpi_request(q, mp, us)
        us->sap = sap;
        us->state = DL_IDLE;
 
        us->sap = sap;
        us->state = DL_IDLE;
 
-       if ((reply = allocb(sizeof(dl_bind_ack_t) + sizeof(ulong),
+       if ((reply = allocb(sizeof(dl_bind_ack_t) + sizeof(uint),
                            BPRI_HI)) == 0)
            break;              /* should do bufcall */
        ackp = (dl_bind_ack_t *) reply->b_wptr;
                            BPRI_HI)) == 0)
            break;              /* should do bufcall */
        ackp = (dl_bind_ack_t *) reply->b_wptr;
-       reply->b_wptr += sizeof(dl_bind_ack_t) + sizeof(ulong);
+       reply->b_wptr += sizeof(dl_bind_ack_t) + sizeof(uint);
        reply->b_datap->db_type = M_PCPROTO;
        bzero((caddr_t) ackp, sizeof(dl_bind_ack_t));
        ackp->dl_primitive = DL_BIND_ACK;
        ackp->dl_sap = sap;
        reply->b_datap->db_type = M_PCPROTO;
        bzero((caddr_t) ackp, sizeof(dl_bind_ack_t));
        ackp->dl_primitive = DL_BIND_ACK;
        ackp->dl_sap = sap;
-       ackp->dl_addr_length = sizeof(ulong);
+       ackp->dl_addr_length = sizeof(uint);
        ackp->dl_addr_offset = sizeof(dl_bind_ack_t);
        ackp->dl_addr_offset = sizeof(dl_bind_ack_t);
-       *(ulong *)(ackp+1) = sap;
+       *(uint *)(ackp+1) = sap;
        qreply(q, reply);
        break;
 
        qreply(q, reply);
        break;
 
@@ -1533,7 +1585,7 @@ pppursrv(q)
 #ifndef NO_DLPI
            proto = PPP_PROTOCOL(mp->b_rptr);
            mp->b_rptr += PPP_HDRLEN;
 #ifndef NO_DLPI
            proto = PPP_PROTOCOL(mp->b_rptr);
            mp->b_rptr += PPP_HDRLEN;
-           hdr = allocb(sizeof(dl_unitdata_ind_t) + 2 * sizeof(ulong),
+           hdr = allocb(sizeof(dl_unitdata_ind_t) + 2 * sizeof(uint),
                         BPRI_MED);
            if (hdr == 0) {
                /* XXX should put it back and use bufcall */
                         BPRI_MED);
            if (hdr == 0) {
                /* XXX should put it back and use bufcall */
@@ -1542,21 +1594,21 @@ pppursrv(q)
            }
            hdr->b_datap->db_type = M_PROTO;
            ud = (dl_unitdata_ind_t *) hdr->b_wptr;
            }
            hdr->b_datap->db_type = M_PROTO;
            ud = (dl_unitdata_ind_t *) hdr->b_wptr;
-           hdr->b_wptr += sizeof(dl_unitdata_ind_t) + 2 * sizeof(ulong);
+           hdr->b_wptr += sizeof(dl_unitdata_ind_t) + 2 * sizeof(uint);
            hdr->b_cont = mp;
            ud->dl_primitive = DL_UNITDATA_IND;
            hdr->b_cont = mp;
            ud->dl_primitive = DL_UNITDATA_IND;
-           ud->dl_dest_addr_length = sizeof(ulong);
+           ud->dl_dest_addr_length = sizeof(uint);
            ud->dl_dest_addr_offset = sizeof(dl_unitdata_ind_t);
            ud->dl_dest_addr_offset = sizeof(dl_unitdata_ind_t);
-           ud->dl_src_addr_length = sizeof(ulong);
-           ud->dl_src_addr_offset = ud->dl_dest_addr_offset + sizeof(ulong);
+           ud->dl_src_addr_length = sizeof(uint);
+           ud->dl_src_addr_offset = ud->dl_dest_addr_offset + sizeof(uint);
 #if DL_CURRENT_VERSION >= 2
            ud->dl_group_address = 0;
 #endif
            /* Send the DLPI client the data with the SAP they requested,
               (e.g. ETHERTYPE_IP) rather than the PPP protocol number
               (e.g. PPP_IP) */
 #if DL_CURRENT_VERSION >= 2
            ud->dl_group_address = 0;
 #endif
            /* Send the DLPI client the data with the SAP they requested,
               (e.g. ETHERTYPE_IP) rather than the PPP protocol number
               (e.g. PPP_IP) */
-           ((ulong *)(ud + 1))[0] = us->req_sap;       /* dest SAP */
-           ((ulong *)(ud + 1))[1] = us->req_sap;       /* src SAP */
+           ((uint *)(ud + 1))[0] = us->req_sap;        /* dest SAP */
+           ((uint *)(ud + 1))[1] = us->req_sap;        /* src SAP */
            putnext(q, hdr);
 #else /* NO_DLPI */
            putnext(q, mp);
            putnext(q, hdr);
 #else /* NO_DLPI */
            putnext(q, mp);
@@ -1859,7 +1911,7 @@ ip_hard_filter(us, mp, outbound)
     switch (proto)
     {
     case PPP_IP:
     switch (proto)
     {
     case PPP_IP:
-       if ((mp->b_wptr - mp->b_rptr) == PPP_HDRLEN) {
+       if ((mp->b_wptr - mp->b_rptr) == PPP_HDRLEN && mp->b_cont != 0) {
            temp_mp = mp->b_cont;
            len = msgdsize(temp_mp);
            hlen = (len < MAX_IPHDR) ? len : MAX_IPHDR;
            temp_mp = mp->b_cont;
            len = msgdsize(temp_mp);
            hlen = (len < MAX_IPHDR) ? len : MAX_IPHDR;