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.
This commit is contained in:
Avi Kivity
2014-12-09 20:33:42 +02:00
parent 7708627144
commit b87a76412c

View File

@@ -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