*/
/*
- * This version is used under SunOS 4.x, DEC Alpha OSF/1, AIX 4.x,
+ * This version is used under SunOS 4.x, Digital UNIX, AIX 4.x,
* and SVR4 systems including Solaris 2.
*
- * $Id: vjcompress.c,v 1.6 1995/05/29 06:33:55 paulus Exp $
+ * $Id: vjcompress.c,v 1.11 2004/01/17 05:47:55 carlsonj Exp $
*/
#include <sys/types.h>
#include <sys/param.h>
-#ifdef __svr4__
+#ifdef SVR4
#ifndef __GNUC__
#include <sys/byteorder.h> /* for ntohl, etc. */
#else
#endif
#include <netinet/in.h>
-#ifdef __aix4__
+#ifdef AIX4
#define _NETINET_IN_SYSTM_H_
typedef u_long n_long;
#else
#include <netinet/in_systm.h>
#endif
+#ifdef SOL2
+#include <sys/sunddi.h>
+#endif
+
#include <netinet/ip.h>
#include <netinet/tcp.h>
* with it. */
goto uncompressed;
- if (deltaS = (u_short)(ntohs(th->th_win) - ntohs(oth->th_win))) {
+ if ((deltaS = (u_short)(ntohs(th->th_win) - ntohs(oth->th_win))) > 0) {
ENCODE(deltaS);
changes |= NEW_W;
}
- if (deltaA = ntohl(th->th_ack) - ntohl(oth->th_ack)) {
+ if ((deltaA = ntohl(th->th_ack) - ntohl(oth->th_ack)) > 0) {
if (deltaA > 0xffff)
goto uncompressed;
ENCODE(deltaA);
changes |= NEW_A;
}
- if (deltaS = ntohl(th->th_seq) - ntohl(oth->th_seq)) {
+ if ((deltaS = ntohl(th->th_seq) - ntohl(oth->th_seq)) > 0) {
if (deltaS > 0xffff)
goto uncompressed;
ENCODE(deltaS);
* "Uncompress" a packet of type TYPE_UNCOMPRESSED_TCP.
*/
int
-vj_uncompress_uncomp(buf, comp)
+vj_uncompress_uncomp(buf, buflen, comp)
u_char *buf;
+ int buflen;
struct vjcompress *comp;
{
register u_int hlen;
register struct ip *ip;
ip = (struct ip *) buf;
- if (ip->ip_p >= MAX_STATES) {
+ hlen = getip_hl(*ip) << 2;
+ if (ip->ip_p >= MAX_STATES
+ || hlen + sizeof(struct tcphdr) > buflen
+ || (hlen += getth_off(*((struct tcphdr *)&((char *)ip)[hlen])) << 2)
+ > buflen
+ || hlen > MAX_HDR) {
comp->flags |= VJF_TOSS;
INCR(vjs_errorin);
return (0);
cs = &comp->rstate[comp->last_recv = ip->ip_p];
comp->flags &=~ VJF_TOSS;
ip->ip_p = IPPROTO_TCP;
- hlen = getip_hl(*ip);
- hlen += getth_off(*((struct tcphdr *)&((int *)ip)[hlen]));
- hlen <<= 2;
BCOPY(ip, &cs->cs_ip, hlen);
cs->cs_hlen = hlen;
INCR(vjs_uncompressedin);