[gnumeric] Fix crash when the embedded spreadsheet is invalid. [#481]



commit 0fd35c2d43ef6be97129c3f5a575e224b6671538
Author: Jean Brefort <jean brefort normalesup org>
Date:   Sat Apr 25 16:59:22 2020 +0200

    Fix crash when the embedded spreadsheet is invalid. [#481]

 ChangeLog                    |  9 +++++++++
 NEWS                         |  3 +++
 component/gnumeric.c         | 15 ++++++++++++---
 src/sheet-object-component.c |  2 ++
 4 files changed, 26 insertions(+), 3 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 26c708f72..daee1f1b2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2020-04-25  Jean Brefort  <jean brefort normalesup org>
+
+       reviewed by: <delete if not using a buddy>
+
+       * component/gnumeric.c (go_gnm_component_update_data),
+       (go_gnm_component_set_data), (go_gnm_component_render):
+       * src/sheet-object-component.c (soc_xml_finish),
+       (sheet_object_component_new):
+
 2020-04-24  Morten Welinder  <terra gnome org>
 
        * src/dependent.c (sheet_region_queue_recalc): Fix problem with
diff --git a/NEWS b/NEWS
index 970ee6372..3503bb0c9 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
 Gnumeric 1.12.47
 
+Jean:
+       * Fix crash when the embedded spreadsheet is invalid. [#481]
+
 Morten:
        * Fix dialog size problem.
        * Add "--set CELL=CONTENTS" option to ssconvert.
diff --git a/component/gnumeric.c b/component/gnumeric.c
index 79bcb0761..2f96dcfd1 100644
--- a/component/gnumeric.c
+++ b/component/gnumeric.c
@@ -110,6 +110,7 @@ go_gnm_component_update_data (GOGnmComponent *gognm)
 {
        SheetView *sv;
        GnmRange const *range;
+       g_return_if_fail (GNM_IS_WORKBOOK_VIEW (gognm->wv));
        gognm->sheet = wb_view_cur_sheet (gognm->wv);
        sv = sheet_get_view (gognm->sheet, gognm->wv);
        range = selection_first_range (sv, NULL, NULL);
@@ -138,10 +139,17 @@ go_gnm_component_set_data (GOComponent *component)
        if (gognm->wv != NULL) {
                g_object_unref (gognm->wv);
                g_object_unref (gognm->wb);
+               gognm->wv = NULL;
        }
        gognm->wv = workbook_view_new_from_input (input, NULL, NULL, io_context, NULL);
-       gognm->wb = wb_view_get_workbook (gognm->wv);
-       gnm_app_workbook_list_remove (gognm->wb);
+       if (!GNM_IS_WORKBOOK_VIEW (gognm->wv)) {
+               g_warning ("Invalid component data");
+               gognm->wv = NULL;
+               gognm->wb = NULL;
+       } else {
+               gognm->wb = wb_view_get_workbook (gognm->wv);
+               gnm_app_workbook_list_remove (gognm->wb);
+       }
        g_object_unref (io_context);
        go_gnm_component_update_data (gognm);
 }
@@ -152,6 +160,7 @@ go_gnm_component_render (GOComponent *component, cairo_t *cr, double width_pixel
        GOGnmComponent *gognm = GO_GNM_COMPONENT (component);
        GnmRange range;
 
+       g_return_if_fail (GNM_IS_WORKBOOK_VIEW (gognm->wv));
        if (!gognm->sheet)
                go_gnm_component_update_data (gognm);
 
@@ -182,7 +191,7 @@ cb_gognm_save (G_GNUC_UNUSED GtkAction *a, WBCGtk *wbcg)
                                g_object_unref (gognm->wv);
                                g_object_unref (gognm->wb);
                        }
-                       gognm->wv = g_object_ref (wv);
+            gognm->wv = g_object_ref (wv);
                        gognm->wb = wb_view_get_workbook (wv);
                        gnm_app_workbook_list_remove (gognm->wb); /* no need to have this one in the list */
                }
diff --git a/src/sheet-object-component.c b/src/sheet-object-component.c
index 2305e4fb5..135698602 100644
--- a/src/sheet-object-component.c
+++ b/src/sheet-object-component.c
@@ -304,6 +304,7 @@ static void
 soc_xml_finish (GOComponent *component, SheetObject *so)
 {
        sheet_object_component_set_component (so, component);
+       g_object_unref (component);
 }
 
 static void
@@ -456,6 +457,7 @@ sheet_object_component_new (GOComponent *component)
 {
        SheetObjectComponent *soc = g_object_new (GNM_SO_COMPONENT_TYPE, NULL);
        sheet_object_component_set_component (GNM_SO (soc), component);
+       g_object_unref (component);
        return GNM_SO (soc);
 }
 


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