wprobe: fix some endianness fail in the l2 filter code
authorFelix Fietkau <nbd@openwrt.org>
Tue, 7 Jul 2009 03:44:31 +0000 (03:44 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Tue, 7 Jul 2009 03:44:31 +0000 (03:44 +0000)
SVN-Revision: 16732

package/wprobe/src/kernel/wprobe-core.c

index d8f5a16f60500b11d847e46630627e144aa6a576..f9dd282d55a20f599d86fb5e3695a216ac0d1b4c 100644 (file)
@@ -844,6 +844,7 @@ wprobe_check_filter(void *data, int datalen, int gs)
 
                hdr->name[31] = 0;
                cur_is = be32_to_cpu(hdr->n_items);
+               hdr->n_items = cur_is;
                is += cur_is;
                for (j = 0; j < cur_is; j++) {
                        struct sock_filter *sf;
@@ -854,11 +855,13 @@ wprobe_check_filter(void *data, int datalen, int gs)
                        if (data > end)
                                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;
 
-                       hdr->name[31] = 0;
-                       hdr->n_items = n_items = be32_to_cpu(hdr->n_items);
                        sf = data;
                        if (n_items > 0) {
                                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++) {
                        hdr = 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);