From owner-p4-projects@FreeBSD.ORG Wed Feb 7 19:08:28 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1CD1116A40A; Wed, 7 Feb 2007 19:08:28 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id E2FBC16A408 for ; Wed, 7 Feb 2007 19:08:27 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id D278813C47E for ; Wed, 7 Feb 2007 19:08:27 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l17J8RXK045482 for ; Wed, 7 Feb 2007 19:08:27 GMT (envelope-from piso@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l17J8Rbl045479 for perforce@freebsd.org; Wed, 7 Feb 2007 19:08:27 GMT (envelope-from piso@freebsd.org) Date: Wed, 7 Feb 2007 19:08:27 GMT Message-Id: <200702071908.l17J8Rbl045479@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to piso@freebsd.org using -f From: Paolo Pisati To: Perforce Change Reviews Cc: Subject: PERFORCE change 114202 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 Feb 2007 19:08:28 -0000 http://perforce.freebsd.org/chv.cgi?CH=114202 Change 114202 by piso@piso_newluxor on 2007/02/07 19:07:31 Start teaching mbuf to libalias's modules: for now, just modify the interfaces, and make all the modules compile. Moreover, in the main libalias code, pullup & fix pointers after modules usage (find_handler()). Next to go: review all the modules one by one, and pullup enough data when they peek & poke packet's payload. Affected files ... .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#60 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_cuseeme.c#15 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_dummy.c#15 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_ftp.c#16 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_irc.c#17 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_local.h#22 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_mod.c#27 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_mod.h#24 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_nbt.c#14 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_pptp.c#14 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_skinny.c#12 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_smedia.c#17 edit Differences ... ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#60 (text+ko) ==== @@ -761,10 +761,12 @@ alias_port = ud->uh_dport; ud->uh_dport = GetOriginalPort(lnk); - /* XXX broken - Walk out chain. */ - error = find_handler(IN, UDP, la, pip, &ad); - // XXX m_pullup() - + error = find_handler(IN, UDP, la, ptr, &ad); + PULLUP_IPUDPHDR(pip, ptr); + if (pip == NULL) + return (PKT_ALIAS_IGNORED); + ud = (struct udphdr *)ip_next(pip); + /* If UDP checksum is not zero, then adjust since destination port */ /* is being unaliased and destination address is being altered. */ if (ud->uh_sum != 0) { @@ -827,9 +829,11 @@ alias_address = GetAliasAddress(lnk); alias_port = GetAliasPort(lnk); - /* XXX broken - Walk out chain. */ - error = find_handler(OUT, UDP, la, pip, &ad); - // XXX m_pullup() + error = find_handler(OUT, UDP, la, ptr, &ad); + PULLUP_IPUDPHDR(pip, ptr); + if (pip == NULL) + return (PKT_ALIAS_IGNORED); + ud = (struct udphdr *)ip_next(pip); /* If UDP checksum is not zero, adjust since source port is */ /* being aliased and source address is being altered */ @@ -898,9 +902,11 @@ .maxpktsize = 0 }; - /* XXX broken - Walk out chain. */ - error = find_handler(IN, TCP, la, pip, &ad); - // XXX m_pullup() + error = find_handler(IN, TCP, la, ptr, &ad); + PULLUP_IPTCPHDR(pip, ptr); + if (pip == NULL) + return (PKT_ALIAS_IGNORED); + tc = (struct tcphdr *)ip_next(pip); alias_address = GetAliasAddress(lnk); original_address = GetOriginalAddress(lnk); @@ -1068,9 +1074,11 @@ /* Monitor TCP connection state */ TcpMonitorOut(lnk, tc->th_flags); - /* XXX broken - Walk out chain. */ - error = find_handler(OUT, TCP, la, pip, &ad); - // XXX m_pullup() + error = find_handler(OUT, TCP, la, ptr, &ad); + PULLUP_IPTCPHDR(pip, ptr); + if (pip == NULL) + return (PKT_ALIAS_IGNORED); + tc = (struct tcphdr *)ip_next(pip); /* Adjust TCP checksum since source port is being aliased */ /* and source address is being altered */ @@ -1333,9 +1341,10 @@ .maxpktsize = 0 }; - /* XXX broken - Walk out chain. */ - error = find_handler(IN, IP, la, pip, &ad); - // XXX m_pullup() + error = find_handler(IN, IP, la, ptr, &ad); + PULLUP_IPHDR(pip, ptr); + if (pip == NULL) + return (PKT_ALIAS_IGNORED); if (error == 0) iresult = PKT_ALIAS_OK; else @@ -1481,9 +1490,11 @@ .dport = NULL, .maxpktsize = 0 }; - /* XXX broken - Walk out chain. */ - error = find_handler(OUT, IP, la, pip, &ad); - // XXX m_pullup() + + error = find_handler(OUT, IP, la, ptr, &ad); + PULLUP_IPHDR(pip, ptr); + if (pip == NULL) + return (PKT_ALIAS_IGNORED); if (error == 0) iresult = PKT_ALIAS_OK; else ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_cuseeme.c#15 (text+ko) ==== @@ -56,11 +56,11 @@ #define CUSEEME_PORT_NUMBER 7648 static void -AliasHandleCUSeeMeOut(struct libalias *la, struct ip *pip, +AliasHandleCUSeeMeOut(struct libalias *la, pkt_t ptr, struct alias_link *lnk); static void -AliasHandleCUSeeMeIn(struct libalias *la, struct ip *pip, +AliasHandleCUSeeMeIn(struct libalias *la, pkt_t ptr, struct in_addr original_addr); static int @@ -75,18 +75,18 @@ } static int -protohandlerin(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandlerin(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - AliasHandleCUSeeMeIn(la, pip, *ah->oaddr); + AliasHandleCUSeeMeIn(la, ptr, *ah->oaddr); return (0); } static int -protohandlerout(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandlerout(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - AliasHandleCUSeeMeOut(la, pip, ah->lnk); + AliasHandleCUSeeMeOut(la, ptr, ah->lnk); return (0); } @@ -173,14 +173,21 @@ }; static void -AliasHandleCUSeeMeOut(struct libalias *la, struct ip *pip, struct alias_link *lnk) +AliasHandleCUSeeMeOut(struct libalias *la, pkt_t ptr, struct alias_link *lnk) { - struct udphdr *ud = ip_next(pip); + struct ip *pip; + struct udphdr *ud; + + PULLUP_UDPHDR(pip, ptr); + if (pip == NULL) + return; + ud = ip_next(pip); if (ntohs(ud->uh_ulen) - sizeof(struct udphdr) >= sizeof(struct cu_header)) { struct cu_header *cu; struct alias_link *cu_lnk; + // XXX broken cu = udp_next(ud); if (cu->addr) cu->addr = (u_int32_t) GetAliasAddress(lnk).s_addr; @@ -196,9 +203,10 @@ } static void -AliasHandleCUSeeMeIn(struct libalias *la, struct ip *pip, struct in_addr original_addr) +AliasHandleCUSeeMeIn(struct libalias *la, pkt_t ptr, struct in_addr original_addr) { struct in_addr alias_addr; + struct ip *pip; struct udphdr *ud; struct cu_header *cu; struct oc_header *oc; @@ -207,8 +215,12 @@ int i; (void)la; + PULLUP_UDPHDR(pip, ptr); + if (pip == NULL) + return; alias_addr.s_addr = pip->ip_dst.s_addr; ud = ip_next(pip); + // XXX broken cu = udp_next(ud); oc = (struct oc_header *)(cu + 1); ci = (struct client_info *)(oc + 1); ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_dummy.c#15 (text+ko) ==== @@ -57,7 +57,7 @@ #endif static void -AliasHandleDummy(struct libalias *la, struct ip *ip, struct alias_data *ah); +AliasHandleDummy(struct libalias *la, pkt_t ptr, struct alias_data *ah); static int fingerprint(struct libalias *la, struct ip *pip, struct alias_data *ah) @@ -86,10 +86,10 @@ */ static int -protohandler(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandler(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - AliasHandleDummy(la, pip, ah); + AliasHandleDummy(la, ptr, ah); return (0); } @@ -146,7 +146,7 @@ #endif static void -AliasHandleDummy(struct libalias *la, struct ip *ip, struct alias_data *ah) +AliasHandleDummy(struct libalias *la, pkt_t ptr, struct alias_data *ah) { ; /* Dummy. */ } ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_ftp.c#16 (text+ko) ==== @@ -98,7 +98,7 @@ #define FTP_CONTROL_PORT_NUMBER 21 static void -AliasHandleFtpOut(struct libalias *, struct ip *, struct alias_link *, +AliasHandleFtpOut(struct libalias *, pkt_t, struct alias_link *, int maxpacketsize); static int @@ -115,10 +115,10 @@ } static int -protohandler(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandler(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - AliasHandleFtpOut(la, pip, ah->lnk, ah->maxpktsize); + AliasHandleFtpOut(la, ptr, ah->lnk, ah->maxpktsize); return (0); } @@ -189,23 +189,28 @@ static void AliasHandleFtpOut( struct libalias *la, - struct ip *pip, /* IP packet to examine/patch */ + pkt_t ptr, /* IP packet to examine/patch */ struct alias_link *lnk, /* The link to go through (aliased port) */ int maxpacketsize /* The maximum size this packet can grow to (including headers) */ ) { int hlen, tlen, dlen, pflags; char *sptr; + struct ip *pip; struct tcphdr *tc; int ftp_message_type; /* Calculate data length of TCP packet */ + PULLUP_TCPHDR(pip, ptr); + if (pip == NULL) + return; tc = (struct tcphdr *)ip_next(pip); hlen = (pip->ip_hl + tc->th_off) << 2; tlen = ntohs(pip->ip_len); dlen = tlen - hlen; /* Place string pointer and beginning of data */ + // XXX broken sptr = (char *)pip; sptr += hlen; ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_irc.c#17 (text+ko) ==== @@ -83,7 +83,7 @@ #define DBprintf(a) static void -AliasHandleIrcOut(struct libalias *, struct ip *, struct alias_link *, +AliasHandleIrcOut(struct libalias *, pkt_t, struct alias_link *, int maxpacketsize); static int @@ -100,10 +100,10 @@ } static int -protohandler(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandler(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - AliasHandleIrcOut(la, pip, ah->lnk, ah->maxpktsize); + AliasHandleIrcOut(la, ptr, ah->lnk, ah->maxpktsize); return (0); } @@ -154,7 +154,7 @@ static void AliasHandleIrcOut(struct libalias *la, - struct ip *pip, /* IP packet to examine */ + pkt_t ptr, /* IP packet to examine */ struct alias_link *lnk, /* Which link are we on? */ int maxsize /* Maximum size of IP packet including * headers */ @@ -164,10 +164,14 @@ struct in_addr true_addr; u_short true_port; char *sptr; + struct ip *pip; struct tcphdr *tc; int i; /* Iterator through the source */ /* Calculate data length of TCP packet */ + PULLUP_TCPHDR(pip, ptr); + if (pip == NULL) + return; tc = (struct tcphdr *)ip_next(pip); hlen = (pip->ip_hl + tc->th_off) << 2; tlen = ntohs(pip->ip_len); @@ -181,6 +185,7 @@ return; /* Place string pointer at beginning of data */ + // XXX broken sptr = (char *)pip; sptr += hlen; maxsize -= hlen; /* We're interested in maximum size of ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_local.h#22 (text+ko) ==== @@ -214,8 +214,19 @@ #define PULLUP_IPTCPHDR(pip, ptr) do { \ *ptr = m_pullup((*ptr), sizeof(struct ip)); \ (pip) = mtod(*ptr, struct ip *); \ - *ptr = m_pullup((*ptr), (pip->ip_hl << 2) + sizeof(struct tcphdr)); \ - (pip) = mtod(*ptr, struct ip *); \ + if (pip != NULL) { \ + *ptr = m_pullup((*ptr), (pip->ip_hl << 2) + sizeof(struct tcphdr)); \ + (pip) = mtod(*ptr, struct ip *); \ + } \ +} while (0) + +#define PULLUP_IPUDPHDR(pip, ptr) do { \ + *ptr = m_pullup((*ptr), sizeof(struct ip)); \ + (pip) = mtod(*ptr, struct ip *); \ + if (pip != NULL) { \ + *ptr = m_pullup((*ptr), (pip->ip_hl << 2) + sizeof(struct udphdr)); \ + (pip) = mtod(*ptr, struct ip *); \ + } \ } while (0) #else typedef char * pkt_t; @@ -226,6 +237,7 @@ #define PULLUP_ICMPHDR(pip, ptr) pip = (struct ip *)ptr #define PULLUP_ICMPIP64(pip, ptr, ic) pip = (struct ip *)ptr #define PULLUP_IPTCPHDR(pip, ptr) pip = (struct ip *)ptr +#define PULLUP_IPUDPHDR(pip, ptr) pip = (struct ip *)ptr #endif /* ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_mod.c#27 (text+ko) ==== @@ -215,18 +215,22 @@ } int -find_handler(int8_t dir, int8_t proto, struct libalias *la, struct ip *pip, +find_handler(int8_t dir, int8_t proto, struct libalias *la, pkt_t ptr, struct alias_data *ad) { + struct ip *pip; struct proto_handler *p; int error = ENOENT; + PULLUP_IPHDR(pip, ptr); + if (pip == NULL) + return (error); LIBALIAS_RLOCK(); LIST_FOREACH(p, &handler_chain, entries) { if ((p->dir & dir) && (p->proto & proto)) if (p->fingerprint(la, pip, ad) == 0) { - error = p->protohandler(la, pip, ad); + error = p->protohandler(la, ptr, ad); break; } } ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_mod.h#24 (text+ko) ==== @@ -83,7 +83,7 @@ int (*fingerprint)(struct libalias *la, /* Fingerprint * function. */ struct ip *pip, struct alias_data *ah); int (*protohandler)(struct libalias *la, /* Aliasing * function. */ - struct ip *pip, struct alias_data *ah); + pkt_t ptr, struct alias_data *ah); LIST_ENTRY(proto_handler) entries; }; @@ -114,7 +114,7 @@ int LibAliasDetachHandlers(struct proto_handler *); int detach_handler(struct proto_handler *); int find_handler(int8_t, int8_t, struct libalias *, - struct ip *, struct alias_data *); + pkt_t ptr, struct alias_data *); struct proto_handler *first_handler(void); /* Functions used with dll module. */ ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_nbt.c#14 (text+ko) ==== @@ -69,11 +69,11 @@ #define NETBIOS_DGM_PORT_NUMBER 138 static int -AliasHandleUdpNbt(struct libalias *, struct ip *, struct alias_link *, +AliasHandleUdpNbt(struct libalias *, pkt_t, struct alias_link *, struct in_addr *, u_short); static int -AliasHandleUdpNbtNS(struct libalias *, struct ip *, struct alias_link *, +AliasHandleUdpNbtNS(struct libalias *, pkt_t, struct alias_link *, struct in_addr *, u_short *, struct in_addr *, u_short *); static int fingerprint1(struct libalias *la, struct ip *pip, struct alias_data *ah) @@ -89,10 +89,10 @@ } static int -protohandler1(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandler1(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - AliasHandleUdpNbt(la, pip, ah->lnk, ah->aaddr, *ah->aport); + AliasHandleUdpNbt(la, ptr, ah->lnk, ah->aaddr, *ah->aport); return (0); } @@ -110,19 +110,23 @@ } static int -protohandler2in(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandler2in(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - AliasHandleUdpNbtNS(la, pip, ah->lnk, ah->aaddr, ah->aport, + AliasHandleUdpNbtNS(la, ptr, ah->lnk, ah->aaddr, ah->aport, ah->oaddr, ah->dport); return (0); } static int -protohandler2out(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandler2out(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - - AliasHandleUdpNbtNS(la, pip, ah->lnk, &pip->ip_src, ah->sport, + struct ip *pip; + + PULLUP_IPHDR(pip, ptr); + if (pip == NULL) + return (-1); + AliasHandleUdpNbtNS(la, ptr, ah->lnk, &pip->ip_src, ah->sport, ah->aaddr, ah->aport); return (0); } @@ -335,12 +339,13 @@ static int AliasHandleUdpNbt( struct libalias *la, - struct ip *pip, /* IP packet to examine/patch */ + pkt_t ptr, /* IP packet to examine/patch */ struct alias_link *lnk, struct in_addr *alias_address, u_short alias_port ) { + struct ip *pip; struct udphdr *uh; NbtDataHeader *ndh; u_char *p = NULL; @@ -350,9 +355,13 @@ (void)lnk; /* Calculate data length of UDP packet */ + PULLUP_UDPHDR(pip ,ptr); + if (pip == NULL) + return (-1); uh = (struct udphdr *)ip_next(pip); pmax = (char *)uh + ntohs(uh->uh_ulen); + // XXX broken ndh = (NbtDataHeader *)udp_next(uh); if ((char *)(ndh + 1) > pmax) return (-1); @@ -763,13 +772,14 @@ static int AliasHandleUdpNbtNS( struct libalias *la, - struct ip *pip, /* IP packet to examine/patch */ + pkt_t ptr, /* IP packet to examine/patch */ struct alias_link *lnk, struct in_addr *alias_address, u_short * alias_port, struct in_addr *original_address, u_short * original_port) { + struct ip *pip; struct udphdr *uh; NbtNSHeader *nsh; u_char *p; @@ -784,8 +794,17 @@ nbtarg.oldport = *alias_port; nbtarg.newaddr = *original_address; nbtarg.newport = *original_port; + + // XXX as we m_pullup() some more data below, alias_address could + // XXX point to junk data afterwards: invalidate it now to avoid + // XXX people using it later (for more info see above -> + // XXX protohandler2out()) + alias_address = NULL; /* Calculate data length of UDP packet */ + PULLUP_UDPHDR(pip, ptr); + if (pip == NULL) + return (-1); uh = (struct udphdr *)ip_next(pip); nbtarg.uh_sum = &(uh->uh_sum); nsh = (NbtNSHeader *)udp_next(uh); ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_pptp.c#14 (text+ko) ==== @@ -67,16 +67,16 @@ #define PPTP_CONTROL_PORT_NUMBER 1723 static void -AliasHandlePptpOut(struct libalias *, struct ip *, struct alias_link *); +AliasHandlePptpOut(struct libalias *, pkt_t, struct alias_link *); static void -AliasHandlePptpIn(struct libalias *, struct ip *, struct alias_link *); +AliasHandlePptpIn(struct libalias *, pkt_t, struct alias_link *); static int -AliasHandlePptpGreOut(struct libalias *, struct ip *); +AliasHandlePptpGreOut(struct libalias *, pkt_t); static int -AliasHandlePptpGreIn(struct libalias *, struct ip *); +AliasHandlePptpGreIn(struct libalias *, pkt_t); static int fingerprint(struct libalias *la, struct ip *pip, struct alias_data *ah) @@ -98,36 +98,36 @@ } static int -protohandlerin(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandlerin(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - AliasHandlePptpIn(la, pip, ah->lnk); + AliasHandlePptpIn(la, ptr, ah->lnk); return (0); } static int -protohandlerout(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandlerout(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - AliasHandlePptpOut(la, pip, ah->lnk); + AliasHandlePptpOut(la, ptr, ah->lnk); return (0); } static int -protohandlergrein(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandlergrein(struct libalias *la, pkt_t ptr, struct alias_data *ah) { if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY || - AliasHandlePptpGreIn(la, pip) == 0) + AliasHandlePptpGreIn(la, ptr) == 0) return (0); return (-1); } static int -protohandlergreout(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandlergreout(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - if (AliasHandlePptpGreOut(la, pip) == 0) + if (AliasHandlePptpGreOut(la, ptr) == 0) return (0); return (-1); } @@ -298,15 +298,19 @@ static void AliasHandlePptpOut(struct libalias *la, - struct ip *pip, /* IP packet to examine/patch */ + pkt_t ptr, /* IP packet to examine/patch */ struct alias_link *lnk) { /* The PPTP control link */ struct alias_link *pptp_lnk; PptpCallId cptr; PptpCode codes; u_int16_t ctl_type; /* control message type */ + struct ip *pip; struct tcphdr *tc; + PULLUP_IPHDR(pip, ptr); + if (pip == NULL) + return; /* Verify valid PPTP control message */ if ((cptr = AliasVerifyPptp(pip, &ctl_type)) == NULL) return; @@ -345,6 +349,9 @@ cptr->cid1 = GetAliasPort(pptp_lnk); /* Compute TCP checksum for revised packet */ + PULLUP_TCPHDR(pip ,ptr); + if (pip == NULL) + return; tc = (struct tcphdr *)ip_next(pip); accumulate -= cptr->cid1; ADJUST_CHECKSUM(accumulate, tc->th_sum); @@ -370,15 +377,19 @@ static void AliasHandlePptpIn(struct libalias *la, - struct ip *pip, /* IP packet to examine/patch */ + pkt_t ptr, /* IP packet to examine/patch */ struct alias_link *lnk) { /* The PPTP control link */ struct alias_link *pptp_lnk; PptpCallId cptr; u_int16_t *pcall_id; u_int16_t ctl_type; /* control message type */ + struct ip *pip; struct tcphdr *tc; + PULLUP_IPHDR(pip ,ptr); + if (pip == NULL) + return; /* Verify valid PPTP control message */ if ((cptr = AliasVerifyPptp(pip, &ctl_type)) == NULL) return; @@ -417,6 +428,9 @@ *pcall_id = GetOriginalPort(pptp_lnk); /* Compute TCP checksum for modified packet */ + PULLUP_TCPHDR(pip, ptr); + if (pip == NULL) + return; tc = (struct tcphdr *)ip_next(pip); accumulate -= *pcall_id; ADJUST_CHECKSUM(accumulate, tc->th_sum); @@ -472,11 +486,14 @@ } static int -AliasHandlePptpGreOut(struct libalias *la, struct ip *pip) +AliasHandlePptpGreOut(struct libalias *la, pkt_t ptr) { GreHdr *gr; struct alias_link *lnk; + struct ip *pip; + // XXX broken + PULLUP_IPHDR(pip, ptr); gr = (GreHdr *) ip_next(pip); /* Check GRE header bits. */ @@ -496,11 +513,14 @@ } static int -AliasHandlePptpGreIn(struct libalias *la, struct ip *pip) +AliasHandlePptpGreIn(struct libalias *la, pkt_t ptr) { GreHdr *gr; struct alias_link *lnk; + struct ip *pip; + // XXX broken + PULLUP_IPHDR(pip, ptr); gr = (GreHdr *) ip_next(pip); /* Check GRE header bits. */ ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_skinny.c#12 (text+ko) ==== @@ -54,7 +54,7 @@ #endif static void -AliasHandleSkinny(struct libalias *, struct ip *, struct alias_link *); +AliasHandleSkinny(struct libalias *, pkt_t ptr, struct alias_link *); static int fingerprint(struct libalias *la, struct ip *pip, struct alias_data *ah) @@ -69,10 +69,10 @@ } static int -protohandler(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandler(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - AliasHandleSkinny(la, pip, ah->lnk); + AliasHandleSkinny(la, ptr, ah->lnk); return (0); } @@ -300,20 +300,25 @@ } static void -AliasHandleSkinny(struct libalias *la, struct ip *pip, struct alias_link *lnk) +AliasHandleSkinny(struct libalias *la, pkt_t ptr, struct alias_link *lnk) { size_t hlen, tlen, dlen; + struct ip *pip; struct tcphdr *tc; u_int32_t msgId, t, len, lip; struct skinny_header *sd; size_t orig_len, skinny_hdr_len = sizeof(struct skinny_header); ConvDirection direction; + PULLUP_TCPHDR(pip, ptr); + if (pip == NULL) + return; tc = (struct tcphdr *)ip_next(pip); hlen = (pip->ip_hl + tc->th_off) << 2; tlen = ntohs(pip->ip_len); dlen = tlen - hlen; + // XXX broken sd = (struct skinny_header *)tcp_next(tc); /* ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_smedia.c#17 (text+ko) ==== @@ -129,7 +129,7 @@ #define TFTP_PORT_NUMBER 69 static void -AliasHandleRtspOut(struct libalias *, struct ip *, struct alias_link *, +AliasHandleRtspOut(struct libalias *, pkt_t ptr, struct alias_link *, int maxpacketsize); static int fingerprint(struct libalias *la, struct ip *pip, struct alias_data *ah) @@ -150,13 +150,17 @@ } static int -protohandler(struct libalias *la, struct ip *pip, struct alias_data *ah) +protohandler(struct libalias *la, pkt_t ptr, struct alias_data *ah) { - - if (ntohs(*ah->dport) == TFTP_PORT_NUMBER) + struct ip *pip; + + if (ntohs(*ah->dport) == TFTP_PORT_NUMBER) { + PULLUP_IPHDR(pip, ptr); + if (pip == NULL) + return (-1); FindRtspOut(la, pip->ip_src, pip->ip_dst, *ah->sport, *ah->aport, IPPROTO_UDP); - else AliasHandleRtspOut(la, pip, ah->lnk, ah->maxpktsize); + } else AliasHandleRtspOut(la, ptr, ah->lnk, ah->maxpktsize); return (0); } @@ -477,9 +481,10 @@ } static void -AliasHandleRtspOut(struct libalias *la, struct ip *pip, struct alias_link *lnk, int maxpacketsize) +AliasHandleRtspOut(struct libalias *la, pkt_t ptr, struct alias_link *lnk, int maxpacketsize) { int hlen, tlen, dlen; + struct ip *pip; struct tcphdr *tc; char *data; const char *setup = "SETUP", *pna = "PNA", *str200 = "200"; @@ -489,11 +494,15 @@ (void)maxpacketsize; + PULLUP_TCPHDR(pip, ptr); + if (pip == NULL) + return; tc = (struct tcphdr *)ip_next(pip); hlen = (pip->ip_hl + tc->th_off) << 2; tlen = ntohs(pip->ip_len); dlen = tlen - hlen; + // XXX broken data = (char *)pip; data += hlen;