cairo: Require minimum page width.
authorBen Pfaff <blp@gnu.org>
Fri, 5 Feb 2010 04:21:47 +0000 (20:21 -0800)
committerBen Pfaff <blp@gnu.org>
Sat, 6 Feb 2010 04:14:18 +0000 (20:14 -0800)
A too-narrow page (in particular, a zero-width page) can cause an infinite
loop in the rendering code.

src/output/cairo.c

index ba94cc53762fbd28c623e8a4e2218440f8f5ffbd..94dafd886b7914356b856701c09e6564269426b1 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2009 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2010 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
@@ -235,7 +235,7 @@ static struct output_driver *
 xr_create (const char *name, enum output_device_type device_type,
            struct string_map *o)
 {
-  enum { MIN_LENGTH = 3 };
+  enum { MIN_WIDTH = 3, MIN_LENGTH = 3 };
   struct output_driver *d;
   struct xr_driver *xr;
   cairo_surface_t *surface;
@@ -300,6 +300,16 @@ xr_create (const char *name, enum output_device_type device_type,
   if (!xr_set_cairo (xr, xr->cairo))
     goto error;
 
+  if (xr->width / (xr->font_height / 2) < MIN_WIDTH)
+    {
+      error (0, 0, _("The defined page is not wide enough to hold at least %d "
+                     "characters in the default font.  In fact, there's only "
+                     "room for %d characters."),
+             MIN_WIDTH,
+             xr->width / (xr->font_height / 2));
+      goto error;
+    }
+
   if (xr->length / xr->font_height < MIN_LENGTH)
     {
       error (0, 0, _("The defined page is not long "