NetworkCookieJar: don't leak a new cookie if it has expired

This commit is contained in:
Hamish Morrison
2013-02-09 16:01:43 +00:00
parent dcaec19c9a
commit 2e7b5f9e18
+18 -20
View File
@@ -91,29 +91,27 @@ BNetworkCookieJar::AddCookie(const BNetworkCookie& cookie)
bool bool
BNetworkCookieJar::AddCookie(BNetworkCookie* cookie) BNetworkCookieJar::AddCookie(BNetworkCookie* cookie)
{ {
if (cookie != NULL) { if (cookie == NULL || cookie->ShouldDeleteNow())
HashString key(cookie->Domain()); return false;
if (!fCookieHashMap->fHashMap.ContainsKey(key)) HashString key(cookie->Domain());
fCookieHashMap->fHashMap.Put(key, new BList);
BNetworkCookieList* list = fCookieHashMap->fHashMap.Get(key); if (!fCookieHashMap->fHashMap.ContainsKey(key))
fCookieHashMap->fHashMap.Put(key, new BList);
for (int32 i = 0; i < list->CountItems(); i++) { BNetworkCookieList* list = fCookieHashMap->fHashMap.Get(key);
BNetworkCookie* c
= reinterpret_cast<BNetworkCookie*>(list->ItemAt(i));
if (c->Name() == cookie->Name()) { for (int32 i = 0; i < list->CountItems(); i++) {
list->RemoveItem(i); BNetworkCookie* c
break; = reinterpret_cast<BNetworkCookie*>(list->ItemAt(i));
}
if (c->Name() == cookie->Name()) {
list->RemoveItem(i);
break;
} }
// Discard the cookie if it's to be deleted
if (!cookie->ShouldDeleteNow())
list->AddItem(cookie);
} }
list->AddItem(cookie);
return true; return true;
} }
@@ -144,7 +142,7 @@ BNetworkCookieJar::DeleteOutdatedCookies()
int32 deleteCount = 0; int32 deleteCount = 0;
BNetworkCookie* cookiePtr; BNetworkCookie* cookiePtr;
for (Iterator it(GetIterator()); (cookiePtr = it.Next()); ) { for (Iterator it = GetIterator(); (cookiePtr = it.Next()) != NULL;) {
if (cookiePtr->ShouldDeleteNow()) { if (cookiePtr->ShouldDeleteNow()) {
delete it.Remove(); delete it.Remove();
deleteCount++; deleteCount++;
@@ -161,7 +159,7 @@ BNetworkCookieJar::PurgeForExit()
int32 deleteCount = 0; int32 deleteCount = 0;
BNetworkCookie* cookiePtr; BNetworkCookie* cookiePtr;
for (Iterator it(GetIterator()); (cookiePtr = it.Next()); ) { for (Iterator it = GetIterator(); (cookiePtr = it.Next()) != NULL;) {
if (cookiePtr->ShouldDeleteAtExit()) { if (cookiePtr->ShouldDeleteAtExit()) {
delete it.Remove(); delete it.Remove();
deleteCount++; deleteCount++;
@@ -183,7 +181,7 @@ BNetworkCookieJar::Archive(BMessage* into, bool deep) const
if (error == B_OK) { if (error == B_OK) {
BNetworkCookie* cookiePtr; BNetworkCookie* cookiePtr;
for (Iterator it(GetIterator()); (cookiePtr = it.Next()); ) { for (Iterator it = GetIterator(); (cookiePtr = it.Next()) != NULL;) {
BMessage subArchive; BMessage subArchive;
error = cookiePtr->Archive(&subArchive, deep); error = cookiePtr->Archive(&subArchive, deep);
@@ -357,7 +355,7 @@ BNetworkCookieJar::_DoFlatten() const
fFlattened.Truncate(0); fFlattened.Truncate(0);
BNetworkCookie* cookiePtr; BNetworkCookie* cookiePtr;
for (Iterator it(GetIterator()); (cookiePtr = it.Next()); ) { for (Iterator it = GetIterator(); (cookiePtr = it.Next()) != NULL;) {
fFlattened << cookiePtr->Domain() << '\t' << "TRUE" << '\t' fFlattened << cookiePtr->Domain() << '\t' << "TRUE" << '\t'
<< cookiePtr->Path() << '\t' << cookiePtr->Path() << '\t'
<< (cookiePtr->Secure()?"TRUE":"FALSE") << '\t' << (cookiePtr->Secure()?"TRUE":"FALSE") << '\t'