[OpenJDK 2D-Dev] [13] JDK-8221411: NullPointerException in RasterPrinterJob without PrinterResolution
Phil Race
philip.race at oracle.com
Wed Mar 27 15:50:56 UTC 2019
Printer drivers sometimes are hard to fathom.
I don't know if this means we are missing something but the fix seems
safe enough.
+1
-phil.
On 3/27/19 5:08 AM, Prasanta Sadhukhan wrote:
>
> Hi All,
>
> Please review a fix for an issue where a NPE is seen when an attempt
> is made to print without PrinterResolution attributes in HP Deskjet
> 1510 printer.
>
> It seems when RasterPrinterJob#setAttributes() is called with no
> PrinterResolution attribute set, it first checks if PrinterResolution
> category is supported.
> If it is supported, then it sees if the supplied resolution value is
> supported. Now, since no PrinterResolution attribute is set, so
> isSupportedValue() returns false
> [as "printer resolution attribute" object is null]
> It then goes to get the default resolution attribute via
> getDefaultAttributeValue() which calls getDefaultPrinterSettings() and
> use yRes,Quality from this printer to construct a "PrinterResolution"
> object.
>
> JDK uses DocumentProperties function[1] to query the printer
> configuration data in windows and pDevMode->dmFields is initialized to
> 200bf43
> which corresponds to
> DM_ORIENTATION | DM_PAPERSIZE | DM_COPIES | DM_DEFAULTSOURCE |
> DM_PRINTQUALITY | DM_COLOR | DM_DUPLEX | DM_YRESOLUTION | DM_COLLATE
> | DM_NUP | DM_MEDIATYPE
> so even though DM_YRESOLUTION and DM_PRINTQUALITY indices are set,
> it seems for HP Deskjet 1510 printer returns -3 for both
> pDevMode->dmYResolution and pDevMode->dmPrintQuality
>
> so then Win32PrintService#getDefaultAttributeValue() checks for
> yRes,Quality and if they are < 0 then it does not instantiate
> PrinterResolution class ie printerResAttr object is null
> if (res >0) {
> return new PrinterResolution(res, res, PrinterResolution.DPI);
> }
> causing RasterPrinterJob#setAttributes to cause an NPE when it tries
> to call printerResAttr.getCrossFeedResolution(ResolutionSyntax.DPI);
>
> We have seen similar issue for Brother HL-2240D series printer, where
> DM_YRESOLUTION and DM_PRINTQUALITY was not set in dmFields even
> though pDevMode->dmYResolution and pDevMode->dmPrintQuality was
> populated so we check for those values and store that but here the
> values itself are -ve so it does not get stored and ultimately
> resulted in returning GETDEFAULT_ERROR(-50)
>
> Proposed fix is to check if printerResAttr is null or not so
> printerResAttr.getCrossFeedResolution(ResolutionSyntax.DPI); will not
> be called for bad values.
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8221411
> webrev: http://cr.openjdk.java.net/~psadhukhan/8221411/webrev.0/
>
> Regards
> Prasanta
> [1]
> [https://msdn.microsoft.com/en-us/library/windows/desktop/dd183576(v=vs.85).aspx]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/2d-dev/attachments/20190327/b9b56432/attachment.html>
More information about the 2d-dev
mailing list