Commit 56740731 authored by Adam Labuda's avatar Adam Labuda Committed by Commit Bot

Fixed unlimited memory growth when inspector is connected.

[Problem] When Remote Web Inspector is connected to a page doing a lot
of XHR requests (for example
https://www.youtube.com/watch?v=Bey4XXJAqS8_) renderer's memory usage
starts to grow with no limit.

[Cause] There is a corner case in NetworkResourcesData when the limit
of maximum_resources_content_size_ (100.000.000 bytes) is almost
reached. When the next request finishes its raw data is replaced with
decoded form. The decoded form can be larger that the raw data.
Sometimes the difference is so big that it causes the
NetworkResourcesData::content_size_ to go above the
maximum_resources_content_size_.
From now on there is basically no limit in appending requests in
NetworkResourcesData as maximum_resources_content_size_ - content_size_
in NetworkResourcesData::EnsureFreeSpace() will give a very large number
(unsigned overflow).

[Solution] Ensure that after request data is decoded
NetworkResourcesData has enough space to store the decoded form. It
needs to have at least "decoded size" - "raw size" bytes free.

Bug: 1019862
Change-Id: I5adf3aa4a91d01012f8620628f1a442697668105
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1946476Reviewed-by: default avatarYang Guo <yangguo@chromium.org>
Reviewed-by: default avatarSigurd Schneider <sigurds@chromium.org>
Reviewed-by: default avatarAndrey Kosyakov <caseq@chromium.org>
Commit-Queue: Andrey Kosyakov <caseq@chromium.org>
Cr-Commit-Position: refs/heads/master@{#739092}
parent 2b90560c
...@@ -22,6 +22,7 @@ Abul Hasan Md Osama <ahm.osama@samsung.com> ...@@ -22,6 +22,7 @@ Abul Hasan Md Osama <ahm.osama@samsung.com>
Adam Bonner <abonner-chromium@solscope.com> Adam Bonner <abonner-chromium@solscope.com>
Adam Bujalski <abujalski@gmail.com> Adam Bujalski <abujalski@gmail.com>
Adam Kallai <kadam@inf.u-szeged.hu> Adam Kallai <kadam@inf.u-szeged.hu>
Adam Labuda <a.labuda@samsung.com>
Adam Roben <adam@github.com> Adam Roben <adam@github.com>
Adam Treat <adam.treat@samsung.com> Adam Treat <adam.treat@samsung.com>
Adam Yi <i@adamyi.com> Adam Yi <i@adamyi.com>
......
...@@ -325,10 +325,14 @@ void NetworkResourcesData::MaybeDecodeDataToContent(const String& request_id) { ...@@ -325,10 +325,14 @@ void NetworkResourcesData::MaybeDecodeDataToContent(const String& request_id) {
return; return;
if (!resource_data->HasData()) if (!resource_data->HasData())
return; return;
content_size_ += resource_data->DecodeDataToContent(); const size_t data_length_increment = resource_data->DecodeDataToContent();
size_t data_length = resource_data->Content().CharactersSizeInBytes(); const size_t data_length = resource_data->Content().CharactersSizeInBytes();
content_size_ += data_length_increment;
if (data_length > maximum_single_resource_content_size_) if (data_length > maximum_single_resource_content_size_)
content_size_ -= resource_data->EvictContent(); content_size_ -= resource_data->EvictContent();
else
EnsureFreeSpace(data_length_increment);
CHECK_GE(maximum_resources_content_size_, content_size_);
} }
void NetworkResourcesData::AddResource(const String& request_id, void NetworkResourcesData::AddResource(const String& request_id,
...@@ -452,7 +456,7 @@ bool NetworkResourcesData::EnsureFreeSpace(uint64_t size) { ...@@ -452,7 +456,7 @@ bool NetworkResourcesData::EnsureFreeSpace(uint64_t size) {
if (size > maximum_resources_content_size_) if (size > maximum_resources_content_size_)
return false; return false;
while (size > maximum_resources_content_size_ - content_size_) { while (content_size_ + size > maximum_resources_content_size_) {
String request_id = request_ids_deque_.TakeFirst(); String request_id = request_ids_deque_.TakeFirst();
ResourceData* resource_data = ResourceDataForRequestId(request_id); ResourceData* resource_data = ResourceDataForRequestId(request_id);
if (resource_data) if (resource_data)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment