Packet headers can be examined through unaligned addresses. This patch

fixes this, especially for MIPS & SPARC platforms. [Initial patch from
Brian J. Johnson]
This commit is contained in:
gbeauche 2006-01-17 21:19:12 +00:00
parent 998e1f7f7b
commit 5ee0a6741b
8 changed files with 82 additions and 9 deletions

View File

@ -90,6 +90,10 @@
#define BOOTP_VENDOR_LEN 64 #define BOOTP_VENDOR_LEN 64
#define DHCP_OPT_LEN 312 #define DHCP_OPT_LEN 312
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(1)
#endif
struct bootp_t { struct bootp_t {
struct ip ip; struct ip ip;
struct udphdr udp; struct udphdr udp;
@ -108,6 +112,10 @@ struct bootp_t {
uint8_t bp_sname[64]; uint8_t bp_sname[64];
uint8_t bp_file[128]; uint8_t bp_file[128];
uint8_t bp_vend[DHCP_OPT_LEN]; uint8_t bp_vend[DHCP_OPT_LEN];
}; } PACKED__;
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(0)
#endif
void bootp_input(struct mbuf *m); void bootp_input(struct mbuf *m);

View File

@ -80,6 +80,10 @@ typedef u_int32_t n_long; /* long as received from the net */
* pragmatically since otherwise unsigned comparisons can result * pragmatically since otherwise unsigned comparisons can result
* against negative integers quite easily, and fail in subtle ways. * against negative integers quite easily, and fail in subtle ways.
*/ */
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(1)
#endif
struct ip { struct ip {
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
u_int ip_v:4, /* version */ u_int ip_v:4, /* version */
@ -99,7 +103,11 @@ struct ip {
u_int8_t ip_p; /* protocol */ u_int8_t ip_p; /* protocol */
u_int16_t ip_sum; /* checksum */ u_int16_t ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */ struct in_addr ip_src,ip_dst; /* source and dest address */
}; } PACKED__;
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(0)
#endif
#define IP_MAXPACKET 65535 /* maximum packet size */ #define IP_MAXPACKET 65535 /* maximum packet size */
@ -143,6 +151,10 @@ struct ip {
/* /*
* Time stamp option structure. * Time stamp option structure.
*/ */
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(1)
#endif
struct ip_timestamp { struct ip_timestamp {
u_int8_t ipt_code; /* IPOPT_TS */ u_int8_t ipt_code; /* IPOPT_TS */
u_int8_t ipt_len; /* size of structure (variable) */ u_int8_t ipt_len; /* size of structure (variable) */
@ -161,7 +173,11 @@ struct ip_timestamp {
n_long ipt_time; n_long ipt_time;
} ipt_ta[1]; } ipt_ta[1];
} ipt_timestamp; } ipt_timestamp;
}; } PACKED__;
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(0)
#endif
/* flag bits for ipt_flg */ /* flag bits for ipt_flg */
#define IPOPT_TS_TSONLY 0 /* timestamps only */ #define IPOPT_TS_TSONLY 0 /* timestamps only */
@ -208,6 +224,10 @@ typedef caddr32_t ipasfragp_32;
/* /*
* Overlay for ip header used by other protocols (tcp, udp). * Overlay for ip header used by other protocols (tcp, udp).
*/ */
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(1)
#endif
struct ipovly { struct ipovly {
caddr32_t ih_next, ih_prev; /* for protocol sequence q's */ caddr32_t ih_next, ih_prev; /* for protocol sequence q's */
u_int8_t ih_x1; /* (unused) */ u_int8_t ih_x1; /* (unused) */
@ -215,7 +235,11 @@ struct ipovly {
int16_t ih_len; /* protocol length */ int16_t ih_len; /* protocol length */
struct in_addr ih_src; /* source internet address */ struct in_addr ih_src; /* source internet address */
struct in_addr ih_dst; /* destination internet address */ struct in_addr ih_dst; /* destination internet address */
}; } PACKED__;
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(0)
#endif
/* /*
* Ip reassembly queue structure. Each fragment * Ip reassembly queue structure. Each fragment

View File

@ -47,6 +47,10 @@ typedef u_int32_t n_time;
/* /*
* Structure of an icmp header. * Structure of an icmp header.
*/ */
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(1)
#endif
struct icmp { struct icmp {
u_char icmp_type; /* type of message, see below */ u_char icmp_type; /* type of message, see below */
u_char icmp_code; /* type sub code */ u_char icmp_code; /* type sub code */
@ -92,7 +96,11 @@ struct icmp {
#define icmp_ip icmp_dun.id_ip.idi_ip #define icmp_ip icmp_dun.id_ip.idi_ip
#define icmp_mask icmp_dun.id_mask #define icmp_mask icmp_dun.id_mask
#define icmp_data icmp_dun.id_data #define icmp_data icmp_dun.id_data
}; } PACKED__;
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(0)
#endif
/* /*
* Lower bounds on packet lengths for various types. * Lower bounds on packet lengths for various types.

View File

@ -595,7 +595,7 @@ void slirp_input(const uint8_t *pkt, int pkt_len)
if (pkt_len < ETH_HLEN) if (pkt_len < ETH_HLEN)
return; return;
proto = ntohs(*(uint16_t *)(pkt + 12)); proto = (pkt[12] << 8) | pkt[13];
switch(proto) { switch(proto) {
case ETH_P_ARP: case ETH_P_ARP:
arp_input(pkt, pkt_len); arp_input(pkt, pkt_len);

View File

@ -195,6 +195,15 @@ int inet_aton _P((const char *cp, struct in_addr *ia));
#include "debug.h" #include "debug.h"
#if defined __GNUC__
#define PACKED__ __attribute__ ((packed))
#elif defined __sgi
#define PRAGMA_PACK_SUPPORTED 1
#define PACKED__
#else
#error "Packed attribute or pragma shall be supported"
#endif
#include "ip.h" #include "ip.h"
#include "tcp.h" #include "tcp.h"
#include "tcp_timer.h" #include "tcp_timer.h"

View File

@ -53,6 +53,10 @@ extern struct socket *tcp_last_so;
* TCP header. * TCP header.
* Per RFC 793, September, 1981. * Per RFC 793, September, 1981.
*/ */
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(1)
#endif
struct tcphdr { struct tcphdr {
u_int16_t th_sport; /* source port */ u_int16_t th_sport; /* source port */
u_int16_t th_dport; /* destination port */ u_int16_t th_dport; /* destination port */
@ -75,7 +79,11 @@ struct tcphdr {
u_int16_t th_win; /* window */ u_int16_t th_win; /* window */
u_int16_t th_sum; /* checksum */ u_int16_t th_sum; /* checksum */
u_int16_t th_urp; /* urgent pointer */ u_int16_t th_urp; /* urgent pointer */
}; } PACKED__;
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(0)
#endif
#include "tcp_var.h" #include "tcp_var.h"

View File

@ -12,6 +12,10 @@
#define TFTP_FILENAME_MAX 512 #define TFTP_FILENAME_MAX 512
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(1)
#endif
struct tftp_t { struct tftp_t {
struct ip ip; struct ip ip;
struct udphdr udp; struct udphdr udp;
@ -27,6 +31,10 @@ struct tftp_t {
} tp_error; } tp_error;
u_int8_t tp_buf[512 + 2]; u_int8_t tp_buf[512 + 2];
} x; } x;
}; } PACKED__;
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(0)
#endif
void tftp_input(struct mbuf *m); void tftp_input(struct mbuf *m);

View File

@ -46,12 +46,20 @@ extern struct socket *udp_last_so;
* Udp protocol header. * Udp protocol header.
* Per RFC 768, September, 1981. * Per RFC 768, September, 1981.
*/ */
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(1)
#endif
struct udphdr { struct udphdr {
u_int16_t uh_sport; /* source port */ u_int16_t uh_sport; /* source port */
u_int16_t uh_dport; /* destination port */ u_int16_t uh_dport; /* destination port */
int16_t uh_ulen; /* udp length */ int16_t uh_ulen; /* udp length */
u_int16_t uh_sum; /* udp checksum */ u_int16_t uh_sum; /* udp checksum */
}; } PACKED__;
#ifdef PRAGMA_PACK_SUPPORTED
#pragma pack(0)
#endif
/* /*
* UDP kernel structures and variables. * UDP kernel structures and variables.