X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=modules%2Fppp.c;h=2734cd6aec6a5c7af61acb87c0ee61ca089bec36;hp=dcdf1c7e11ac10b0f61f3c1251a4bd4d4605c953;hb=63526107ef91931ac8ef8c242b9cbcdf7da96520;hpb=aeb204dccc12e94006cada67d68a7a6783e11ab6 diff --git a/modules/ppp.c b/modules/ppp.c index dcdf1c7..2734cd6 100644 --- a/modules/ppp.c +++ b/modules/ppp.c @@ -24,7 +24,7 @@ * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. * - * $Id: ppp.c,v 1.10 1997/04/30 05:44:43 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; + 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 == 0) - return 0; 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; + 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: @@ -533,8 +547,16 @@ pppuwput(q, mp) 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; + 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)); @@ -564,11 +586,17 @@ pppuwput(q, mp) 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 - 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); + break; + } #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; + 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) @@ -625,6 +657,10 @@ pppuwput(q, mp) /* 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) @@ -644,6 +680,10 @@ pppuwput(q, mp) 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; @@ -659,6 +699,10 @@ pppuwput(q, mp) 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; @@ -681,6 +725,10 @@ pppuwput(q, mp) 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); @@ -704,6 +752,10 @@ pppuwput(q, mp) 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) @@ -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; - 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_addr_length = sizeof(ulong); + info->dl_addr_length = sizeof(uint); #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_sap_length = sizeof(ulong); + info->dl_sap_length = sizeof(uint); 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; - 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; - 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; - ackp->dl_addr_length = sizeof(ulong); + ackp->dl_addr_length = sizeof(uint); ackp->dl_addr_offset = sizeof(dl_bind_ack_t); - *(ulong *)(ackp+1) = sap; + *(uint *)(ackp+1) = sap; qreply(q, reply); break; @@ -1250,7 +1302,7 @@ pass_packet(us, mp, outbound) int pass; upperstr_t *ppa; - if (us->ppa == 0) { + if ((ppa = us->ppa) == 0) { freemsg(mp); return 0; } @@ -1267,7 +1319,7 @@ pass_packet(us, mp, outbound) if (pass < 0) { /* pass only if link already up, and don't update time */ - if (us->ppa->lowerq == 0) { + if (ppa->lowerq == 0) { freemsg(mp); return 0; } @@ -1533,7 +1585,7 @@ pppursrv(q) #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 */ @@ -1542,21 +1594,21 @@ pppursrv(q) } 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; - 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_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) */ - ((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); @@ -1859,7 +1911,7 @@ ip_hard_filter(us, mp, outbound) 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;