Author: mortenw
Date: Mon Feb 18 02:32:35 2008
New Revision: 16376
URL: http://svn.gnome.org/viewvc/gnumeric?rev=16376&view=rev

Log:
2008-02-17  Morten Welinder  <[EMAIL PROTECTED]>

        * ms-obj.c (ms_read_OBJ): Return error indicator.
        * ms-escher.c (ms_escher_read_ClientData): Handle errors from
        ms_read_OBJ.  Fixes #517106.



Modified:
   branches/gnumeric-1-8/NEWS
   branches/gnumeric-1-8/plugins/excel/ChangeLog
   branches/gnumeric-1-8/plugins/excel/ms-escher.c
   branches/gnumeric-1-8/plugins/excel/ms-obj.c
   branches/gnumeric-1-8/plugins/excel/ms-obj.h

Modified: branches/gnumeric-1-8/NEWS
==============================================================================
--- branches/gnumeric-1-8/NEWS  (original)
+++ branches/gnumeric-1-8/NEWS  Mon Feb 18 02:32:35 2008
@@ -3,6 +3,10 @@
 Hans de Goede:
        * Fix broken xls issues.  [#505330]
 
+Jean:
+       * Fix corrupted-xls-file problems.  [#514513] [#515343] [#515873]
+         [#515876]
+
 Morten:
        * Fix loading of solver constraints.
        * Fix solver issue.  [#512500]
@@ -10,8 +14,7 @@
          [#513317] [#513361] [#513364] [#513551] [#513605] [#513608] [#513790]
          [#513787] [#513835] [#513963] [#514229] [#514230] [#514295] [#514435]
          [#514436] [#514437] [#514506] [#514510] [#514630] [#514637] [#515155]
-         [#515269] [#515275] [#515335] [#515336] [#514513] [#515343] [#515873]
-         [#515876].
+         [#515269] [#515275] [#515335] [#515336] [#515339] [#517106].
        * Fix non-ascii export problem.  [#511135]
        * Band-aid evaluation problem with broken xls.  [#513559]
        * Fix circular array formula problem.

Modified: branches/gnumeric-1-8/plugins/excel/ms-escher.c
==============================================================================
--- branches/gnumeric-1-8/plugins/excel/ms-escher.c     (original)
+++ branches/gnumeric-1-8/plugins/excel/ms-escher.c     Mon Feb 18 02:32:35 2008
@@ -1986,8 +1986,11 @@
        g_return_val_if_fail (has_next_record, TRUE);
 
        /* The object takes responsibility for the attributes */
-       ms_read_OBJ (state->q, state->container, h->attrs);
        h->release_attrs = FALSE;
+       if (ms_read_OBJ (state->q, state->container, h->attrs)) {
+               h->attrs = NULL;  /* It got deleted.  */
+               return TRUE;
+       }
 
        return FALSE;
 }

Modified: branches/gnumeric-1-8/plugins/excel/ms-obj.c
==============================================================================
--- branches/gnumeric-1-8/plugins/excel/ms-obj.c        (original)
+++ branches/gnumeric-1-8/plugins/excel/ms-obj.c        Mon Feb 18 02:32:35 2008
@@ -34,6 +34,7 @@
 #include "ms-obj.h"
 #include "ms-chart.h"
 #include "ms-escher.h"
+#include "ms-excel-util.h"
 
 #include <expr.h>
 #include <parse-util.h>
@@ -942,7 +943,7 @@
 #endif
 
        /* Scan through the pseudo BIFF substream */
-       while (data_len_left > 0 && !hit_end) {
+       while (data_len_left >= 4 && !hit_end) {
                guint16 const record_type = GSF_LE_GET_GUINT16(data);
 
                /* All the sub-records seem to have this layout
@@ -953,13 +954,13 @@
                guint16 len = GSF_LE_GET_GUINT16(data+2);
 
                /* 1st record must be COMMON_OBJ*/
-               g_return_val_if_fail (obj->excel_type >= 0 ||
+               XL_CHECK_CONDITION_VAL (obj->excel_type >= 0 ||
                                      record_type == GR_COMMON_OBJ_DATA,
                                      TRUE);
 
                switch (record_type) {
                case GR_END:
-                       g_return_val_if_fail (len == 0, TRUE);
+                       XL_CHECK_CONDITION_VAL (len == 0, TRUE);
                        /* ms_obj_dump (data, len, data_len_left, "ObjEnd"); */
                        hit_end = TRUE;
                        break;
@@ -1083,7 +1084,7 @@
                        guint16 const options =GSF_LE_GET_GUINT16 (data+8);
 
                        /* Multiple objects in 1 record ?? */
-                       g_return_val_if_fail (obj->excel_type == -1, TRUE);
+                       XL_CHECK_CONDITION_VAL (obj->excel_type == -1, TRUE);
 
                        obj->excel_type = GSF_LE_GET_GUINT16(data+4);
                        obj->id = GSF_LE_GET_GUINT16(data+6);
@@ -1164,7 +1165,7 @@
        }
 
        /* Catch underflow too */
-       g_return_val_if_fail (data_len_left == 0, TRUE);
+       XL_CHECK_CONDITION_VAL (data_len_left == 0, TRUE);
 
        /* FIXME : Throw away the IMDATA that may follow.
         * I am not sure when the IMDATA does follow, or how to display it,
@@ -1190,9 +1191,11 @@
  * ms_read_OBJ :
  * @q : The biff record to start with.
  * @c : The object's container
- * @attrs : an OPTIONAL hash of object attributes.
+ * @attrs : an optional hash of object attributes.
+ *
+ * This function takes ownership of attrs.
  */
-void
+gboolean
 ms_read_OBJ (BiffQuery *q, MSContainer *c, MSObjAttrBag *attrs)
 {
        static char const * const object_type_names[] = {
@@ -1227,8 +1230,8 @@
        MSObj *obj;
 
        /* no decent docs for this */
-       if  (c->importer->ver <= MS_BIFF_V4)
-               return;
+       if (c->importer->ver <= MS_BIFF_V4)
+               return FALSE;
 
 #ifndef NO_DEBUG_EXCEL
        if (ms_excel_object_debug > 0)
@@ -1245,7 +1248,7 @@
                        printf ("}; /* OBJ error 1 */\n");
 #endif
                ms_obj_delete (obj);
-               return;
+               return TRUE;
        }
 
        obj->excel_type_name = NULL;
@@ -1268,11 +1271,13 @@
        if (obj->excel_type == 0x5) {
                if (ms_excel_chart_read_BOF (q, c, obj->gnum_obj)) {
                        ms_obj_delete (obj);
-                       return;
+                       return TRUE;
                }
        }
 
        ms_container_add_obj (c, obj);
+
+       return FALSE;
 }
 
 /**********************************************************************/

Modified: branches/gnumeric-1-8/plugins/excel/ms-obj.h
==============================================================================
--- branches/gnumeric-1-8/plugins/excel/ms-obj.h        (original)
+++ branches/gnumeric-1-8/plugins/excel/ms-obj.h        Mon Feb 18 02:32:35 2008
@@ -140,7 +140,7 @@
        MSObjAttrBag    *attrs;
 };
 MSObj *ms_obj_new    (MSObjAttrBag *ab);
-void   ms_read_OBJ   (BiffQuery *q, MSContainer *c, MSObjAttrBag *ab);
+gboolean ms_read_OBJ   (BiffQuery *q, MSContainer *c, MSObjAttrBag *ab);
 void   ms_obj_delete (MSObj *obj);
 char  *ms_read_TXO   (BiffQuery *q, MSContainer *c, PangoAttrList **markup);
 
_______________________________________________
SVN-commits-list mailing list (read only)
http://mail.gnome.org/mailman/listinfo/svn-commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit 
your options and select the modules ('topics') you want.
Module maintainer? It is possible to set the reply-to to your development 
mailing list. Email [EMAIL PROTECTED] if interested.

Reply via email to