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; {