From: Nathan Muggli <nmuggli@google.com>

Add some checks which attempt to verify the validity of a page header.  This
will prevent printing a page that is larger than the printer can handle.

--- a/prnt/hpcups/HPCupsFilter.cpp
+++ b/prnt/hpcups/HPCupsFilter.cpp
@@ -42,6 +42,7 @@
 #include <sys/wait.h>
 #include <sys/utsname.h>
 #include <time.h>
+#include <math.h>
 #include "utils.h"
 
 #define HP_FILE_VERSION_STR    "03.09.08.0"
@@ -673,13 +673,54 @@
 	    }
     #endif
 
+    // Get the max page size (in points) this printer supports by looking at the
+    // custom size in addition to all supported sizes
+    float max_page_height_points = 842.0f; // max(A4,Letter)
+    float max_page_width_points = 612.0f;  // max(A4,Letter)
+    if (m_ppd) {
+
+        if (m_ppd->variable_sizes == 1) {
+            max_page_width_points = fmax(max_page_width_points,
+                                         m_ppd->custom_max[0]);
+            max_page_height_points = fmax(max_page_height_points,
+                                          m_ppd->custom_max[1]);
+        }
+
+        for (int size_index = 0; size_index < m_ppd->num_sizes; ++size_index) {
+            const ppd_size_t* const size = m_ppd->sizes + size_index;
+            max_page_width_points = fmax(max_page_width_points, size->width);
+            max_page_height_points = fmax(max_page_height_points, size->length);
+        }
+    }
+    // Use an arbitrarily large maximum resolution to find the page limits
+    static const unsigned max_resolution = 40000;
+    // Convert our max size (width and height) to pixels (rounding up).
+    const unsigned max_page_width_pixels = ceilf(
+        max_page_width_points / 72.0f * max_resolution);
+    const unsigned max_page_height_pixels = ceilf(
+        max_page_height_points / 72.0f * max_resolution);
+
     unsigned buffer_size = 0;
     unsigned cups_width = 0;
     while (cupsRasterReadHeader2(cups_raster, &cups_header))
     {
         if (buffer_size == 0) {
             buffer_size = cups_header.cupsWidth * 4 + 32;
             cups_width = cups_header.cupsWidth;
+        }
+
+        // Don't try and print a page larger than our max width or height.
+        if (cups_header.cupsWidth > max_page_width_pixels) {
+            dbglog("ERROR: cupsWidth %u for page %d is larger than max of %u\n",
+                   cups_header.cupsWidth, current_page_number + 1,
+                   max_page_width_pixels);
+            return SYSTEM_ERROR;
+        }
+        if (cups_header.cupsHeight > max_page_height_pixels) {
+          dbglog("ERROR: cupsHeight %u for page %d is larger than max of %u\n",
+                 cups_header.cupsHeight, current_page_number + 1,
+                 max_page_height_pixels);
+          return SYSTEM_ERROR;
         }
 
         // cupsBytesPerLine cannot be larger than the buffer size.
