* Made the code a bit more robust against faulty use.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38181 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2010-08-17 11:45:56 +00:00
parent ed18d7cf71
commit 3f7e748f91
+19 -6
View File
@@ -504,6 +504,11 @@ put_domain_protocols(net_socket* socket)
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 @@ uninit_domain_datalink_protocols(domain_datalink* datalink)
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 @@ get_domain_datalink_protocols(Interface* interface, net_domain* domain)
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 @@ get_domain_datalink_protocols(Interface* interface, net_domain* domain)
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 @@ get_domain_datalink_protocols(Interface* interface, net_domain* domain)
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 @@ get_domain_datalink_protocols(Interface* interface, net_domain* domain)
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;
{