summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'devices/gdevepsc.c')
-rw-r--r--devices/gdevepsc.c76
1 files changed, 55 insertions, 21 deletions
diff --git a/devices/gdevepsc.c b/devices/gdevepsc.c
index 192128a4..f6fa2b30 100644
--- a/devices/gdevepsc.c
+++ b/devices/gdevepsc.c
@@ -174,27 +174,55 @@ epsc_print_page(gx_device_printer * pdev, gp_file * prn_stream)
int y_mult = (y_24pin ? 3 : 1);
int line_size = (pdev->width + 7) >> 3; /* always mono */
int in_size = line_size * (8 * y_mult);
- byte *in =
- (byte *) gs_malloc(pdev->memory, in_size + 1, 1,
- "epsc_print_page(in)");
int out_size = ((pdev->width + 7) & -8) * y_mult;
- byte *out =
- (byte *) gs_malloc(pdev->memory, out_size + 1, 1,
- "epsc_print_page(out)");
+ byte *in;
+ byte *out;
int x_dpi = (int)pdev->x_pixels_per_inch;
- char start_graphics = (char)
- ((y_24pin ? graphics_modes_24 : graphics_modes_9)[x_dpi / 60]);
- int first_pass = (start_graphics & DD ? 1 : 0);
- int last_pass = first_pass * 2;
- int dots_per_space = x_dpi / 10; /* pica space = 1/10" */
- int bytes_per_space = dots_per_space * y_mult;
- int skip = 0, lnum = 0, pass;
-/* declare color buffer and related vars */
+ char start_graphics;
+ int first_pass;
+ int last_pass;
+ int dots_per_space;
+ int bytes_per_space;
+ int skip = 0, lnum = 0, code = 0, pass;
+
byte *color_in;
int color_line_size, color_in_size;
- int spare_bits = (pdev->width % 8); /* left over bits to go to margin */
- int whole_bits = pdev->width - spare_bits;
+ int spare_bits;
+ int whole_bits;
+
+ int max_dpi = 60 * (
+ (y_24pin) ?
+ sizeof(graphics_modes_24) / sizeof(graphics_modes_24[0])
+ :
+ sizeof(graphics_modes_9) / sizeof(graphics_modes_9[0])
+ )
+ - 1;
+ if (x_dpi > max_dpi) {
+ return_error(gs_error_rangecheck);
+ }
+
+ start_graphics = (char)
+ ((y_24pin ? graphics_modes_24 : graphics_modes_9)[x_dpi / 60]);
+ first_pass = (start_graphics & DD ? 1 : 0);
+ last_pass = first_pass * 2;
+ dots_per_space = x_dpi / 10; /* pica space = 1/10" */
+ bytes_per_space = dots_per_space * y_mult;
+ if (bytes_per_space == 0) {
+ /* This avoids divide by zero later on, bug 701843. */
+ return_error(gs_error_rangecheck);
+ }
+
+ in =
+ (byte *) gs_malloc(pdev->memory, in_size + 1, 1,
+ "epsc_print_page(in)");
+ out =
+ (byte *) gs_malloc(pdev->memory, out_size + 1, 1,
+ "epsc_print_page(out)");
+
+ /* declare color buffer and related vars */
+ spare_bits = (pdev->width % 8); /* left over bits to go to margin */
+ whole_bits = pdev->width - spare_bits;
/* Check allocations */
if (in == 0 || out == 0) {
@@ -204,7 +232,7 @@ epsc_print_page(gx_device_printer * pdev, gp_file * prn_stream)
if (out)
gs_free(pdev->memory, (char *)out, out_size + 1, 1,
"epsc_print_page(out)");
- return -1;
+ return_error(gs_error_VMerror);
}
/* Initialize the printer and reset the margins. */
@@ -220,7 +248,7 @@ epsc_print_page(gx_device_printer * pdev, gp_file * prn_stream)
"epsc_print_page(in)");
gs_free(pdev->memory, (char *)out, out_size + 1, 1,
"epsc_print_page(out)");
- return (-1);
+ return_error(gs_error_VMerror);
}
} else {
color_in = in;
@@ -235,7 +263,9 @@ epsc_print_page(gx_device_printer * pdev, gp_file * prn_stream)
byte *nextmono = NULL; /* position to map next color */
/* Copy 1 scan line and test for all zero. */
- gdev_prn_copy_scan_lines(pdev, lnum, color_in, color_line_size);
+ code = gdev_prn_copy_scan_lines(pdev, lnum, color_in, color_line_size);
+ if (code < 0)
+ goto xit;
if (color_in[0] == 0 &&
!memcmp((char *)color_in, (char *)color_in + 1,
@@ -255,9 +285,12 @@ epsc_print_page(gx_device_printer * pdev, gp_file * prn_stream)
gp_fprintf(prn_stream, "\033J%c", skip);
/* Copy the rest of the scan lines. */
- lcnt = 1 + gdev_prn_copy_scan_lines(pdev, lnum + 1,
+ code = gdev_prn_copy_scan_lines(pdev, lnum + 1,
color_in + color_line_size,
color_in_size - color_line_size);
+ if (code < 0)
+ goto xit;
+ lcnt = code + 1;
if (lcnt < 8 * y_mult) {
memset((char *)(color_in + lcnt * color_line_size), 0,
@@ -425,13 +458,14 @@ epsc_print_page(gx_device_printer * pdev, gp_file * prn_stream)
/* Eject the page and reinitialize the printer */
gp_fputs("\f\033@", prn_stream);
+xit:
gs_free(pdev->memory, (char *)out, out_size + 1, 1,
"epsc_print_page(out)");
gs_free(pdev->memory, (char *)in, in_size + 1, 1, "epsc_print_page(in)");
if (gx_device_has_color(pdev))
gs_free(pdev->memory, (char *)color_in, color_in_size + 1, 1,
"epsc_print_page(rin)");
- return 0;
+ return code;
}
/* Output a single graphics command. */