diff --git a/src/add-ons/kernel/network/stack/net_buffer.cpp b/src/add-ons/kernel/network/stack/net_buffer.cpp index 23ccc3d408..da80731deb 100644 --- a/src/add-ons/kernel/network/stack/net_buffer.cpp +++ b/src/add-ons/kernel/network/stack/net_buffer.cpp @@ -845,12 +845,15 @@ status_t append_cloned_data(net_buffer *_buffer, net_buffer *_source, uint32 offset, size_t bytes) { + if (bytes == 0) + return B_OK; + net_buffer_private *buffer = (net_buffer_private *)_buffer; net_buffer_private *source = (net_buffer_private *)_source; TRACE(("append_cloned_data(buffer %p, source %p, offset = %ld, bytes = %ld)\n", buffer, source, offset, bytes)); - if (source->size < offset + bytes) + if (source->size < offset + bytes || source->size < offset) return B_BAD_VALUE; // find data_node to start with from the source buffer diff --git a/src/add-ons/kernel/network/stack/utility.cpp b/src/add-ons/kernel/network/stack/utility.cpp index dcc54f2b01..fbb79781e7 100644 --- a/src/add-ons/kernel/network/stack/utility.cpp +++ b/src/add-ons/kernel/network/stack/utility.cpp @@ -300,15 +300,18 @@ set_timer(net_timer *timer, bigtime_t delay) { BenaphoreLocker locker(sTimerLock); - if (timer->due > 0) { - // this timer is already scheduled, cancel it + if (timer->due > 0 && delay < 0) { + // this timer is scheduled, cancel it list_remove_item(&sTimers, timer); + timer->due = 0; } if (delay >= 0) { - // add this timer + // reschedule or add this timer + if (timer->due <= 0) + list_add_item(&sTimers, timer); + timer->due = system_time() + delay; - list_add_item(&sTimers, timer); // notify timer about the change if necessary if (sTimerTimeout > timer->due)