Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1951)

Unified Diff: Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp

Issue 1358643002: Fix caching bug in JPEGImageDecoder (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Respond to pkasting's comments in patch set 1 Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | Source/platform/image-decoders/jpeg/JPEGImageDecoderTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
diff --git a/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp b/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
index baf4bd09222f76f2f765c980953084c19d8b515b..a77a3f4bff35338403be10a21d71786f4ac15189 100644
--- a/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
+++ b/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
@@ -392,9 +392,8 @@ public:
if (m_needsRestart) {
m_needsRestart = false;
m_nextReadPosition = m_restartPosition;
- } else if (m_lastSetByte != m_info.src->next_input_byte) {
- // next_input_byte was updated by jpeg, meaning that it found a restart position.
- m_restartPosition = m_nextReadPosition - m_info.src->bytes_in_buffer;
+ } else {
+ updateRestartPosition();
}
const char* segment;
@@ -402,10 +401,7 @@ public:
if (bytes == 0) {
// We had to suspend. When we resume, we will need to start from the restart position.
m_needsRestart = true;
- // Let libjpeg know that the buffer needs to be refilled.
- m_info.src->bytes_in_buffer = 0;
- m_info.src->next_input_byte = nullptr;
- m_lastSetByte = nullptr;
+ clearBuffer();
return false;
}
@@ -431,9 +427,7 @@ public:
// Otherwise, empty the buffer, and leave the position the same, so fillBuffer continues
// reading from the same position in the new SharedBuffer.
m_nextReadPosition -= m_info.src->bytes_in_buffer;
- m_info.src->bytes_in_buffer = 0;
- m_info.src->next_input_byte = nullptr;
- m_lastSetByte = nullptr;
+ clearBuffer();
}
bool decode(bool onlySize)
@@ -531,6 +525,17 @@ public:
}
if (onlySize) {
+ // This exits the function while there is still potentially
+ // data in the buffer. Before this function is called again,
+ // the SharedBuffer may be collapsed (by a call to
+ // mergeSegmentsIntoBuffer), invalidating the "buffer" (which
+ // in reality is a pointer into the SharedBuffer's data).
+ // Defensively empty the buffer, but first find the latest
+ // restart position and signal to restart, so the next call to
+ // fillBuffer will resume from the correct point.
+ m_needsRestart = true;
+ updateRestartPosition();
+ clearBuffer();
return true;
}
// FALL THROUGH
@@ -682,6 +687,22 @@ public:
#endif
private:
+ void updateRestartPosition()
+ {
+ if (m_lastSetByte != m_info.src->next_input_byte) {
+ // next_input_byte was updated by jpeg, meaning that it found a restart position.
+ m_restartPosition = m_nextReadPosition - m_info.src->bytes_in_buffer;
+ }
+ }
+
+ void clearBuffer()
+ {
+ // Let libjpeg know that the buffer needs to be refilled.
+ m_info.src->bytes_in_buffer = 0;
+ m_info.src->next_input_byte = nullptr;
+ m_lastSetByte = nullptr;
+ }
+
RefPtr<SharedBuffer> m_data;
JPEGImageDecoder* m_decoder;
// True if we need to back up to m_restartPosition.
« no previous file with comments | « no previous file | Source/platform/image-decoders/jpeg/JPEGImageDecoderTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698