summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2016-07-29 18:18:01 +0200
committerEike Rathke <erack@redhat.com>2016-07-29 18:25:28 +0200
commit5cf5975cef114870268bee792e44570ddfdaafe8 (patch)
treef89d7310d2f3365bd2ebecc3b8fffd1930a09bd6
parent1203bf57dea230cd6de7bb5fe359d8fcd3e033dc (diff)
limit SelectionFillDOOM to 24117248 cells, tdf#60021 tdf#60056 related
Change-Id: Idabf5e51b7f423d7d58094ad1caef166728c3bed
-rw-r--r--sc/source/ui/view/viewdata.cxx15
1 files changed, 10 insertions, 5 deletions
diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index dc310564632b..f87fda6e08ca 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -864,11 +864,16 @@ bool ScViewData::SelectionForbidsPaste()
// static
bool ScViewData::SelectionFillDOOM( const ScRange& rRange )
{
- /* TODO: it is still possible to select one row less than the entire sheet
- * and fool around. We could narrow this down to some "sane" value, just
- * what would be sane? At least this helps against the Ctrl+A cases. */
- return rRange.aStart.Col() == 0 && rRange.aEnd.Col() == MAXCOL &&
- rRange.aStart.Row() == 0 && rRange.aEnd.Row() == MAXROW;
+ // Assume that more than 23 full columns (23M cells) will not be
+ // successful.. Even with only 10 bytes per cell that would already be
+ // 230MB, formula cells would be 100 bytes and more per cell.
+ // rows * columns > 23m => rows > 23m / columns
+ // to not overflow in case number of available columns or rows would be
+ // arbitrarily increased.
+ // We could refine this and take some actual cell size into account,
+ // evaluate available memory and what not, but..
+ const sal_Int32 kMax = 23 * 1024 * 1024; // current MAXROWCOUNT is 1024*1024=1048576
+ return (rRange.aEnd.Row() - rRange.aStart.Row() + 1) > (kMax / (rRange.aEnd.Col() - rRange.aStart.Col() + 1));
}
void ScViewData::SetFillMode( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow )