<!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>[209689] trunk/Source</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/209689">209689</a></dd>
<dt>Author</dt> <dd>darin@apple.com</dd>
<dt>Date</dt> <dd>2016-12-11 16:57:02 -0800 (Sun, 11 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Use std::vsnprintf instead of vasprintf
https://bugs.webkit.org/show_bug.cgi?id=165740

Reviewed by Sam Weinig.

Source/WebCore:

* platform/FileHandle.cpp:
(WebCore::FileHandle::printf): Use vsnprintf, including StringExtras.h to
ensure compatibility with older versions of the Visual Studio library,
and Vector for the buffer. Use inline capacity in the vector so we normally
don't need to allocate any memory on the heap.
* xml/XSLTUnicodeSort.cpp:
(xsltTransformErrorTrampoline): Ditto.
* xml/parser/XMLDocumentParserLibxml2.cpp:
(WebCore::XMLDocumentParser::error): Ditto.

Source/WTF:

* wtf/Platform.h: Remove HAVE_VASPRINTF.
* wtf/StringExtras.h: Change the vsnprintf workaround to be used only
in older versions of Visual Studio, since the problem it works around
was resolved in Visual Studio 2015.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfPlatformh">trunk/Source/WTF/wtf/Platform.h</a></li>
<li><a href="#trunkSourceWTFwtfStringExtrash">trunk/Source/WTF/wtf/StringExtras.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformFileHandlecpp">trunk/Source/WebCore/platform/FileHandle.cpp</a></li>
<li><a href="#trunkSourceWebCorexmlXSLTUnicodeSortcpp">trunk/Source/WebCore/xml/XSLTUnicodeSort.cpp</a></li>
<li><a href="#trunkSourceWebCorexmlparserXMLDocumentParserLibxml2cpp">trunk/Source/WebCore/xml/parser/XMLDocumentParserLibxml2.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (209688 => 209689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-12-12 00:56:25 UTC (rev 209688)
+++ trunk/Source/WTF/ChangeLog        2016-12-12 00:57:02 UTC (rev 209689)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2016-12-11  Darin Adler  &lt;darin@apple.com&gt;
+
+        Use std::vsnprintf instead of vasprintf
+        https://bugs.webkit.org/show_bug.cgi?id=165740
+
+        Reviewed by Sam Weinig.
+
+        * wtf/Platform.h: Remove HAVE_VASPRINTF.
+        * wtf/StringExtras.h: Change the vsnprintf workaround to be used only
+        in older versions of Visual Studio, since the problem it works around
+        was resolved in Visual Studio 2015.
+
</ins><span class="cx"> 2016-12-10  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r209653, r209654, r209663, and
</span></span></pre></div>
<a id="trunkSourceWTFwtfPlatformh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Platform.h (209688 => 209689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Platform.h        2016-12-12 00:56:25 UTC (rev 209688)
+++ trunk/Source/WTF/wtf/Platform.h        2016-12-12 00:57:02 UTC (rev 209689)
</span><span class="lines">@@ -633,12 +633,6 @@
</span><span class="cx"> #define USE_PTHREADS 1
</span><span class="cx"> #endif /* OS(UNIX) */
</span><span class="cx"> 
</span><del>-#if !defined(HAVE_VASPRINTF)
-#if !COMPILER(MSVC) &amp;&amp; !COMPILER(MINGW)
-#define HAVE_VASPRINTF 1
-#endif
-#endif
-
</del><span class="cx"> #if OS(DARWIN)
</span><span class="cx"> #define HAVE_DISPATCH_H 1
</span><span class="cx"> #define HAVE_MADV_FREE 1
</span></span></pre></div>
<a id="trunkSourceWTFwtfStringExtrash"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/StringExtras.h (209688 => 209689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/StringExtras.h        2016-12-12 00:56:25 UTC (rev 209688)
+++ trunk/Source/WTF/wtf/StringExtras.h        2016-12-12 00:57:02 UTC (rev 209689)
</span><span class="lines">@@ -35,13 +35,17 @@
</span><span class="cx"> #include &lt;strings.h&gt; 
</span><span class="cx"> #endif 
</span><span class="cx"> 
</span><del>-#if COMPILER(MSVC)
-// FIXME: why a COMPILER check instead of OS? also, these should be HAVE checks
</del><ins>+#if COMPILER(MSVC) &amp;&amp; _MSC_VER &lt; 1900
</ins><span class="cx"> 
</span><ins>+// In versions of the Microsoft library before Visual Studio 2015, snprintf and vsnprintf
+// did not null-terminate when the result entirely filled the buffer. The following work
+// around that limitation. This means that any file using snprintf or vsnprintf needs to
+// include this header and use the global namespace style to invoke it, not the std
+// namespace style.
+
</ins><span class="cx"> #include &lt;errno.h&gt;
</span><span class="cx"> 
</span><del>-#if _MSC_VER &lt; 1900
-inline int snprintf(char* buffer, size_t count, const char* format, ...) 
</del><ins>+inline int snprintf(char* buffer, size_t count, const char* format, ...)
</ins><span class="cx"> {
</span><span class="cx">     int result;
</span><span class="cx">     va_list args;
</span><span class="lines">@@ -58,7 +62,6 @@
</span><span class="cx"> 
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><del>-#endif
</del><span class="cx"> 
</span><span class="cx"> inline double wtf_vsnprintf(char* buffer, size_t count, const char* format, va_list args)
</span><span class="cx"> {
</span><span class="lines">@@ -74,10 +77,16 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// Work around a difference in Microsoft's implementation of vsnprintf, where 
</del><ins>+// Work around a difference in Microsoft's implementation of vsnprintf, where
</ins><span class="cx"> // vsnprintf does not null terminate the buffer. WebKit can rely on the null termination.
</span><span class="cx"> #define vsnprintf(buffer, count, format, args) wtf_vsnprintf(buffer, count, format, args)
</span><span class="cx"> 
</span><ins>+#endif
+
+#if COMPILER(MSVC)
+
+// FIXME: We should stop using these entirely and use suitable versions of equalIgnoringASCIICase instead.
+
</ins><span class="cx"> inline int strncasecmp(const char* s1, const char* s2, size_t len)
</span><span class="cx"> {
</span><span class="cx">     return _strnicmp(s1, s2, len);
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (209688 => 209689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-12 00:56:25 UTC (rev 209688)
+++ trunk/Source/WebCore/ChangeLog        2016-12-12 00:57:02 UTC (rev 209689)
</span><span class="lines">@@ -1,5 +1,22 @@
</span><span class="cx"> 2016-12-11  Darin Adler  &lt;darin@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Use std::vsnprintf instead of vasprintf
+        https://bugs.webkit.org/show_bug.cgi?id=165740
+
+        Reviewed by Sam Weinig.
+
+        * platform/FileHandle.cpp:
+        (WebCore::FileHandle::printf): Use vsnprintf, including StringExtras.h to
+        ensure compatibility with older versions of the Visual Studio library,
+        and Vector for the buffer. Use inline capacity in the vector so we normally
+        don't need to allocate any memory on the heap.
+        * xml/XSLTUnicodeSort.cpp:
+        (xsltTransformErrorTrampoline): Ditto.
+        * xml/parser/XMLDocumentParserLibxml2.cpp:
+        (WebCore::XMLDocumentParser::error): Ditto.
+
+2016-12-11  Darin Adler  &lt;darin@apple.com&gt;
+
</ins><span class="cx">         Make some refinements to HTMLPlugInImageElement
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=165742
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformFileHandlecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/FileHandle.cpp (209688 => 209689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/FileHandle.cpp        2016-12-12 00:56:25 UTC (rev 209688)
+++ trunk/Source/WebCore/platform/FileHandle.cpp        2016-12-12 00:57:02 UTC (rev 209689)
</span><span class="lines">@@ -29,8 +29,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;FileHandle.h&quot;
</span><span class="cx"> 
</span><del>-#include &lt;stdarg.h&gt;
-#include &lt;stdio.h&gt;
</del><ins>+#include &lt;wtf/StringExtras.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -100,23 +99,20 @@
</span><span class="cx"> 
</span><span class="cx"> bool FileHandle::printf(const char* format, ...)
</span><span class="cx"> {
</span><del>-#if OS(WINDOWS)
-    // TODO: implement this without relying on vasprintf.
-    return false;
-#else
</del><span class="cx">     va_list args;
</span><span class="cx">     va_start(args, format);
</span><span class="cx"> 
</span><del>-    char* buffer = nullptr;
-    if (vasprintf(&amp;buffer, format, args) == -1)
-        return false;
-    auto writeResult = write(buffer, strlen(buffer));
-    free(buffer);
</del><ins>+    va_list preflightArgs;
+    va_copy(preflightArgs, args);
+    size_t stringLength = vsnprintf(nullptr, 0, format, preflightArgs);
+    va_end(preflightArgs);
</ins><span class="cx"> 
</span><ins>+    Vector&lt;char, 1024&gt; buffer(stringLength + 1);
+    vsnprintf(buffer.data(), stringLength + 1, format, args);
+
</ins><span class="cx">     va_end(args);
</span><span class="cx"> 
</span><del>-    return writeResult &gt;= 0;
-#endif
</del><ins>+    return write(buffer.data(), stringLength) &gt;= 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void FileHandle::close()
</span></span></pre></div>
<a id="trunkSourceWebCorexmlXSLTUnicodeSortcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/xml/XSLTUnicodeSort.cpp (209688 => 209689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/xml/XSLTUnicodeSort.cpp        2016-12-12 00:56:25 UTC (rev 209688)
+++ trunk/Source/WebCore/xml/XSLTUnicodeSort.cpp        2016-12-12 00:57:02 UTC (rev 209689)
</span><span class="lines">@@ -33,6 +33,8 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;libxslt/templates.h&gt;
</span><span class="cx"> #include &lt;libxslt/xsltutils.h&gt;
</span><ins>+#include &lt;wtf/StringExtras.h&gt;
+#include &lt;wtf/Vector.h&gt;
</ins><span class="cx"> #include &lt;wtf/unicode/Collator.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if OS(DARWIN) &amp;&amp; !PLATFORM(EFL) &amp;&amp; !PLATFORM(GTK)
</span><span class="lines">@@ -51,15 +53,19 @@
</span><span class="cx"> {
</span><span class="cx">     va_list args;
</span><span class="cx">     va_start(args, message);
</span><del>-    char* messageWithArgs;
-    vasprintf(&amp;messageWithArgs, message, args);
</del><ins>+
+    va_list preflightArgs;
+    va_copy(preflightArgs, args);
+    size_t stringLength = vsnprintf(nullptr, 0, message, preflightArgs);
+    va_end(preflightArgs);
+
+    Vector&lt;char, 1024&gt; buffer(stringLength + 1);
+    vsnprintf(buffer.data(), stringLength + 1, message, args);
</ins><span class="cx">     va_end(args);
</span><span class="cx"> 
</span><span class="cx">     static void (*xsltTransformErrorPointer)(xsltTransformContextPtr, xsltStylesheetPtr, xmlNodePtr, const char*, ...) WTF_ATTRIBUTE_PRINTF(4, 5)
</span><span class="cx">         = reinterpret_cast&lt;void (*)(xsltTransformContextPtr, xsltStylesheetPtr, xmlNodePtr, const char*, ...)&gt;(dlsym(libxsltLibrary(), &quot;xsltTransformError&quot;));
</span><del>-    xsltTransformErrorPointer(context, style, node, &quot;%s&quot;, messageWithArgs);
-
-    free(messageWithArgs);
</del><ins>+    xsltTransformErrorPointer(context, style, node, &quot;%s&quot;, buffer.data());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #define xsltTransformError xsltTransformErrorTrampoline
</span></span></pre></div>
<a id="trunkSourceWebCorexmlparserXMLDocumentParserLibxml2cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/xml/parser/XMLDocumentParserLibxml2.cpp (209688 => 209689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/xml/parser/XMLDocumentParserLibxml2.cpp        2016-12-12 00:56:25 UTC (rev 209688)
+++ trunk/Source/WebCore/xml/parser/XMLDocumentParserLibxml2.cpp        2016-12-12 00:57:02 UTC (rev 209689)
</span><span class="lines">@@ -916,24 +916,19 @@
</span><span class="cx">     if (isStopped())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-#if HAVE(VASPRINTF)
-    char* m;
-    if (vasprintf(&amp;m, message, args) == -1)
-        return;
-#else
-    char m[1024];
-    vsnprintf(m, sizeof(m) - 1, message, args);
-#endif
</del><ins>+    va_list preflightArgs;
+    va_copy(preflightArgs, args);
+    size_t stringLength = vsnprintf(nullptr, 0, message, preflightArgs);
+    va_end(preflightArgs);
</ins><span class="cx"> 
</span><ins>+    Vector&lt;char, 1024&gt; buffer(stringLength + 1);
+    vsnprintf(buffer.data(), stringLength + 1, message, args);
+
</ins><span class="cx">     TextPosition position = textPosition();
</span><span class="cx">     if (m_parserPaused)
</span><del>-        m_pendingCallbacks-&gt;appendErrorCallback(type, reinterpret_cast&lt;const xmlChar*&gt;(m), position.m_line, position.m_column);
</del><ins>+        m_pendingCallbacks-&gt;appendErrorCallback(type, reinterpret_cast&lt;const xmlChar*&gt;(buffer.data()), position.m_line, position.m_column);
</ins><span class="cx">     else
</span><del>-        handleError(type, m, textPosition());
-
-#if HAVE(VASPRINTF)
-    free(m);
-#endif
</del><ins>+        handleError(type, buffer.data(), textPosition());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void XMLDocumentParser::processingInstruction(const xmlChar* target, const xmlChar* data)
</span></span></pre>
</div>
</div>

</body>
</html>