Changeset 96424 in webkit


Ignore:
Timestamp:
Sep 30, 2011 2:15:04 PM (13 years ago)
Author:
ggaren@apple.com
Message:

Crash due to out of bounds read/write in MarkedSpace
https://bugs.webkit.org/show_bug.cgi?id=69148

This was a case of being surprised by a poorly aritulcated cell size limit,
plus an incorrect ASSERT guarding the cell size limit.

Reviewed by Oliver Hunt.

  • heap/MarkedSpace.h:

(JSC::MarkedSpace::sizeClassFor): Changed heap size ranges to be inclusive,
since it makes the ranges easier to understand.

Bumped up the max cell size to support the use case in this bug. Since the
atomSize is much bigger than it used to be, there isn't much accounting
cost to handling more size classes.

Switched to FixedArray, to help catch SizeClass indexing bugs in the future.

  • heap/MarkedSpace.cpp:

(JSC::MarkedSpace::MarkedSpace):
(JSC::MarkedSpace::resetAllocator):
(JSC::MarkedSpace::canonicalizeCellLivenessData): Updated for size ranges
being inclusive.

Location:
trunk/Source/JavaScriptCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r96421 r96424  
     12011-09-30  Geoffrey Garen  <ggaren@apple.com>
     2
     3        Crash due to out of bounds read/write in MarkedSpace
     4        https://bugs.webkit.org/show_bug.cgi?id=69148
     5       
     6        This was a case of being surprised by a poorly aritulcated cell size limit,
     7        plus an incorrect ASSERT guarding the cell size limit.
     8
     9        Reviewed by Oliver Hunt.
     10
     11        * heap/MarkedSpace.h:
     12        (JSC::MarkedSpace::sizeClassFor): Changed heap size ranges to be inclusive,
     13        since it makes the ranges easier to understand.
     14       
     15        Bumped up the max cell size to support the use case in this bug. Since the
     16        atomSize is much bigger than it used to be, there isn't much accounting
     17        cost to handling more size classes.
     18       
     19        Switched to FixedArray, to help catch SizeClass indexing bugs in the future.
     20
     21        * heap/MarkedSpace.cpp:
     22        (JSC::MarkedSpace::MarkedSpace):
     23        (JSC::MarkedSpace::resetAllocator):
     24        (JSC::MarkedSpace::canonicalizeCellLivenessData): Updated for size ranges
     25        being inclusive.
     26
    1272011-09-30  Pierre Rossi  <pierre.rossi@gmail.com>
    228
  • trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp

    r95912 r96424  
    3636    , m_heap(heap)
    3737{
    38     for (size_t cellSize = preciseStep; cellSize < preciseCutoff; cellSize += preciseStep)
     38    for (size_t cellSize = preciseStep; cellSize <= preciseCutoff; cellSize += preciseStep)
    3939        sizeClassFor(cellSize).cellSize = cellSize;
    4040
    41     for (size_t cellSize = impreciseStep; cellSize < impreciseCutoff; cellSize += impreciseStep)
     41    for (size_t cellSize = impreciseStep; cellSize <= impreciseCutoff; cellSize += impreciseStep)
    4242        sizeClassFor(cellSize).cellSize = cellSize;
    4343}
     
    6565    m_waterMark = 0;
    6666
    67     for (size_t cellSize = preciseStep; cellSize < preciseCutoff; cellSize += preciseStep)
     67    for (size_t cellSize = preciseStep; cellSize <= preciseCutoff; cellSize += preciseStep)
    6868        sizeClassFor(cellSize).resetAllocator();
    6969
    70     for (size_t cellSize = impreciseStep; cellSize < impreciseCutoff; cellSize += impreciseStep)
     70    for (size_t cellSize = impreciseStep; cellSize <= impreciseCutoff; cellSize += impreciseStep)
    7171        sizeClassFor(cellSize).resetAllocator();
    7272}
     
    7474void MarkedSpace::canonicalizeCellLivenessData()
    7575{
    76     for (size_t cellSize = preciseStep; cellSize < preciseCutoff; cellSize += preciseStep)
     76    for (size_t cellSize = preciseStep; cellSize <= preciseCutoff; cellSize += preciseStep)
    7777        sizeClassFor(cellSize).zapFreeList();
    7878
    79     for (size_t cellSize = impreciseStep; cellSize < impreciseCutoff; cellSize += impreciseStep)
     79    for (size_t cellSize = impreciseStep; cellSize <= impreciseCutoff; cellSize += impreciseStep)
    8080        sizeClassFor(cellSize).zapFreeList();
    8181}
  • trunk/Source/JavaScriptCore/heap/MarkedSpace.h

    r95912 r96424  
    3333#include <wtf/Vector.h>
    3434
    35 #define ASSERT_CLASS_FITS_IN_CELL(class) COMPILE_ASSERT(sizeof(class) < MarkedSpace::maxCellSize, class_fits_in_cell)
     35#define ASSERT_CLASS_FITS_IN_CELL(class) COMPILE_ASSERT(sizeof(class) <= MarkedSpace::maxCellSize, class_fits_in_cell)
    3636
    3737namespace JSC {
     
    4646    WTF_MAKE_NONCOPYABLE(MarkedSpace);
    4747public:
    48     static const size_t maxCellSize = 1024;
     48    static const size_t maxCellSize = 2048;
    4949
    5050    struct SizeClass {
     
    7979
    8080private:
    81     // [ 8, 16... 128 )
     81    // [ 32... 256 ]
    8282    static const size_t preciseStep = MarkedBlock::atomSize;
    83     static const size_t preciseCutoff = 128;
    84     static const size_t maximumPreciseAllocationSize = preciseCutoff - preciseStep;
    85     static const size_t preciseCount = preciseCutoff / preciseStep - 1;
     83    static const size_t preciseCutoff = 256;
     84    static const size_t preciseCount = preciseCutoff / preciseStep;
    8685
    87     // [ 128, 256... 1024 )
     86    // [ 512... 2048 ]
    8887    static const size_t impreciseStep = preciseCutoff;
    8988    static const size_t impreciseCutoff = maxCellSize;
    90     static const size_t impreciseCount = impreciseCutoff / impreciseStep - 1;
     89    static const size_t impreciseCount = impreciseCutoff / impreciseStep;
    9190
    92     SizeClass m_preciseSizeClasses[preciseCount];
    93     SizeClass m_impreciseSizeClasses[impreciseCount];
     91    FixedArray<SizeClass, preciseCount> m_preciseSizeClasses;
     92    FixedArray<SizeClass, impreciseCount> m_impreciseSizeClasses;
    9493    size_t m_waterMark;
    9594    size_t m_highWaterMark;
     
    114113inline MarkedSpace::SizeClass& MarkedSpace::sizeClassFor(size_t bytes)
    115114{
    116     ASSERT(bytes && bytes < maxCellSize);
    117     if (bytes <= maximumPreciseAllocationSize)
     115    ASSERT(bytes && bytes <= maxCellSize);
     116    if (bytes <= preciseCutoff)
    118117        return m_preciseSizeClasses[(bytes - 1) / preciseStep];
    119118    return m_impreciseSizeClasses[(bytes - 1) / impreciseStep];
Note: See TracChangeset for help on using the changeset viewer.