diff options
author | brian <brian@FreeBSD.org> | 2000-01-03 20:09:23 +0000 |
---|---|---|
committer | brian <brian@FreeBSD.org> | 2000-01-03 20:09:23 +0000 |
commit | 928cb58803557123834cbc1a360cc2c76de8fe3b (patch) | |
tree | 66b14e59b870987bd69cf215347f6b9753f2f5c4 /usr.sbin/ppp | |
parent | 4e3562decbae6b85c02a780004c559dfc46b8077 (diff) | |
download | FreeBSD-src-928cb58803557123834cbc1a360cc2c76de8fe3b.zip FreeBSD-src-928cb58803557123834cbc1a360cc2c76de8fe3b.tar.gz |
Ensure that there's a bit of extra space in our buffer when it's
passed to libalias. If there's not enough space, things like ftp
PORT commands start failing....
Reported by: Gianmarco Giovannelli <gmarco@giovannelli.it>
Diffstat (limited to 'usr.sbin/ppp')
-rw-r--r-- | usr.sbin/ppp/mbuf.c | 19 | ||||
-rw-r--r-- | usr.sbin/ppp/mbuf.h | 1 | ||||
-rw-r--r-- | usr.sbin/ppp/nat_cmd.c | 8 |
3 files changed, 26 insertions, 2 deletions
diff --git a/usr.sbin/ppp/mbuf.c b/usr.sbin/ppp/mbuf.c index 2d1df62..5bd58dc 100644 --- a/usr.sbin/ppp/mbuf.c +++ b/usr.sbin/ppp/mbuf.c @@ -234,7 +234,8 @@ m_prepend(struct mbuf *bp, const void *ptr, size_t len, size_t extra) head = m_get(len + extra, bp ? bp->m_type : MB_UNKNOWN); head->m_offset = extra; head->m_len -= extra; - memcpy(MBUF_CTOP(head), ptr, len); + if (ptr) + memcpy(MBUF_CTOP(head), ptr, len); head->m_next = bp; return head; @@ -398,3 +399,19 @@ m_settype(struct mbuf *bp, int type) MemMap[type].octets += bp->m_size; } } + +struct mbuf * +m_append(struct mbuf *m, const void *v, size_t sz) +{ + if (m) { + while (m->m_next) + m = m->m_next; + if (m->m_size - m->m_len > sz) + m->m_len += sz; + else + m->m_next = m_prepend(NULL, v, sz, 0); + } else + m = m_prepend(NULL, v, sz, 0); + + return m; +} diff --git a/usr.sbin/ppp/mbuf.h b/usr.sbin/ppp/mbuf.h index 20921cc..e89e820 100644 --- a/usr.sbin/ppp/mbuf.h +++ b/usr.sbin/ppp/mbuf.h @@ -98,6 +98,7 @@ extern struct mbuf *m_prepend(struct mbuf *, const void *, size_t, size_t); extern struct mbuf *m_adj(struct mbuf *, ssize_t); extern struct mbuf *m_pullup(struct mbuf *); extern void m_settype(struct mbuf *, int); +extern struct mbuf *m_append(struct mbuf *, const void *, size_t); extern int mbuf_Show(struct cmdargs const *); diff --git a/usr.sbin/ppp/nat_cmd.c b/usr.sbin/ppp/nat_cmd.c index bc78929..a2fb917 100644 --- a/usr.sbin/ppp/nat_cmd.c +++ b/usr.sbin/ppp/nat_cmd.c @@ -52,6 +52,8 @@ #include "bundle.h" +#define NAT_EXTRABUF (13) + static int StrToAddr(const char *, struct in_addr *); static int StrToPortRange(const char *, u_short *, u_short *, const char *); static int StrToAddrAndPort(const char *, struct in_addr *, u_short *, @@ -344,8 +346,10 @@ nat_LayerPush(struct bundle *bundle, struct link *l, struct mbuf *bp, log_Printf(LogDEBUG, "nat_LayerPush: PROTO_IP -> PROTO_IP\n"); m_settype(bp, MB_NATOUT); - bp = m_pullup(bp); + /* Ensure there's a bit of extra buffer for the NAT code... */ + bp = m_pullup(m_append(bp, NULL, NAT_EXTRABUF)); PacketAliasOut(MBUF_CTOP(bp), bp->m_len); + bp->m_len = ntohs(((struct ip *)MBUF_CTOP(bp))->ip_len); return bp; } @@ -372,6 +376,8 @@ nat_LayerPull(struct bundle *bundle, struct link *l, struct mbuf *bp, (pip->ip_p == IPPROTO_IPIP && IN_CLASSD(ntohl(piip->ip_dst.s_addr)))) return bp; + /* Ensure there's a bit of extra buffer for the NAT code... */ + bp = m_pullup(m_append(bp, NULL, NAT_EXTRABUF)); ret = PacketAliasIn(MBUF_CTOP(bp), bp->m_len); bp->m_len = ntohs(pip->ip_len); |