String.match should defend against matches that would crash the VM
authorfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 7 Feb 2016 19:03:29 +0000 (19:03 +0000)
committerfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 7 Feb 2016 19:03:29 +0000 (19:03 +0000)
commit2ab828cd69d55e39cb386e77e20e484bb0081797
tree4ccc7cea37f8d282735c41f47f95208649fc1cff
parentac5d70268f580bc215e3aa5e773ce82a2d1736b7
String.match should defend against matches that would crash the VM
https://bugs.webkit.org/show_bug.cgi?id=153964
rdar://problem/24301119

Reviewed by Saam Barati.

This fixes a crash in an internal test case.

* runtime/ArgList.cpp:
(JSC::MarkedArgumentBuffer::slowAppend): Use best practices to ensure that the size we
    compute makes sense. Crash if it stops making sense, since most users of this API assume
    that they are creating something small enough to fit on the stack.
* runtime/ArgList.h:
(JSC::MarkedArgumentBuffer::~MarkedArgumentBuffer):
(JSC::MarkedArgumentBuffer::size):
(JSC::MarkedArgumentBuffer::operator new): Deleted. These were ineffective. According to the
    debugger, we were still calling system malloc. So, I changed the code to use fastMalloc()
    directly.
(JSC::MarkedArgumentBuffer::operator delete): Deleted.
* runtime/StringPrototype.cpp:
(JSC::stringProtoFuncMatch): Explicitly defend against absurd sizes. Of course, it's still
    possible to crash the VM on OOME. That's sort of always been the philosophy of JSC - we
    don't guarantee that you'll get a nice-looking error whenever you run out of memory,
    since in a GC'd environment you can't really guarantee those things. But, if you have a
    match that obvious won't fit in memory, then reporting an error is useful in case this is
    a developer experimenting with a buggy regexp.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@196240 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/ArgList.cpp
Source/JavaScriptCore/runtime/ArgList.h
Source/JavaScriptCore/runtime/StringPrototype.cpp