(svn r20089) -Fix [FS#3932]: Access of already freed memory, esp. due to hidden destructor call from Swap().

replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
frosch 14 years ago
parent 02e4371ecb
commit 4ce5c6d93d

@ -27,6 +27,21 @@ ContentInfo::~ContentInfo()
free(this->tags);
}
/**
* Copy data from other #ContentInfo and take ownership of allocated stuff.
* @param other Source to copy from. #dependencies and #tags will be NULLed.
*/
void ContentInfo::TransferFrom(ContentInfo *other)
{
if (other != this) {
free(this->dependencies);
free(this->tags);
memcpy(this, other, sizeof(ContentInfo));
other->dependencies = NULL;
other->tags = NULL;
}
}
size_t ContentInfo::Size() const
{
size_t len = 0;

@ -88,6 +88,8 @@ struct ContentInfo {
/** Free everything allocated */
~ContentInfo();
void TransferFrom(ContentInfo *other);
/**
* Get the size of the data as send over the network.
* @return the size.

@ -135,15 +135,13 @@ DEF_CONTENT_RECEIVE_COMMAND(Client, PACKET_CONTENT_SERVER_INFO)
/*
* As ici might be selected by the content window we cannot delete that.
* However, we want to keep most of the values of ci, except the values
* we (just) already preserved. As there are already allocated blobs of
* memory and more may be added, we cannot simply copy ci to ici as that
* might cause a leak of memory. As such we need to swap the data and
* then delete the memory we allocated here.
* we (just) already preserved.
* So transfer data and ownership of allocated memory from ci to ici.
*/
Swap(*ici, *ci);
ici->TransferFrom(ci);
delete ci;
this->OnReceiveContentInfo(ci);
this->OnReceiveContentInfo(ici);
return true;
}
}

Loading…
Cancel
Save