wprobe: fix some endianness fail in the l2 filter code

SVN-Revision: 16732
owl
Felix Fietkau 2009-07-07 03:44:31 +00:00
parent 5b35d1851c
commit 959bae3462
1 changed files with 7 additions and 4 deletions

View File

@ -844,6 +844,7 @@ wprobe_check_filter(void *data, int datalen, int gs)
hdr->name[31] = 0; hdr->name[31] = 0;
cur_is = be32_to_cpu(hdr->n_items); cur_is = be32_to_cpu(hdr->n_items);
hdr->n_items = cur_is;
is += cur_is; is += cur_is;
for (j = 0; j < cur_is; j++) { for (j = 0; j < cur_is; j++) {
struct sock_filter *sf; struct sock_filter *sf;
@ -854,11 +855,13 @@ wprobe_check_filter(void *data, int datalen, int gs)
if (data > end) if (data > end)
goto overrun; goto overrun;
if (hdr->n_items > 1024) hdr->name[31] = 0;
n_items = be32_to_cpu(hdr->n_items);
hdr->n_items = n_items;
if (n_items > 1024)
goto overrun; goto overrun;
hdr->name[31] = 0;
hdr->n_items = n_items = be32_to_cpu(hdr->n_items);
sf = data; sf = data;
if (n_items > 0) { if (n_items > 0) {
for (k = 0; k < n_items; k++) { for (k = 0; k < n_items; k++) {
@ -968,7 +971,7 @@ wprobe_set_filter(struct wprobe_iface *dev, void *data, int len)
for (j = 0; j < g->n_items; j++) { for (j = 0; j < g->n_items; j++) {
hdr = data; hdr = data;
f->items[cur_is++] = data; f->items[cur_is++] = data;
data += sizeof(*hdr) + be32_to_cpu(hdr->n_items) * sizeof(struct sock_filter); data += sizeof(*hdr) + hdr->n_items * sizeof(struct sock_filter);
} }
} }
rcu_assign_pointer(dev->active_filter, f); rcu_assign_pointer(dev->active_filter, f);