Changeset 279915 in webkit
- Timestamp:
- Jul 14, 2021, 12:15:56 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r279910 r279915 1 2021-07-14 Mark Lam <mark.lam@apple.com> 2 3 Check for out of memory in JSC::globalFuncEscape() and JSC::globalFuncUnescape(). 4 https://bugs.webkit.org/show_bug.cgi?id=227962 5 rdar://78392251 6 7 Reviewed by Yusuke Suzuki. 8 9 * stress/out-of-memory-in-globalFuncUnescape.js: Added. 10 1 11 2021-07-14 Mark Lam <mark.lam@apple.com> 2 12 -
trunk/Source/JavaScriptCore/ChangeLog
r279913 r279915 1 2021-07-14 Mark Lam <mark.lam@apple.com> 2 3 Check for out of memory in JSC::globalFuncEscape() and JSC::globalFuncUnescape(). 4 https://bugs.webkit.org/show_bug.cgi?id=227962 5 rdar://78392251 6 7 Reviewed by Yusuke Suzuki. 8 9 * runtime/JSGlobalObjectFunctions.cpp: 10 (JSC::JSC_DEFINE_HOST_FUNCTION): 11 1 12 2021-07-14 Yusuke Suzuki <ysuzuki@apple.com> 2 13 -
trunk/Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
r278253 r279915 578 578 JSC_DEFINE_HOST_FUNCTION(globalFuncEscape, (JSGlobalObject* globalObject, CallFrame* callFrame)) 579 579 { 580 return JSValue::encode(toStringView(globalObject, callFrame->argument(0), [&] (StringView view) {580 return JSValue::encode(toStringView(globalObject, callFrame->argument(0), [&] (StringView view) -> JSString* { 581 581 static const Bitmap<256> doNotEscape = makeCharacterBitmap( 582 582 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" … … 587 587 588 588 VM& vm = globalObject->vm(); 589 StringBuilder builder; 589 auto scope = DECLARE_THROW_SCOPE(vm); 590 591 StringBuilder builder(StringBuilder::OverflowHandler::RecordOverflow); 590 592 if (view.is8Bit()) { 591 593 const LChar* c = view.characters8(); … … 597 599 builder.append('%', hex(u, 2)); 598 600 } 599 return jsString(vm, builder.toString()); 600 } 601 602 const UChar* c = view.characters16(); 603 for (unsigned k = 0; k < view.length(); k++, c++) { 604 UChar u = c[0]; 605 if (u >= doNotEscape.size()) 606 builder.append("%u", hex(static_cast<uint8_t>(u >> 8), 2), hex(static_cast<uint8_t>(u), 2)); 607 else if (doNotEscape.get(static_cast<LChar>(u))) 608 builder.append(*c); 609 else 610 builder.append('%', hex(u, 2)); 611 } 612 601 } else { 602 const UChar* c = view.characters16(); 603 for (unsigned k = 0; k < view.length(); k++, c++) { 604 UChar u = c[0]; 605 if (u >= doNotEscape.size()) 606 builder.append("%u", hex(static_cast<uint8_t>(u >> 8), 2), hex(static_cast<uint8_t>(u), 2)); 607 else if (doNotEscape.get(static_cast<LChar>(u))) 608 builder.append(*c); 609 else 610 builder.append('%', hex(u, 2)); 611 } 612 } 613 614 if (UNLIKELY(builder.hasOverflowed())) { 615 throwOutOfMemoryError(globalObject, scope); 616 return { }; 617 } 613 618 return jsString(vm, builder.toString()); 614 619 })); … … 617 622 JSC_DEFINE_HOST_FUNCTION(globalFuncUnescape, (JSGlobalObject* globalObject, CallFrame* callFrame)) 618 623 { 619 return JSValue::encode(toStringView(globalObject, callFrame->argument(0), [&] (StringView view) {624 return JSValue::encode(toStringView(globalObject, callFrame->argument(0), [&] (StringView view) -> JSString* { 620 625 // We use int for k and length intentionally since we would like to evaluate 621 626 // the condition `k <= length -6` even if length is less than 6. … … 623 628 int length = view.length(); 624 629 625 StringBuilder builder; 630 VM& vm = globalObject->vm(); 631 auto scope = DECLARE_THROW_SCOPE(vm); 632 633 StringBuilder builder(StringBuilder::OverflowHandler::RecordOverflow); 626 634 builder.reserveCapacity(length); 627 635 … … 667 675 } 668 676 669 return jsString(globalObject->vm(), builder.toString()); 677 if (UNLIKELY(builder.hasOverflowed())) { 678 throwOutOfMemoryError(globalObject, scope); 679 return { }; 680 } 681 return jsString(vm, builder.toString()); 670 682 })); 671 683 }
Note:
See TracChangeset
for help on using the changeset viewer.