Fix segfault drawing pie charts with old versions of libplot.
authorBen Pfaff <blp@gnu.org>
Fri, 3 Jul 2009 18:34:26 +0000 (11:34 -0700)
committerBen Pfaff <blp@gnu.org>
Fri, 3 Jul 2009 18:34:26 +0000 (11:34 -0700)
If chart_create returned null, we dereferenced a null pointer just below.
Avoid doing this.

Also add similar fixes to other code that calls chart_create.  It may not
be necessary in every case.

Reported by Jason Stover.

src/language/stats/examine.q
src/output/charts/piechart.c
src/output/charts/plot-hist.c

index 4254d4fbb5ec9fbe8ac3ce3900ddc19c1e6911a5..592bb56b13fa18d02279a6c50082f448e51849d5 100644 (file)
@@ -1797,6 +1797,9 @@ box_plot_variables (const struct factor *fctr,
       double y_min = DBL_MAX;
       double y_max = -DBL_MAX;
       struct chart *ch = chart_create ();
+      if (ch == NULL)
+        break;
+
       ds_init_empty (&str);
       factor_to_string (fctr, *fs, 0, &str );
 
@@ -1852,6 +1855,8 @@ box_plot_group (const struct factor *fctr,
       struct chart *ch;
 
       ch = chart_create ();
+      if (ch == NULL)
+        break;
 
       boxplot_draw_yscale (ch, totals[i].max, totals[i].min);
 
index aa52f99e9d1560e7a1e95552dff4deb28f4e6e71..d7db80e921a6f573991ed0be14e1eaf583e8527d 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2004 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2009 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -57,22 +57,26 @@ piechart_plot(const char *title, const struct slice *slices, int n_slices)
   int i;
   double total_magnetude=0;
 
-  struct chart *ch = chart_create();
+  struct chart *ch;
 
-  const double left_label = ch->data_left +
-    (ch->data_right - ch->data_left)/10.0;
+  double left_label;
+  double right_label;
 
-  const double right_label = ch->data_right -
-    (ch->data_right - ch->data_left)/10.0;
+  double centre_x;
+  double centre_y;
 
-  const double centre_x = (ch->data_right + ch->data_left ) / 2.0 ;
-  const double centre_y = (ch->data_top + ch->data_bottom ) / 2.0 ;
+  double radius;
 
-  const double radius = MIN(
-                           5.0 / 12.0 * (ch->data_top - ch->data_bottom),
-                           1.0 / 4.0 * (ch->data_right - ch->data_left)
-                           );
+  ch = chart_create ();
+  if (ch == NULL)
+    return;
 
+  left_label = ch->data_left + (ch->data_right - ch->data_left)/10.0;
+  right_label = ch->data_right - (ch->data_right - ch->data_left)/10.0;
+  centre_x = (ch->data_right + ch->data_left ) / 2.0;
+  centre_y = (ch->data_top + ch->data_bottom ) / 2.0;
+  radius = MIN (5.0 / 12.0 * (ch->data_top - ch->data_bottom),
+                1.0 / 4.0 * (ch->data_right - ch->data_left));
 
   chart_write_title(ch, "%s", title);
 
index b567370c2780222dfe8e5c8fb548601e90a32fd3..88ad0899199d939dd5411cfb8fb2656368e395a4 100644 (file)
@@ -117,6 +117,9 @@ histogram_plot(const gsl_histogram *hist,
   struct chart *ch;
 
   ch = chart_create();
+  if (ch == NULL)
+    return;
+
   chart_write_title(ch, _("HISTOGRAM"));
 
   chart_write_ylabel(ch, _("Frequency"));