|
1 | | -/* $OpenBSD: pipex.c,v 1.55 2014/07/22 11:06:10 mpi Exp $ */ |
| 1 | +/* $OpenBSD: pipex.c,v 1.55.4.1 2014/12/01 06:57:33 yasuoka Exp $ */ |
2 | 2 |
|
3 | 3 | /*- |
4 | 4 | * Copyright (c) 2009 Internet Initiative Japan Inc. |
@@ -1037,6 +1037,7 @@ pipex_ppp_input(struct mbuf *m0, struct pipex_session *session, int decrypted) |
1037 | 1037 | struct m_tag *mtag; |
1038 | 1038 | struct pipex_tag *tag; |
1039 | 1039 |
|
| 1040 | + KASSERT(m0->m_pkthdr.len >= PIPEX_PPPMINLEN); |
1040 | 1041 | proto = pipex_ppp_proto(m0, session, 0, &hlen); |
1041 | 1042 | #ifdef PIPEX_MPPE |
1042 | 1043 | if (proto == PPP_COMP) { |
@@ -1294,7 +1295,8 @@ pipex_common_input(struct pipex_session *session, struct mbuf *m0, int hlen, |
1294 | 1295 | int proto, ppphlen; |
1295 | 1296 | u_char code; |
1296 | 1297 |
|
1297 | | - if (m0->m_pkthdr.len < hlen + PIPEX_PPPMINLEN) |
| 1298 | + if ((m0->m_pkthdr.len < hlen + PIPEX_PPPMINLEN) || |
| 1299 | + (plen < PIPEX_PPPMINLEN)) |
1298 | 1300 | goto drop; |
1299 | 1301 |
|
1300 | 1302 | proto = pipex_ppp_proto(m0, session, hlen, &ppphlen); |
@@ -1358,6 +1360,7 @@ pipex_ppp_proto(struct mbuf *m0, struct pipex_session *session, int off, |
1358 | 1360 | int proto; |
1359 | 1361 | u_char *cp, pktbuf[4]; |
1360 | 1362 |
|
| 1363 | + KASSERT(m0->m_pkthdr.len > sizeof(pktbuf)); |
1361 | 1364 | m_copydata(m0, off, sizeof(pktbuf), pktbuf); |
1362 | 1365 | cp = pktbuf; |
1363 | 1366 |
|
@@ -1621,6 +1624,13 @@ pipex_pptp_lookup_session(struct mbuf *m0) |
1621 | 1624 | goto not_ours; |
1622 | 1625 | } |
1623 | 1626 |
|
| 1627 | + /* flag check */ |
| 1628 | + if ((flags & PIPEX_GRE_UNUSEDFLAGS) != 0) { |
| 1629 | + PIPEX_DBG((NULL, LOG_DEBUG, |
| 1630 | + "<%s> gre header has unused flags at pptp.", __func__)); |
| 1631 | + goto not_ours; |
| 1632 | + } |
| 1633 | + |
1624 | 1634 | /* lookup pipex session table */ |
1625 | 1635 | id = ntohs(gre.call_id); |
1626 | 1636 | session = pipex_lookup_by_session_id(PIPEX_PROTO_PPTP, id); |
@@ -2575,6 +2585,8 @@ pipex_mppe_input(struct mbuf *m0, struct pipex_session *session) |
2575 | 2585 | mppe->coher_cnt++; |
2576 | 2586 | mppe->coher_cnt &= PIPEX_COHERENCY_CNT_MASK; |
2577 | 2587 | } |
| 2588 | + if (m0->m_pkthdr.len < PIPEX_PPPMINLEN) |
| 2589 | + goto drop; |
2578 | 2590 |
|
2579 | 2591 | pipex_ppp_input(m0, session, 1); |
2580 | 2592 |
|
|
0 commit comments