86e716e
From 9faf077b85098436ac29b9369bfc7d8a9286fbd3 Mon Sep 17 00:00:00 2001
86e716e
From: Eike Rathke <erack@redhat.com>
86e716e
Date: Mon, 23 Jan 2012 15:43:50 +0100
86e716e
Subject: [PATCH 4/5] resolved rhbz#783556 crash in ScMatrix::GetDimensons()
86e716e
 from ScInterpreter
86e716e
86e716e
* Interpreter tried to access a nonexistent matrix for external reference.
86e716e
* In ScInterpreter::PopExternalDoubleRef(ScMatrixRef& rMat) set error for
86e716e
  unexpected conditions. In caller or descendants check for error or presence
86e716e
  of ScMatrix.
86e716e
---
86e716e
 sc/source/core/tool/interpr4.cxx |   11 ++++++++++-
86e716e
 1 files changed, 10 insertions(+), 1 deletions(-)
86e716e
86e716e
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
86e716e
index 07ff54b..424c713 100644
86e716e
--- a/sc/source/core/tool/interpr4.cxx
86e716e
+++ b/sc/source/core/tool/interpr4.cxx
86e716e
@@ -1285,6 +1285,8 @@ ScDBRangeBase* ScInterpreter::PopDBDoubleRef()
86e716e
                 pMat = PopMatrix();
86e716e
             else
86e716e
                 PopExternalDoubleRef(pMat);
86e716e
+            if (nGlobalError)
86e716e
+                break;
86e716e
             return new ScDBExternalRange(pDok, pMat);
86e716e
         }
86e716e
         default:
86e716e
@@ -1535,7 +1537,14 @@ void ScInterpreter::PopExternalDoubleRef(ScMatrixRef& rMat)
86e716e
     // references, which means the array should only contain a
86e716e
     // single matrix token.
86e716e
     ScToken* p = static_cast<ScToken*>(pArray->First());
86e716e
-    rMat = p->GetMatrix();
86e716e
+    if (!p || p->GetType() != svMatrix)
86e716e
+        SetError( errIllegalParameter);
86e716e
+    else
86e716e
+    {
86e716e
+        rMat = p->GetMatrix();
86e716e
+        if (!rMat)
86e716e
+            SetError( errUnknownVariable);
86e716e
+    }
86e716e
 }
86e716e
 
86e716e
 void ScInterpreter::GetExternalDoubleRef(
86e716e
-- 
86e716e
1.7.7.6
86e716e