From b87a76412cf34fe93eca096700d7977f244ffbee Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Tue, 9 Dec 2014 20:33:42 +0200 Subject: [PATCH] packet: avoid hand-rolled deleter chaining, use deleter::append instead The hand-rolled deleter chaining in packet::append was invalidated by the make_free_deleter() optimization, since deleter->_next is no longer guaranteed to be valid (and deleter::operator->() is still exposed, despite that). Switch to deleter::append(), which does the right thing. Fixes a memory leak in tcp_server. --- net/packet.hh | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/net/packet.hh b/net/packet.hh index 793ea317db..3d6cfc56c4 100644 --- a/net/packet.hh +++ b/net/packet.hh @@ -480,17 +480,8 @@ void packet::append(packet&& p) { std::copy(p._impl->_frags, p._impl->_frags + p._impl->_nr_frags, _impl->_frags + _impl->_nr_frags); _impl->_nr_frags += p._impl->_nr_frags; - if (!p._impl->_deleter) { - return; - } else if (!_impl->_deleter) { - _impl->_deleter = std::move(p._impl->_deleter); - } else if (!_impl->_deleter->next) { - _impl->_deleter->next = std::move(p._impl->_deleter); - } else { - auto chain = make_deleter(std::move(_impl->_deleter->next), - [d = std::move(p._impl->_deleter)] {}); - _impl->_deleter->next = std::move(chain); - } + p._impl->_deleter.append(std::move(_impl->_deleter)); + _impl->_deleter = std::move(p._impl->_deleter); } inline