diff options
Diffstat (limited to 'devices/gdevepsc.c')
-rw-r--r-- | devices/gdevepsc.c | 76 |
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. */ |