[haiku-commits] r38181 - haiku/trunk/src/add-ons/kernel/network/stack

  • From: axeld@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 17 Aug 2010 13:45:56 +0200 (CEST)

Author: axeld
Date: 2010-08-17 13:45:56 +0200 (Tue, 17 Aug 2010)
New Revision: 38181
Changeset: http://dev.haiku-os.org/changeset/38181

Modified:
   haiku/trunk/src/add-ons/kernel/network/stack/stack.cpp
Log:
* Made the code a bit more robust against faulty use.


Modified: haiku/trunk/src/add-ons/kernel/network/stack/stack.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/network/stack/stack.cpp      2010-08-17 
11:45:26 UTC (rev 38180)
+++ haiku/trunk/src/add-ons/kernel/network/stack/stack.cpp      2010-08-17 
11:45:56 UTC (rev 38181)
@@ -504,6 +504,11 @@
 static void
 uninit_domain_datalink_protocols(domain_datalink* datalink)
 {
+       TRACE(("%s(datalink %p)\n", __FUNCTION__, datalink));
+
+       if (datalink == NULL)
+               return;
+
        net_datalink_protocol* protocol = datalink->first_protocol;
        while (protocol != NULL) {
                net_datalink_protocol* next = protocol->next;
@@ -520,6 +525,9 @@
 status_t
 get_domain_datalink_protocols(Interface* interface, net_domain* domain)
 {
+       TRACE(("%s(interface %p, domain %d)\n", __FUNCTION__, interface,
+               domain->family));
+
        struct chain* chain;
 
        {
@@ -531,10 +539,16 @@
                        return EAFNOSUPPORT;
        }
 
+       domain_datalink* datalink = interface->DomainDatalink(domain->family);
+       if (datalink == NULL)
+               return B_BAD_VALUE;
+       if (datalink->first_protocol != NULL)
+               return B_NAME_IN_USE;
+
        // create net_protocol objects for the protocols in the chain
 
        status_t status = chain->Acquire();
-       if (status < B_OK)
+       if (status != B_OK)
                return status;
 
        net_datalink_protocol* last = NULL;
@@ -545,8 +559,7 @@
                        chain->infos[i])->init_protocol(interface, domain, 
&protocol);
                if (status != B_OK) {
                        // free protocols we already initialized
-                       uninit_domain_datalink_protocols(
-                               interface->DomainDatalink(domain->family));
+                       uninit_domain_datalink_protocols(datalink);
                        chain->Release();
                        return status;
                }
@@ -557,9 +570,6 @@
                protocol->next = NULL;
 
                if (last == NULL) {
-                       domain_datalink* datalink
-                               = interface->DomainDatalink(domain->family);
-
                        datalink->first_protocol = protocol;
                        datalink->first_info = protocol->module;
                } else
@@ -575,6 +585,9 @@
 status_t
 put_domain_datalink_protocols(Interface* interface, net_domain* domain)
 {
+       TRACE(("%s(interface %p, domain %d)\n", __FUNCTION__, interface,
+               domain->family));
+
        struct chain* chain;
 
        {


Other related posts:

  • » [haiku-commits] r38181 - haiku/trunk/src/add-ons/kernel/network/stack - axeld