Fix for 3365086, large tables crash Safari. Make sure to use ints rather than short...
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Aug 2004 21:19:35 +0000 (21:19 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Aug 2004 21:19:35 +0000 (21:19 +0000)
counts.  Also fix a pathological array resize scenario for tables as rows are added.

        Reviewed by darin

        * khtml/rendering/render_table.cpp:
        (RenderTable::splitColumn):
        (RenderTable::appendColumn):
        (RenderTableSection::RenderTableSection):
        (RenderTableSection::ensureRows):
        (RenderTableSection::setCellWidths):
        (RenderTableSection::calcRowHeight):
        (RenderTableSection::layoutRows):
        (RenderTableSection::paint):
        (RenderTableSection::recalcCells):
        (RenderTableSection::clearGrid):
        * khtml/rendering/render_table.h:
        (khtml::RenderTableSection::numRows):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@7364 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/khtml/rendering/render_table.cpp
WebCore/khtml/rendering/render_table.h

index 0b57a5fe71a165c8f29f992d19feb0ce59fd83d0..607796f9d976700ea4f10695520f0b8757b7f0ba 100644 (file)
@@ -1,3 +1,24 @@
+2004-08-25  David Hyatt  <hyatt@apple.com>
+
+       Fix for 3365086, large tables crash Safari.  Make sure to use ints rather than shorts for row and column
+       counts.  Also fix a pathological array resize scenario for tables as rows are added.
+       
+        Reviewed by darin
+
+        * khtml/rendering/render_table.cpp:
+        (RenderTable::splitColumn):
+        (RenderTable::appendColumn):
+        (RenderTableSection::RenderTableSection):
+        (RenderTableSection::ensureRows):
+        (RenderTableSection::setCellWidths):
+        (RenderTableSection::calcRowHeight):
+        (RenderTableSection::layoutRows):
+        (RenderTableSection::paint):
+        (RenderTableSection::recalcCells):
+        (RenderTableSection::clearGrid):
+        * khtml/rendering/render_table.h:
+        (khtml::RenderTableSection::numRows):
+
 2004-08-25  David Hyatt  <hyatt@apple.com>
 
        To save memory in the common case, move the margin***Collapse variables into the CSS3 struct instead of
index d857fbc9d86da5e05a71e379731f3e1a27091d2a..6213f8e8c9b3057e523514340a49fc16498f7c2e 100644 (file)
@@ -527,7 +527,7 @@ void RenderTable::splitColumn( int pos, int firstSpan )
     while ( child ) {
        if ( child->isTableSection() ) {
            RenderTableSection *section = static_cast<RenderTableSection *>(child);
-           int size = section->grid.size();
+           int size = section->numRows();
            int row = 0;
            if ( section->cCol > pos )
                section->cCol++;
@@ -561,7 +561,7 @@ void RenderTable::appendColumn( int span )
     while ( child ) {
        if ( child->isTableSection() ) {
            RenderTableSection *section = static_cast<RenderTableSection *>(child);
-           int size = section->grid.size();
+           int size = section->numRows();
            int row = 0;
            while ( row < size ) {
                section->grid[row].row->resize( newSize );
@@ -841,6 +841,7 @@ RenderTableSection::RenderTableSection(DOM::NodeImpl* node)
 {
     // init RenderObject attributes
     setInline(false);   // our object is not Inline
+    gridRows = 0;
     cCol = 0;
     cRow = -1;
     needCellRecalc = false;
@@ -932,15 +933,18 @@ void RenderTableSection::addChild(RenderObject *child, RenderObject *beforeChild
     RenderContainer::addChild(child,beforeChild);
 }
 
-void RenderTableSection::ensureRows( int numRows )
+void RenderTableSection::ensureRows(int numRows)
 {
-    int nRows = grid.size();
-    int nCols = table()->numEffCols();
-    if ( numRows > nRows ) {
-       grid.resize( numRows );
-       for ( int r = nRows; r < numRows; r++ ) {
-           grid[r].row = new Row( nCols );
-           grid[r].row->fill( 0 );
+    int nRows = gridRows;
+    if (numRows > nRows) {
+        if (numRows > static_cast<int>(grid.size()))
+            grid.resize(numRows*2+1);
+
+        gridRows = numRows;
+        int nCols = table()->numEffCols();
+       for (int r = nRows; r < numRows; r++ ) {
+           grid[r].row = new Row(nCols);
+           grid[r].row->fill(0);
            grid[r].baseLine = 0;
            grid[r].height = Length();
        }
@@ -1060,7 +1064,7 @@ void RenderTableSection::setCellWidths()
 #endif
     QMemArray<int> &columnPos = table()->columnPos;
 
-    int rows = grid.size();
+    int rows = gridRows;
     for ( int i = 0; i < rows; i++ ) {
        Row &row = *grid[i].row;
        int cols = row.size();
@@ -1094,7 +1098,7 @@ void RenderTableSection::calcRowHeight()
     int indx;
     RenderTableCell *cell;
 
-    int totalRows = grid.size();
+    int totalRows = gridRows;
     int spacing = table()->vBorderSpacing();
 
     rowPos.resize( totalRows + 1 );
@@ -1114,7 +1118,7 @@ void RenderTableSection::calcRowHeight()
 
        Row *row = grid[r].row;
        int totalCols = row->size();
-       int totalRows = grid.size();
+       int totalRows = gridRows;
 
        for ( int c = 0; c < totalCols; c++ ) {
            cell = cellAt(r, c);
@@ -1181,7 +1185,7 @@ int RenderTableSection::layoutRows( int toAdd )
 {
     int rHeight;
     int rindx;
-    int totalRows = grid.size();
+    int totalRows = gridRows;
     int hspacing = table()->hBorderSpacing();
     int vspacing = table()->vBorderSpacing();
     
@@ -1368,7 +1372,7 @@ int RenderTableSection::layoutRows( int toAdd )
 
 void RenderTableSection::paint(PaintInfo& i, int tx, int ty)
 {
-    unsigned int totalRows = grid.size();
+    unsigned int totalRows = gridRows;
     unsigned int totalCols = table()->columns.size();
 
     tx += m_x;
@@ -1435,7 +1439,7 @@ void RenderTableSection::recalcCells()
     cCol = 0;
     cRow = -1;
     clearGrid();
-    grid.resize( 0 );
+    gridRows = 0;
 
     RenderObject *row = firstChild();
     while ( row ) {
@@ -1456,7 +1460,7 @@ void RenderTableSection::recalcCells()
 
 void RenderTableSection::clearGrid()
 {
-    int rows = grid.size();
+    int rows = gridRows;
     while ( rows-- ) {
        delete grid[rows].row;
     }
index 44a81e9aa1f5288cebf3dcbb984cdcd47adc294e..e1a3cfdb289d45cf5fd95b497903c5eb4656b691 100644 (file)
@@ -247,7 +247,7 @@ public:
 
     virtual void paint(PaintInfo& i, int tx, int ty);
 
-    int numRows() const { return grid.size(); }
+    int numRows() const { return gridRows; }
     int getBaseline(int row) {return grid[row].baseLine;}
 
     void setNeedCellRecalc() {
@@ -260,11 +260,12 @@ public:
     // this gets a cell grid data structure. changing the number of
     // columns is done by the table
     QMemArray<RowStruct> grid;
+    int gridRows;
     QMemArray<int> rowPos;
 
-    ushort cCol : 15;
-    short cRow : 16;
-    bool needCellRecalc : 1;
+    int cCol;
+    int cRow;
+    bool needCellRecalc;
 
     void recalcCells();
 protected:
@@ -385,8 +386,8 @@ public:
 protected:
     virtual void paintBoxDecorations(PaintInfo& i, int _tx, int _ty);
     
-    short _row;
-    short _col;
+    int _row;
+    int _col;
     ushort rSpan;
     ushort cSpan;
     int _topExtra : 31;