Commit 4a6a5161 authored by Bart De Schuymer's avatar Bart De Schuymer Committed by David S. Miller

[EBTABLES]: Make it work on 32-on-64 platforms.

parent bca415fe
...@@ -33,6 +33,23 @@ struct ebt_counter ...@@ -33,6 +33,23 @@ struct ebt_counter
uint64_t bcnt; uint64_t bcnt;
}; };
struct ebt_replace
{
char name[EBT_TABLE_MAXNAMELEN];
unsigned int valid_hooks;
/* nr of rules in the table */
unsigned int nentries;
/* total size of the entries */
unsigned int entries_size;
/* start of the chains */
struct ebt_entries *hook_entry[NF_BR_NUMHOOKS];
/* nr of counters userspace expects back */
unsigned int num_counters;
/* where the kernel will put the old counters */
struct ebt_counter *counters;
char *entries;
};
struct ebt_entries { struct ebt_entries {
/* this field is always set to zero /* this field is always set to zero
* See EBT_ENTRY_OR_ENTRIES. * See EBT_ENTRY_OR_ENTRIES.
...@@ -47,7 +64,7 @@ struct ebt_entries { ...@@ -47,7 +64,7 @@ struct ebt_entries {
/* nr. of entries */ /* nr. of entries */
unsigned int nentries; unsigned int nentries;
/* entry list */ /* entry list */
char data[0]; char data[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
}; };
/* used for the bitmask of struct ebt_entry */ /* used for the bitmask of struct ebt_entry */
...@@ -87,7 +104,7 @@ struct ebt_entry_match ...@@ -87,7 +104,7 @@ struct ebt_entry_match
} u; } u;
/* size of data */ /* size of data */
unsigned int match_size; unsigned int match_size;
unsigned char data[0]; unsigned char data[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
}; };
struct ebt_entry_watcher struct ebt_entry_watcher
...@@ -98,7 +115,7 @@ struct ebt_entry_watcher ...@@ -98,7 +115,7 @@ struct ebt_entry_watcher
} u; } u;
/* size of data */ /* size of data */
unsigned int watcher_size; unsigned int watcher_size;
unsigned char data[0]; unsigned char data[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
}; };
struct ebt_entry_target struct ebt_entry_target
...@@ -109,7 +126,7 @@ struct ebt_entry_target ...@@ -109,7 +126,7 @@ struct ebt_entry_target
} u; } u;
/* size of data */ /* size of data */
unsigned int target_size; unsigned int target_size;
unsigned char data[0]; unsigned char data[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
}; };
#define EBT_STANDARD_TARGET "standard" #define EBT_STANDARD_TARGET "standard"
...@@ -143,24 +160,7 @@ struct ebt_entry { ...@@ -143,24 +160,7 @@ struct ebt_entry {
unsigned int target_offset; unsigned int target_offset;
/* sizeof ebt_entry + matches + watchers + target */ /* sizeof ebt_entry + matches + watchers + target */
unsigned int next_offset; unsigned int next_offset;
unsigned char elems[0]; unsigned char elems[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
};
struct ebt_replace
{
char name[EBT_TABLE_MAXNAMELEN];
unsigned int valid_hooks;
/* nr of rules in the table */
unsigned int nentries;
/* total size of the entries */
unsigned int entries_size;
/* start of the chains */
struct ebt_entries *hook_entry[NF_BR_NUMHOOKS];
/* nr of counters userspace expects back */
unsigned int num_counters;
/* where the kernel will put the old counters */
struct ebt_counter *counters;
char *entries;
}; };
/* {g,s}etsockopt numbers */ /* {g,s}etsockopt numbers */
...@@ -263,6 +263,8 @@ struct ebt_table ...@@ -263,6 +263,8 @@ struct ebt_table
struct module *me; struct module *me;
}; };
#define EBT_ALIGN(s) (((s) + (__alignof__(struct ebt_replace)-1)) & \
~(__alignof__(struct ebt_replace)-1))
extern int ebt_register_table(struct ebt_table *table); extern int ebt_register_table(struct ebt_table *table);
extern void ebt_unregister_table(struct ebt_table *table); extern void ebt_unregister_table(struct ebt_table *table);
extern int ebt_register_match(struct ebt_match *match); extern int ebt_register_match(struct ebt_match *match);
......
...@@ -99,7 +99,7 @@ static int ebt_arp_check(const char *tablename, unsigned int hookmask, ...@@ -99,7 +99,7 @@ static int ebt_arp_check(const char *tablename, unsigned int hookmask,
{ {
struct ebt_arp_info *info = (struct ebt_arp_info *)data; struct ebt_arp_info *info = (struct ebt_arp_info *)data;
if (datalen != sizeof(struct ebt_arp_info)) if (datalen != EBT_ALIGN(sizeof(struct ebt_arp_info)))
return -EINVAL; return -EINVAL;
if ((e->ethproto != __constant_htons(ETH_P_ARP) && if ((e->ethproto != __constant_htons(ETH_P_ARP) &&
e->ethproto != __constant_htons(ETH_P_RARP)) || e->ethproto != __constant_htons(ETH_P_RARP)) ||
......
...@@ -47,7 +47,7 @@ static int ebt_target_dnat_check(const char *tablename, unsigned int hookmask, ...@@ -47,7 +47,7 @@ static int ebt_target_dnat_check(const char *tablename, unsigned int hookmask,
(hookmask & ~((1 << NF_BR_PRE_ROUTING) | (1 << NF_BR_LOCAL_OUT)))) && (hookmask & ~((1 << NF_BR_PRE_ROUTING) | (1 << NF_BR_LOCAL_OUT)))) &&
(strcmp(tablename, "broute") || hookmask & ~(1 << NF_BR_BROUTING)) ) (strcmp(tablename, "broute") || hookmask & ~(1 << NF_BR_BROUTING)) )
return -EINVAL; return -EINVAL;
if (datalen != sizeof(struct ebt_nat_info)) if (datalen != EBT_ALIGN(sizeof(struct ebt_nat_info)))
return -EINVAL; return -EINVAL;
if (INVALID_TARGET) if (INVALID_TARGET)
return -EINVAL; return -EINVAL;
......
...@@ -75,7 +75,7 @@ static int ebt_ip_check(const char *tablename, unsigned int hookmask, ...@@ -75,7 +75,7 @@ static int ebt_ip_check(const char *tablename, unsigned int hookmask,
{ {
struct ebt_ip_info *info = (struct ebt_ip_info *)data; struct ebt_ip_info *info = (struct ebt_ip_info *)data;
if (datalen != sizeof(struct ebt_ip_info)) if (datalen != EBT_ALIGN(sizeof(struct ebt_ip_info)))
return -EINVAL; return -EINVAL;
if (e->ethproto != __constant_htons(ETH_P_IP) || if (e->ethproto != __constant_htons(ETH_P_IP) ||
e->invflags & EBT_IPROTO) e->invflags & EBT_IPROTO)
......
...@@ -22,7 +22,7 @@ static int ebt_log_check(const char *tablename, unsigned int hookmask, ...@@ -22,7 +22,7 @@ static int ebt_log_check(const char *tablename, unsigned int hookmask,
{ {
struct ebt_log_info *info = (struct ebt_log_info *)data; struct ebt_log_info *info = (struct ebt_log_info *)data;
if (datalen != sizeof(struct ebt_log_info)) if (datalen != EBT_ALIGN(sizeof(struct ebt_log_info)))
return -EINVAL; return -EINVAL;
if (info->bitmask & ~EBT_LOG_MASK) if (info->bitmask & ~EBT_LOG_MASK)
return -EINVAL; return -EINVAL;
......
...@@ -35,7 +35,7 @@ static int ebt_target_mark_check(const char *tablename, unsigned int hookmask, ...@@ -35,7 +35,7 @@ static int ebt_target_mark_check(const char *tablename, unsigned int hookmask,
{ {
struct ebt_mark_t_info *info = (struct ebt_mark_t_info *)data; struct ebt_mark_t_info *info = (struct ebt_mark_t_info *)data;
if (datalen != sizeof(struct ebt_mark_t_info)) if (datalen != EBT_ALIGN(sizeof(struct ebt_mark_t_info)))
return -EINVAL; return -EINVAL;
if (BASE_CHAIN && info->target == EBT_RETURN) if (BASE_CHAIN && info->target == EBT_RETURN)
return -EINVAL; return -EINVAL;
......
...@@ -28,7 +28,7 @@ static int ebt_mark_check(const char *tablename, unsigned int hookmask, ...@@ -28,7 +28,7 @@ static int ebt_mark_check(const char *tablename, unsigned int hookmask,
{ {
struct ebt_mark_m_info *info = (struct ebt_mark_m_info *) data; struct ebt_mark_m_info *info = (struct ebt_mark_m_info *) data;
if (datalen != sizeof(struct ebt_mark_m_info)) if (datalen != EBT_ALIGN(sizeof(struct ebt_mark_m_info)))
return -EINVAL; return -EINVAL;
if (info->bitmask & ~EBT_MARK_MASK) if (info->bitmask & ~EBT_MARK_MASK)
return -EINVAL; return -EINVAL;
......
...@@ -28,7 +28,7 @@ static int ebt_pkttype_check(const char *tablename, unsigned int hookmask, ...@@ -28,7 +28,7 @@ static int ebt_pkttype_check(const char *tablename, unsigned int hookmask,
{ {
struct ebt_pkttype_info *info = (struct ebt_pkttype_info *)data; struct ebt_pkttype_info *info = (struct ebt_pkttype_info *)data;
if (datalen != sizeof(struct ebt_pkttype_info)) if (datalen != EBT_ALIGN(sizeof(struct ebt_pkttype_info)))
return -EINVAL; return -EINVAL;
if (info->invert != 0 && info->invert != 1) if (info->invert != 0 && info->invert != 1)
return -EINVAL; return -EINVAL;
......
...@@ -47,7 +47,7 @@ static int ebt_target_redirect_check(const char *tablename, unsigned int hookmas ...@@ -47,7 +47,7 @@ static int ebt_target_redirect_check(const char *tablename, unsigned int hookmas
{ {
struct ebt_redirect_info *info = (struct ebt_redirect_info *)data; struct ebt_redirect_info *info = (struct ebt_redirect_info *)data;
if (datalen != sizeof(struct ebt_redirect_info)) if (datalen != EBT_ALIGN(sizeof(struct ebt_redirect_info)))
return -EINVAL; return -EINVAL;
if (BASE_CHAIN && info->target == EBT_RETURN) if (BASE_CHAIN && info->target == EBT_RETURN)
return -EINVAL; return -EINVAL;
......
...@@ -40,7 +40,7 @@ static int ebt_target_snat_check(const char *tablename, unsigned int hookmask, ...@@ -40,7 +40,7 @@ static int ebt_target_snat_check(const char *tablename, unsigned int hookmask,
{ {
struct ebt_nat_info *info = (struct ebt_nat_info *) data; struct ebt_nat_info *info = (struct ebt_nat_info *) data;
if (datalen != sizeof(struct ebt_nat_info)) if (datalen != EBT_ALIGN(sizeof(struct ebt_nat_info)))
return -EINVAL; return -EINVAL;
if (BASE_CHAIN && info->target == EBT_RETURN) if (BASE_CHAIN && info->target == EBT_RETURN)
return -EINVAL; return -EINVAL;
......
...@@ -150,7 +150,7 @@ static int ebt_stp_check(const char *tablename, unsigned int hookmask, ...@@ -150,7 +150,7 @@ static int ebt_stp_check(const char *tablename, unsigned int hookmask,
const struct ebt_entry *e, void *data, unsigned int datalen) const struct ebt_entry *e, void *data, unsigned int datalen)
{ {
struct ebt_stp_info *info = (struct ebt_stp_info *)data; struct ebt_stp_info *info = (struct ebt_stp_info *)data;
int len = sizeof(struct ebt_stp_info); int len = EBT_ALIGN(sizeof(struct ebt_stp_info));
uint8_t bridge_ula[6] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 }; uint8_t bridge_ula[6] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 };
uint8_t msk[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; uint8_t msk[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
......
...@@ -35,7 +35,7 @@ MODULE_DESCRIPTION("802.1Q match module (ebtables extension), v" ...@@ -35,7 +35,7 @@ MODULE_DESCRIPTION("802.1Q match module (ebtables extension), v"
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
#define DEBUG_MSG(...) if (debug) printk (KERN_DEBUG "ebt_vlan: " __VA_ARGS__) #define DEBUG_MSG(args...) if (debug) printk (KERN_DEBUG "ebt_vlan: " args)
#define INV_FLAG(_inv_flag_) (info->invflags & _inv_flag_) ? "!" : "" #define INV_FLAG(_inv_flag_) (info->invflags & _inv_flag_) ? "!" : ""
#define GET_BITMASK(_BIT_MASK_) info->bitmask & _BIT_MASK_ #define GET_BITMASK(_BIT_MASK_) info->bitmask & _BIT_MASK_
#define SET_BITMASK(_BIT_MASK_) info->bitmask |= _BIT_MASK_ #define SET_BITMASK(_BIT_MASK_) info->bitmask |= _BIT_MASK_
...@@ -94,7 +94,7 @@ ebt_check_vlan(const char *tablename, ...@@ -94,7 +94,7 @@ ebt_check_vlan(const char *tablename,
struct ebt_vlan_info *info = (struct ebt_vlan_info *) data; struct ebt_vlan_info *info = (struct ebt_vlan_info *) data;
/* Parameters buffer overflow check */ /* Parameters buffer overflow check */
if (datalen != sizeof(struct ebt_vlan_info)) { if (datalen != EBT_ALIGN(sizeof(struct ebt_vlan_info))) {
DEBUG_MSG DEBUG_MSG
("passed size %d is not eq to ebt_vlan_info (%Zd)\n", ("passed size %d is not eq to ebt_vlan_info (%Zd)\n",
datalen, sizeof(struct ebt_vlan_info)); datalen, sizeof(struct ebt_vlan_info));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment