wl1251: fix a memory leak in probe
[safe/jmp/linux-2.6] / net / tipc / subscr.c
index 0326d30..ab6eab4 100644 (file)
@@ -76,19 +76,6 @@ struct top_srv {
 static struct top_srv topsrv = { 0 };
 
 /**
- * htohl - convert value to endianness used by destination
- * @in: value to convert
- * @swap: non-zero if endianness must be reversed
- *
- * Returns converted value
- */
-
-static u32 htohl(u32 in, int swap)
-{
-       return swap ? (u32)___constant_swab32(in) : in;
-}
-
-/**
  * subscr_send_event - send a message containing a tipc_event to the subscriber
  *
  * Note: Must not hold subscriber's server port lock, since tipc_send() will
@@ -107,11 +94,11 @@ static void subscr_send_event(struct subscription *sub,
        msg_sect.iov_base = (void *)&sub->evt;
        msg_sect.iov_len = sizeof(struct tipc_event);
 
-       sub->evt.event = htohl(event, sub->swap);
-       sub->evt.found_lower = htohl(found_lower, sub->swap);
-       sub->evt.found_upper = htohl(found_upper, sub->swap);
-       sub->evt.port.ref = htohl(port_ref, sub->swap);
-       sub->evt.port.node = htohl(node, sub->swap);
+       sub->evt.event = htonl(event);
+       sub->evt.found_lower = htonl(found_lower);
+       sub->evt.found_upper = htonl(found_upper);
+       sub->evt.port.ref = htonl(port_ref);
+       sub->evt.port.node = htonl(node);
        tipc_send(sub->server_ref, 1, &msg_sect);
 }
 
@@ -287,16 +274,29 @@ static void subscr_cancel(struct tipc_subscr *s,
 {
        struct subscription *sub;
        struct subscription *sub_temp;
+       __u32 type, lower, upper, timeout, filter;
        int found = 0;
 
        /* Find first matching subscription, exit if not found */
 
+       type = ntohl(s->seq.type);
+       lower = ntohl(s->seq.lower);
+       upper = ntohl(s->seq.upper);
+       timeout = ntohl(s->timeout);
+       filter = ntohl(s->filter) & ~TIPC_SUB_CANCEL;
+
        list_for_each_entry_safe(sub, sub_temp, &subscriber->subscription_list,
                                 subscription_list) {
-               if (!memcmp(s, &sub->evt.s, sizeof(struct tipc_subscr))) {
-                       found = 1;
-                       break;
-               }
+                       if ((type == sub->seq.type) &&
+                           (lower == sub->seq.lower) &&
+                           (upper == sub->seq.upper) &&
+                           (timeout == sub->timeout) &&
+                            (filter == sub->filter) &&
+                             !memcmp(s->usr_handle,sub->evt.s.usr_handle,
+                                    sizeof(s->usr_handle)) ){
+                               found = 1;
+                               break;
+                       }
        }
        if (!found)
                return;
@@ -310,7 +310,7 @@ static void subscr_cancel(struct tipc_subscr *s,
                k_term_timer(&sub->timer);
                spin_lock_bh(subscriber->lock);
        }
-       dbg("Cancel: removing sub %u,%u,%u from subscriber %x list\n",
+       dbg("Cancel: removing sub %u,%u,%u from subscriber %p list\n",
            sub->seq.type, sub->seq.lower, sub->seq.upper, subscriber);
        subscr_del(sub);
 }
@@ -325,16 +325,10 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s,
                                             struct subscriber *subscriber)
 {
        struct subscription *sub;
-       int swap;
-
-       /* Determine subscriber's endianness */
-
-       swap = !(s->filter & (TIPC_SUB_PORTS | TIPC_SUB_SERVICE));
 
        /* Detect & process a subscription cancellation request */
 
-       if (s->filter & htohl(TIPC_SUB_CANCEL, swap)) {
-               s->filter &= ~htohl(TIPC_SUB_CANCEL, swap);
+       if (ntohl(s->filter) & TIPC_SUB_CANCEL) {
                subscr_cancel(s, subscriber);
                return NULL;
        }
@@ -359,14 +353,13 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s,
 
        /* Initialize subscription object */
 
-       sub->seq.type = htohl(s->seq.type, swap);
-       sub->seq.lower = htohl(s->seq.lower, swap);
-       sub->seq.upper = htohl(s->seq.upper, swap);
-       sub->timeout = htohl(s->timeout, swap);
-       sub->filter = htohl(s->filter, swap);
-       if ((!(sub->filter & TIPC_SUB_PORTS)
-            == !(sub->filter & TIPC_SUB_SERVICE))
-           || (sub->seq.lower > sub->seq.upper)) {
+       sub->seq.type = ntohl(s->seq.type);
+       sub->seq.lower = ntohl(s->seq.lower);
+       sub->seq.upper = ntohl(s->seq.upper);
+       sub->timeout = ntohl(s->timeout);
+       sub->filter = ntohl(s->filter);
+       if ((sub->filter && (sub->filter != TIPC_SUB_PORTS)) ||
+           (sub->seq.lower > sub->seq.upper)) {
                warn("Subscription rejected, illegal request\n");
                kfree(sub);
                subscr_terminate(subscriber);
@@ -376,7 +369,6 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s,
        INIT_LIST_HEAD(&sub->nameseq_list);
        list_add(&sub->subscription_list, &subscriber->subscription_list);
        sub->server_ref = subscriber->port_ref;
-       sub->swap = swap;
        memcpy(&sub->evt.s, s, sizeof(struct tipc_subscr));
        atomic_inc(&topsrv.subscription_count);
        if (sub->timeout != TIPC_WAIT_FOREVER) {