Author: mortenw
Date: Sat Feb  9 02:40:58 2008
New Revision: 16365
URL: http://svn.gnome.org/viewvc/gnumeric?rev=16365&view=rev

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

        * ms-chart.c: Sprinkle some length checks.  Fixes #515269,
        #515275, and #515335.



Modified:
   trunk/NEWS
   trunk/plugins/excel/ChangeLog
   trunk/plugins/excel/ms-chart.c

Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS  (original)
+++ trunk/NEWS  Sat Feb  9 02:40:58 2008
@@ -23,7 +23,7 @@
          [#513317] [#513361] [#513364] [#513551] [#513605] [#513608] [#513790]
          [#513787] [#513835] [#513963] [#514229] [#514230] [#514295] [#514435]
          [#514436] [#514437] [#514506] [#514510] [#514630] [#514637] [#515155]
-         [#515269] [#515275]
+         [#515269] [#515275] [#515335]
        * Fix non-ascii export problem.  [#511135]
        * Band-aid evaluation problem with broken xls.  [#513559]
        * Fix circular array formula problem.

Modified: trunk/plugins/excel/ms-chart.c
==============================================================================
--- trunk/plugins/excel/ms-chart.c      (original)
+++ trunk/plugins/excel/ms-chart.c      Sat Feb  9 02:40:58 2008
@@ -589,7 +589,10 @@
                     XLChartReadState *s, BiffQuery *q)
 {
        guint16 opcode;
-       guint16 const type = GSF_LE_GET_GUINT16 (q->data);
+       guint16 type;
+
+       XL_CHECK_CONDITION_VAL (q->length >= 2, FALSE);
+       type = GSF_LE_GET_GUINT16 (q->data);
 
        d (0, {
        g_printerr ("Axisline is ");
@@ -913,7 +916,7 @@
 
        if (pt_num == 0 && series_index == 0 && series_index_for_label == 
0xfffd)
                s->has_extra_dataformat = TRUE;
-       XL_CHECK_CONDITION_VAL (s->series && series_index < s->series->len, 
TRUE);
+       XL_CHECK_CONDITION_VAL (series_index < s->series->len, TRUE);
 
        series = g_ptr_array_index (s->series, series_index);
        XL_CHECK_CONDITION_VAL (series != NULL, TRUE);
@@ -1829,9 +1832,14 @@
 BC_R(trendlimits)(XLChartHandler const *handle,
                  XLChartReadState *s, BiffQuery *q)
 {
-       double const min = GSF_LE_GET_DOUBLE (q->data);
-       double const max = GSF_LE_GET_DOUBLE (q->data+8);
-       guint8 const skip_invalid = GSF_LE_GET_GUINT8  (q->data+16);
+       double min, max;
+       gboolean skip_invalid;
+
+       XL_CHECK_CONDITION_VAL (q->length >= 17, FALSE);
+       min = GSF_LE_GET_DOUBLE (q->data);
+       max = GSF_LE_GET_DOUBLE (q->data + 8);
+       skip_invalid = GSF_LE_GET_GUINT8 (q->data + 16);
+
        d (1, {
                g_printerr ("skip invalid data: %s\n", (skip_invalid)? "yes": 
"no");
                g_printerr ("min: %g\n", min);
@@ -1850,6 +1858,7 @@
                     GogMSDimType purpose,
                     int type_offset, int count_offset, char const *name)
 {
+       XL_CHECK_CONDITION (q->length >= 2 + (unsigned)count_offset);
 #if 0
        switch (GSF_LE_GET_GUINT16 (q->data + type_offset)) {
        case 0 : /* date */ break;
@@ -1871,7 +1880,7 @@
 {
        XLChartSeries *series;
 
-       g_return_val_if_fail (s->currentSeries == NULL, TRUE);
+       XL_CHECK_CONDITION_VAL (s->currentSeries == NULL, TRUE);
 
        d (2, g_printerr ("SERIES = %d\n", s->series->len););
 
@@ -1909,12 +1918,15 @@
 BC_R(seriestext)(XLChartHandler const *handle,
                 XLChartReadState *s, BiffQuery *q)
 {
-       guint16 const id = GSF_LE_GET_GUINT16 (q->data);        /* must be 0 */
-       int const slen = GSF_LE_GET_GUINT8 (q->data + 2);
+       guint16 id;
+       int slen;
        char *str;
        GnmValue *value;
 
-       g_return_val_if_fail (id == 0, FALSE);
+       XL_CHECK_CONDITION_VAL (q->length >= 3, FALSE);
+       id = GSF_LE_GET_GUINT16 (q->data);      /* must be 0 */
+       slen = GSF_LE_GET_GUINT8 (q->data + 2);
+       XL_CHECK_CONDITION_VAL (id == 0, FALSE);
 
        if (slen == 0)
                return FALSE;
@@ -1949,7 +1961,10 @@
 BC_R(serparent)(XLChartHandler const *handle,
                XLChartReadState *s, BiffQuery *q)
 {
-       guint16 const index = GSF_LE_GET_GUINT16 (q->data) - 1;
+       guint16 index;
+
+       XL_CHECK_CONDITION_VAL (q->length >= 2, FALSE);
+       index = GSF_LE_GET_GUINT16 (q->data) - 1;
        d (1, g_printerr ("Parent series index is %hd\n", index););
        s->parent_index = index;
 
@@ -1962,9 +1977,11 @@
 BC_R(sertocrt)(XLChartHandler const *handle,
               XLChartReadState *s, BiffQuery *q)
 {
-       guint16 const index = GSF_LE_GET_GUINT16 (q->data);
+       guint16 index;
 
-       g_return_val_if_fail (s->currentSeries != NULL, FALSE);
+       XL_CHECK_CONDITION_VAL (q->length >= 2, FALSE);
+       XL_CHECK_CONDITION_VAL (s->currentSeries != NULL, FALSE);
+       index = GSF_LE_GET_GUINT16 (q->data);
 
        s->currentSeries->chart_group = index;
 
@@ -2025,6 +2042,7 @@
 BC_R(siindex)(XLChartHandler const *handle,
              XLChartReadState *s, BiffQuery *q)
 {
+       XL_CHECK_CONDITION_VAL (q->length >= 2, FALSE);
        /* UNDOCUMENTED : Docs says this is long
         * Biff record is only length 2 */
        s->cur_role = GSF_LE_GET_GUINT16 (q->data);
@@ -2037,6 +2055,8 @@
 BC_R(surf)(XLChartHandler const *handle,
           XLChartReadState *s, BiffQuery *q)
 {
+       XL_CHECK_CONDITION_VAL (q->length >= 6, FALSE);
+
 #warning implement wireframe (aka use-color)
 #if 0
        guint16 const flags = GSF_LE_GET_GUINT16 (q->data+4);
_______________________________________________
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