[gnumeric] xml: fix parsing problem.



commit 383f59e86d325fd609ba2211f4b524983fdf55a6
Author: Morten Welinder <terra gnome org>
Date:   Fri Jul 12 13:35:23 2013 -0400

    xml: fix parsing problem.
    
    Things could get confused when different sheets had different sizes.

 ChangeLog  |    7 +++++++
 NEWS       |    3 +++
 src/expr.c |   10 +++++++++-
 3 files changed, 19 insertions(+), 1 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index f491206..3605fe9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-07-12  Morten Welinder  <terra gnome org>
+
+       * src/expr.c (gnm_expr_range_op): When constructing a range, make
+       sure it falls within the sheet.
+       (gnm_expr_new_range_ctor): Don't optimize to range if the two
+       parts are on different sheets.  Fixes #704109.
+
 2013-07-10  Morten Welinder <terra gnome org>
 
        * configure.ac: Post-release bump.
diff --git a/NEWS b/NEWS
index a2377c7..e5eae63 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,9 @@ Gnumeric 1.12.5
 Andreas:
        * Improve ODF import of cells with links. [#704022]
 
+Morten:
+       * Fix crazy parsing problem.  [#704109]
+
 --------------------------------------------------------------------------
 Gnumeric 1.12.4
 
diff --git a/src/expr.c b/src/expr.c
index fe5d5b6..4ce80fb 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -360,6 +360,7 @@ GnmExpr const *
 gnm_expr_new_range_ctor (GnmExpr const *l, GnmExpr const *r)
 {
        GnmValue *v;
+       const GnmCellRef *lr, *rr;
 
        g_return_val_if_fail (l != NULL, NULL);
        g_return_val_if_fail (r != NULL, NULL);
@@ -369,7 +370,12 @@ gnm_expr_new_range_ctor (GnmExpr const *l, GnmExpr const *r)
        if (GNM_EXPR_GET_OPER (r) != GNM_EXPR_OP_CELLREF)
                goto fallback;
 
-       v = value_new_cellrange_unsafe (&l->cellref.ref, &r->cellref.ref);
+       lr = &l->cellref.ref;
+       rr = &r->cellref.ref;
+       if (lr->sheet != rr->sheet)
+               goto fallback;
+
+       v = value_new_cellrange_unsafe (lr, rr);
        gnm_expr_free (l);
        gnm_expr_free (r);
        return gnm_expr_new_constant (v);
@@ -1183,6 +1189,8 @@ gnm_expr_range_op (GnmExpr const *expr, GnmEvalPos const *ep,
        switch (GNM_EXPR_GET_OPER (expr)) {
        case GNM_EXPR_OP_RANGE_CTOR:
                res_range = range_union (&a_range, &b_range);
+               /* b_range might be on a bigger sheet.  */
+               range_ensure_sanity (&res_range, a_start);
                break;
        case GNM_EXPR_OP_INTERSECT:
                /* 3D references not allowed.  */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]