From 4af124a15aa8cf0ddb428b8e4c83e4f12af1074c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 9 Aug 2010 19:03:39 +0000 Subject: [PATCH] * We need to acquire references to the interface_address when copying/cloning the buffer, and we also need to release it when freeing it. * Adapted patch by Atis: append_cloned_data() now preserves the stored header; this is kind of bad, because it will not notice if the original header is removed, but this could probably just be documented this way. * Also print the reference count of the interface addresses. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37993 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/network/stack/interfaces.cpp | 2 ++ src/add-ons/kernel/network/stack/net_buffer.cpp | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp index 83b6bfa457..91d79bea07 100644 --- a/src/add-ons/kernel/network/stack/interfaces.cpp +++ b/src/add-ons/kernel/network/stack/interfaces.cpp @@ -325,6 +325,8 @@ InterfaceAddress::Dump(size_t index, bool hideInterface) } else strcpy(buffer, "-"); kprintf(" destination: %s\n", buffer); + + kprintf(" ref count: %" B_PRId32 "\n", CountReferences()); } diff --git a/src/add-ons/kernel/network/stack/net_buffer.cpp b/src/add-ons/kernel/network/stack/net_buffer.cpp index d2ef188d3f..bafa90ae59 100644 --- a/src/add-ons/kernel/network/stack/net_buffer.cpp +++ b/src/add-ons/kernel/network/stack/net_buffer.cpp @@ -1075,6 +1075,9 @@ copy_metadata(net_buffer* destination, const net_buffer* source) destination->flags = source->flags; destination->interface_address = source->interface_address; + if (destination->interface_address != NULL) + ((InterfaceAddress*)destination->interface_address)->AcquireReference(); + destination->offset = source->offset; destination->protocol = source->protocol; destination->type = source->type; @@ -1156,6 +1159,9 @@ free_buffer(net_buffer* _buffer) delete_ancillary_data_container(buffer->ancillary_data); release_data_header(buffer->allocation_header); + + if (buffer->interface_address != NULL) + ((InterfaceAddress*)buffer->interface_address)->ReleaseReference(); free_net_buffer(buffer); } @@ -1972,7 +1978,12 @@ append_cloned_data(net_buffer* _buffer, net_buffer* _source, uint32 offset, clone->offset = buffer->size; clone->start = node->start + offset; clone->used = min_c(bytes, node->used - offset); - clone->flags |= DATA_NODE_READ_ONLY; + if (list_is_empty(&buffer->buffers)) { + // take over stored offset + buffer->stored_header_length = source->stored_header_length; + clone->flags = node->flags | DATA_NODE_READ_ONLY; + } else + clone->flags = DATA_NODE_READ_ONLY; list_add_item(&buffer->buffers, clone);