tipc: Simplify enforcement of reserved name type prohibition
authorAllan Stephens <allan.stephens@windriver.com>
Wed, 2 Nov 2011 19:49:40 +0000 (15:49 -0400)
committerPaul Gortmaker <paul.gortmaker@windriver.com>
Fri, 24 Feb 2012 22:05:14 +0000 (17:05 -0500)
Streamlines the logic that prevents an application from binding a
reserved TIPC name type to a port by moving the check to the code
that handles a socket bind() operation. This allows internal TIPC
subsystems to bind a reserved name without having to set an atomic
flag to gain permission to use such a name. (This simplification is
now possible due to the elimination of support for TIPC's native API.)

Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
net/tipc/config.c
net/tipc/name_table.c
net/tipc/name_table.h
net/tipc/socket.c
net/tipc/subscr.c

index 4785bf26cdf4d1b1ff98a97d7d0d1559859a5c5e..9fefd32e9b2e0c6649ea13537a4cc1db4d91c668 100644 (file)
@@ -481,7 +481,7 @@ int tipc_cfg_init(void)
 
        seq.type = TIPC_CFG_SRV;
        seq.lower = seq.upper = tipc_own_addr;
-       res = tipc_nametbl_publish_rsv(config_port_ref, TIPC_ZONE_SCOPE, &seq);
+       res = tipc_publish(config_port_ref, TIPC_ZONE_SCOPE, &seq);
        if (res)
                goto failed;
 
index 89eb5621ebbad423edfe8c6a8f112f4a21555b91..1196f050e334b8ecfd531afdf27e47a3bda5e950 100644 (file)
@@ -114,10 +114,8 @@ struct name_table {
 };
 
 static struct name_table table;
-static atomic_t rsv_publ_ok = ATOMIC_INIT(0);
 DEFINE_RWLOCK(tipc_nametbl_lock);
 
-
 static int hash(int x)
 {
        return x & (tipc_nametbl_size - 1);
@@ -665,22 +663,7 @@ exit:
        return res;
 }
 
-/**
- * tipc_nametbl_publish_rsv - publish port name using a reserved name type
- */
-
-int tipc_nametbl_publish_rsv(u32 ref, unsigned int scope,
-                       struct tipc_name_seq const *seq)
-{
-       int res;
-
-       atomic_inc(&rsv_publ_ok);
-       res = tipc_publish(ref, scope, seq);
-       atomic_dec(&rsv_publ_ok);
-       return res;
-}
-
-/**
+/*
  * tipc_nametbl_publish - add name publication to network name tables
  */
 
@@ -694,11 +677,6 @@ struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper,
                     tipc_max_publications);
                return NULL;
        }
-       if ((type < TIPC_RESERVED_TYPES) && !atomic_read(&rsv_publ_ok)) {
-               warn("Publication failed, reserved name {%u,%u,%u}\n",
-                    type, lower, upper);
-               return NULL;
-       }
 
        write_lock_bh(&tipc_nametbl_lock);
        table.local_publ_count++;
index 8086b42f92ad0a9021d97caeccd694475086a073..207d59ebf849dec24ffb75f789ce869f7a09dcc7 100644 (file)
@@ -91,8 +91,6 @@ struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space);
 u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *node);
 int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit,
                         struct tipc_port_list *dports);
-int tipc_nametbl_publish_rsv(u32 ref, unsigned int scope,
-                       struct tipc_name_seq const *seq);
 struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper,
                                    u32 scope, u32 port_ref, u32 key);
 int tipc_nametbl_withdraw(u32 type, u32 lower, u32 ref, u32 key);
index e2f7c5d370ba622d8dd44ddb6fe68d3466330d2f..d3227f2a216efbcdc58d81a2f803673eb1d6b3e4 100644 (file)
@@ -355,6 +355,9 @@ static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len)
        else if (addr->addrtype != TIPC_ADDR_NAMESEQ)
                return -EAFNOSUPPORT;
 
+       if (addr->addr.nameseq.type < TIPC_RESERVED_TYPES)
+               return -EACCES;
+
        return (addr->scope > 0) ?
                tipc_publish(portref, addr->scope, &addr->addr.nameseq) :
                tipc_withdraw(portref, -addr->scope, &addr->addr.nameseq);
index 8c49566da8f3b2f4653b0a7be8bd47cdc2884eb6..b2964e9895d3cada39dd5f11f147c1758fed229c 100644 (file)
@@ -552,7 +552,7 @@ int tipc_subscr_start(void)
        if (res)
                goto failed;
 
-       res = tipc_nametbl_publish_rsv(topsrv.setup_port, TIPC_NODE_SCOPE, &seq);
+       res = tipc_publish(topsrv.setup_port, TIPC_NODE_SCOPE, &seq);
        if (res) {
                tipc_deleteport(topsrv.setup_port);
                topsrv.setup_port = 0;