cairo.c (apply_options): Fix potential memory leak
[pspp] / src / output / ascii.c
index 1c3e6b8238f8f7f0739310ae64bfea6b5778c3bb..1688fd1bf1217c8e0df48109eb64df2f7a45f1d9 100644 (file)
@@ -202,6 +202,24 @@ static void ascii_draw_cell (void *, const struct table_cell *,
                              int bb[TABLE_N_AXES][2],
                              int clip[TABLE_N_AXES][2]);
 
+static void
+reallocate_lines (struct ascii_driver *a)
+{
+  if (a->length > a->allocated_lines)
+    {
+      int i;
+      a->lines = xnrealloc (a->lines, a->length, sizeof *a->lines);
+      for (i = a->allocated_lines; i < a->length; i++)
+        {
+          struct ascii_line *line = &a->lines[i];
+          ds_init_empty (&line->s);
+          line->width = 0;
+        }
+      a->allocated_lines = a->length;
+    }
+}
+
+
 static struct ascii_driver *
 ascii_driver_cast (struct output_driver *driver)
 {
@@ -340,6 +358,8 @@ update_page_size (struct ascii_driver *a, bool issue_error)
       return false;
     }
 
+  reallocate_lines (a);
+
   return true;
 }
 
@@ -749,7 +769,9 @@ find_ascii_pos (struct ascii_line *line, int target_x, struct ascii_pos *c)
 static char *
 ascii_reserve (struct ascii_driver *a, int y, int x0, int x1, int n)
 {
-  struct ascii_line *line = &a->lines[y];
+  struct ascii_line *line;
+  assert (y < a->allocated_lines);
+  line = &a->lines[y];
 
   if (x0 >= line->width)
     {
@@ -953,7 +975,6 @@ ascii_layout_cell (struct ascii_driver *a, const struct table_cell *cell,
   if (length == 0)
     return;
 
-  text = cell->contents;
   breaks = xmalloc (length + 1);
   u8_possible_linebreaks (CHAR_CAST (const uint8_t *, text), length,
                           "UTF-8", breaks);
@@ -1083,19 +1104,19 @@ ascii_open_page (struct ascii_driver *a)
       a->file = fn_open (a->file_name, a->append ? "a" : "w");
       if (a->file != NULL)
         {
-#if HAVE_DECL_SIGWINCH
          if ( isatty (fileno (a->file)))
            {
+#if HAVE_DECL_SIGWINCH
              struct sigaction action;
              sigemptyset (&action.sa_mask);
              action.sa_flags = 0;
              action.sa_handler = winch_handler;
              the_driver = a;
+             sigaction (SIGWINCH, &action, NULL);
+#endif
              a->auto_width = true;
              a->auto_length = true;
-             sigaction (SIGWINCH, &action, NULL);
            }
-#endif
         }
       else
         {
@@ -1108,17 +1129,7 @@ ascii_open_page (struct ascii_driver *a)
 
   a->page_number++;
 
-  if (a->length > a->allocated_lines)
-    {
-      a->lines = xnrealloc (a->lines, a->length, sizeof *a->lines);
-      for (i = a->allocated_lines; i < a->length; i++)
-        {
-          struct ascii_line *line = &a->lines[i];
-          ds_init_empty (&line->s);
-          line->width = 0;
-        }
-      a->allocated_lines = a->length;
-    }
+  reallocate_lines (a);
 
   for (i = 0; i < a->length; i++)
     {