<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[169115] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/169115">169115</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-05-20 10:01:47 -0700 (Tue, 20 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Curl] Invalid content in cache file, causes broken rendering.
https://bugs.webkit.org/show_bug.cgi?id=133069

Patch by peavo@outlook.com &lt;peavo@outlook.com&gt; on 2014-05-20
Reviewed by Brent Fulgham.

When data for a url is received as multiple parts, the cache file for the url is truncated when opened for writing,
and will only contain the last part of data received.
This is fixed by only opening the file once, and close it after all data has been received.

* platform/network/curl/CurlCacheEntry.cpp:
(WebCore::CurlCacheEntry::CurlCacheEntry): Initialize cache file handle member.
(WebCore::CurlCacheEntry::~CurlCacheEntry): Close cache file.
(WebCore::CurlCacheEntry::saveCachedData): Only open cache file once to avoid truncating.
(WebCore::CurlCacheEntry::didFail): Close cache file.
(WebCore::CurlCacheEntry::didFinishLoading): Ditto.
(WebCore::CurlCacheEntry::openContentFile): Added method to open cache file.
(WebCore::CurlCacheEntry::closeContentFile): Added method to close cache file.
* platform/network/curl/CurlCacheEntry.h: Added file handle member, and methods to open and close cache file.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcurlCurlCacheEntrycpp">trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcurlCurlCacheEntryh">trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (169114 => 169115)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-05-20 16:59:53 UTC (rev 169114)
+++ trunk/Source/WebCore/ChangeLog        2014-05-20 17:01:47 UTC (rev 169115)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2014-05-20  peavo@outlook.com  &lt;peavo@outlook.com&gt;
+
+        [Curl] Invalid content in cache file, causes broken rendering.
+        https://bugs.webkit.org/show_bug.cgi?id=133069
+
+        Reviewed by Brent Fulgham.
+
+        When data for a url is received as multiple parts, the cache file for the url is truncated when opened for writing,
+        and will only contain the last part of data received.
+        This is fixed by only opening the file once, and close it after all data has been received.
+
+        * platform/network/curl/CurlCacheEntry.cpp:
+        (WebCore::CurlCacheEntry::CurlCacheEntry): Initialize cache file handle member.
+        (WebCore::CurlCacheEntry::~CurlCacheEntry): Close cache file.
+        (WebCore::CurlCacheEntry::saveCachedData): Only open cache file once to avoid truncating.
+        (WebCore::CurlCacheEntry::didFail): Close cache file.
+        (WebCore::CurlCacheEntry::didFinishLoading): Ditto.
+        (WebCore::CurlCacheEntry::openContentFile): Added method to open cache file.
+        (WebCore::CurlCacheEntry::closeContentFile): Added method to close cache file.
+        * platform/network/curl/CurlCacheEntry.h: Added file handle member, and methods to open and close cache file.
+
</ins><span class="cx"> 2014-05-20  Radu Stavila  &lt;stavila@adobe.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Regions] Block incorrectly sized when containing an unsplittable box
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcurlCurlCacheEntrycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.cpp (169114 => 169115)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.cpp        2014-05-20 16:59:53 UTC (rev 169114)
+++ trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.cpp        2014-05-20 17:01:47 UTC (rev 169115)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CurlCacheEntry.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;FileSystem.h&quot;
</del><span class="cx"> #include &quot;HTTPHeaderMap.h&quot;
</span><span class="cx"> #include &quot;HTTPParsers.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="lines">@@ -49,6 +48,7 @@
</span><span class="cx"> CurlCacheEntry::CurlCacheEntry(const String&amp; url, const String&amp; cacheDir)
</span><span class="cx">     : m_headerFilename(cacheDir)
</span><span class="cx">     , m_contentFilename(cacheDir)
</span><ins>+    , m_contentFile(invalidPlatformFileHandle)
</ins><span class="cx">     , m_entrySize(0)
</span><span class="cx">     , m_expireDate(-1)
</span><span class="cx">     , m_headerParsed(false)
</span><span class="lines">@@ -64,6 +64,7 @@
</span><span class="cx"> 
</span><span class="cx"> CurlCacheEntry::~CurlCacheEntry()
</span><span class="cx"> {
</span><ins>+    closeContentFile();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Cache manager should invalidate the entry on false
</span><span class="lines">@@ -90,16 +91,12 @@
</span><span class="cx"> 
</span><span class="cx"> bool CurlCacheEntry::saveCachedData(const char* data, size_t size)
</span><span class="cx"> {
</span><del>-    PlatformFileHandle contentFile = openFile(m_contentFilename, OpenForWrite);
-    if (!isHandleValid(contentFile)) {
-        LOG(Network, &quot;Cache Error: Could not open %s for write\n&quot;, m_contentFilename.latin1().data());
</del><ins>+    if (!openContentFile())
</ins><span class="cx">         return false;
</span><del>-    }
</del><span class="cx"> 
</span><span class="cx">     // Append
</span><del>-    seekFile(contentFile, 0, SeekFromEnd);
-    writeToFile(contentFile, data, size);
-    closeFile(contentFile);
</del><ins>+    writeToFile(m_contentFile, data, size);
+
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -195,11 +192,12 @@
</span><span class="cx"> void CurlCacheEntry::didFail()
</span><span class="cx"> {
</span><span class="cx">     // The cache manager will call invalidate()
</span><ins>+    closeContentFile();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CurlCacheEntry::didFinishLoading()
</span><span class="cx"> {
</span><del>-    // Nothing to do here yet
</del><ins>+    closeContentFile();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CurlCacheEntry::generateBaseFilename(const CString&amp; url)
</span><span class="lines">@@ -361,6 +359,32 @@
</span><span class="cx">     return m_entrySize;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+
+bool CurlCacheEntry::openContentFile()
+{
+    if (isHandleValid(m_contentFile))
+        return true;
+    
+    m_contentFile = openFile(m_contentFilename, OpenForWrite);
+
+    if (isHandleValid(m_contentFile))
+        return true;
+    
+    LOG(Network, &quot;Cache Error: Could not open %s for write\n&quot;, m_contentFilename.latin1().data());
+    return false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool CurlCacheEntry::closeContentFile()
+{
+    if (!isHandleValid(m_contentFile))
+        return true;
+
+    closeFile(m_contentFile);
+    m_contentFile = invalidPlatformFileHandle;
+
+    return true;
+}
+
+}
+
</ins><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcurlCurlCacheEntryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.h (169114 => 169115)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.h        2014-05-20 16:59:53 UTC (rev 169114)
+++ trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.h        2014-05-20 17:01:47 UTC (rev 169115)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #ifndef CurlCacheEntry_h
</span><span class="cx"> #define CurlCacheEntry_h
</span><span class="cx"> 
</span><ins>+#include &quot;FileSystem.h&quot;
</ins><span class="cx"> #include &quot;HTTPHeaderMap.h&quot;
</span><span class="cx"> #include &quot;ResourceHandle.h&quot;
</span><span class="cx"> #include &quot;ResourceRequest.h&quot;
</span><span class="lines">@@ -64,6 +65,8 @@
</span><span class="cx">     String m_headerFilename;
</span><span class="cx">     String m_contentFilename;
</span><span class="cx"> 
</span><ins>+    PlatformFileHandle m_contentFile;
+
</ins><span class="cx">     size_t m_entrySize;
</span><span class="cx">     double m_expireDate;
</span><span class="cx">     bool m_headerParsed;
</span><span class="lines">@@ -74,6 +77,9 @@
</span><span class="cx">     void generateBaseFilename(const CString&amp; url);
</span><span class="cx">     bool loadFileToBuffer(const String&amp; filepath, Vector&lt;char&gt;&amp; buffer);
</span><span class="cx">     bool loadResponseHeaders();
</span><ins>+
+    bool openContentFile();
+    bool closeContentFile();
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>