[OpenJDK 2D-Dev] [10] RFR JDK-8186987:NullPointerException in RasterPrinterJob without PrinterResolution

Philip Race philip.race at oracle.com
Wed Sep 20 06:47:12 UTC 2017


Since we are relying on 0 then we need to be sure that the memory
starts off as zero so a non-zero value is not random left-over from
a previous user of that memory.

If I read correctly we allocate this memory using GlobalAlloc in 
AwtPrintControl::getDevmode
and there pass GPTR which should ensure it is zeroed per
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366574(v=vs.85).aspx

So we should be OK .. and +1 to this version but I find this driver 
behaviour odd ..

-phil.

On 9/19/17, 11:29 PM, Prasanta Sadhukhan wrote:
>
> Hi Phil,
>
>
> On 9/19/2017 3:16 AM, Phil Race wrote:
>> Hi,
>>
>>
>> On 09/04/2017 03:07 AM, Prasanta Sadhukhan wrote:
>>> Hi Prahalad, Phil,
>>>
>>> JDK uses DocumentProperties function [1] to query the printer 
>>> configuration data in windows.
>>>
>>> For a RIcoh printer which we (in IDC) use by default, 
>>> pDevMode->dmFields is initialized to 0x200ff0f, which corresponds to
>>> DM_MEDIATYPE  | DM_DUPLEX   | DM_YRESOLUTION   | DM_TTOPTION | 
>>> DM_COLLATE  | DM_COPIES  | DM_DEFAULTSOURCE  | DM_PRINTQUALITY  |
>>> DM_COLOR  | DM_PAPERWIDTH  | DM_PAPERLENGTH | DM_PAPERSIZE  | 
>>> DM_ORIENTATION
>>>
>>> But, for, Brother printer, pDevMode->dmFields is initialized to 
>>> 0x1930f which corresponds to
>>> DM_FORMNAME  | DM_DUPLEX   | DM_COLLATE | DM_COPIES  | 
>>> DM_DEFAULTSOURCE  | DM_PAPERWIDTH  | DM_PAPERLENGTH | DM_PAPERSIZE | 
>>> DM_ORIENTATION
>>> so there is no DM_YRESOLUTION and DM_PRINTQUALITY in dmFields,
>>> so even though YRESOLUTION and PRINTQUALITY is populated by 
>>> :DocumentProperties API, the corresponding indices are not set,
>>> resulting in having "GETDEFAULT_ERROR" [-50] in the array for those 
>>> indices.
>>>
>>
>> Very odd. It sounds like a driver bug and I'm surprised that the 
>> Microsoft HWQL tests don't catch it.
>> Was the driver directly from Brother ? 
> Yes, I took the driver from 
> http://support.brother.com/g/b/downloadlist.aspx?c=us_ot&lang=en&prod=hl2240d_all&os=93
>
>> Perhaps someone considered those fields so mandatory
>> that you don't even need to check that they are set ?
>>
>> This case reminds me of the fishy settings for a different bug 
>> reviewed here : 
>> http://mail.openjdk.java.net/pipermail/2d-dev/2016-June/007011.html 
>> so ... I suppose this might be OK but still ..
>>
>>> I have modified my fix to populate the yresolution and printquality 
>>> indices even though dmFields are not set by :DocumeProperties, 
>>> provided those fields are not 0.
>>
>>
>> Actually the code says you are doing that only if as they are GREATER 
>> than zero .. not just different than zero.
>>
>> So here
>>   919   if (pDevMode->dmFields&  DM_PRINTQUALITY || pDevMode->dmPrintQuality>  0) {
>>
>> If quality is used by a driver but it forget to set the mask bit then you will still ignore it.
>> Perhaps you want != 0 ?
> Yes, right. I actually overlooked the spec which says
>
> *dmPrintQuality*
>
>     Specifies the printer resolution. There are four predefined
>     device-independent values:
>
>     *DMRES_HIGH*
>     *DMRES_MEDIUM*
>     *DMRES_LOW*
>     *DMRES_DRAFT*
>
>     If a positive value is specified, it specifies the number of dots
>     per inch (DPI) and is therefore device dependent
>
> and as per wingdi.h, these values are -ve. I have updated the fix to 
> use !=0.
>
>>
>>
>>>
>>> I have retained defaulting to low 300 dpi resolution as there might 
>>> be a case when AwtPrintControl::getDevmode() fails resulting in 
>>> returning default values which is -50.
>>
>> Are you referring to the code in Win32PrintService.java ?
>> I'm not sure about doing that. The way I read your code is now if a 
>> driver specifies dmQuality as negative
>> and leaves yRes at zero (meaning ignore it) .. you now no longer 
>> ignore it and return a new PrinterResolution
>> for a made up (300,300) resolution.
>>
> Ok, right. I looked at the spec and saw what you are saying
>
> *dmYResolution*
>
>     Specifies the y-resolution, in dots per inch, of the printer. If
>     the printer initializes this member, the *dmPrintQuality* member
>     specifies the x-resolution
>
> which means, if dmPrintQuality is initialized +ve for x resolution, 
> the y-resolution is specified by dmYResolution.
> Or in reverse way, if dmPrintQuality is -ve, then there might not be 
> any need of specifying dmYResolution.
>
> I have updated the webrev to cater to both changes
>
> http://cr.openjdk.java.net/~psadhukhan/8186987/webrev.02/
>
> Regards
> Prasanta
>
>
>>> Also, in linux, we do the similar 
>>> http://hg.openjdk.java.net/jdk10/client/jdk/file/70359afda5d0/src/java.desktop/unix/classes/sun/print/IPPPrintService.java#l1565
>>>
>> What we do in Linux (for Postscript) is different as postscript 
>> allows you to specify the DPI for your content
>> and the interpreter must handle that.
>>
>> -phil.
>>
>>> http://cr.openjdk.java.net/~psadhukhan/8186987/webrev.01/
>>>
>>> Regards
>>> Prasanta
>>> [1] 
>>> [https://msdn.microsoft.com/en-us/library/windows/desktop/dd183576(v=vs.85).aspx] 
>>>
>>> On 9/4/2017 8:28 AM, Prahalad Kumar Narayanan wrote
>>>> Hello Prasanta
>>>>
>>>> Thanks for the explanation.
>>>> Being new to the Printing subsystem, it helped get the context of 
>>>> the problem.
>>>>
>>>> As I understand, the problem is due to getDefaultPrinterSetings() 
>>>> returning negative values for defYRes and quality.
>>>> And the fix evades such negative values with a hardcoded low 300 
>>>> DPI resolution.
>>>>
>>>> I 'm suspecting the bug to be in the code that returns values for 
>>>> default printer settings
>>>> . Since these values are device specific, I believe, the code might 
>>>> use few platform APIs to query the resolutions on that printer 
>>>> device & return the same.
>>>> . It's here that default resolutions are not retrieved properly.
>>>> . So my view is to trace this location & fix the population of 
>>>> default printer settings than a hardcoded DPI resolution.
>>>>      . When a problem has surfaced on one printer, there is 
>>>> possibility for the same to occur on many devices as well.
>>>>      . Besides printers may not be supporting low 300 DPI 
>>>> resolution going forward.
>>>>
>>>> I may be wrong in my understanding. You could wait for other's 
>>>> review & follow up.
>>>>
>>>> Thank you
>>>> Have a good day
>>>>
>>>> Prahalad N.
>>>>
>>>> -----Original Message-----
>>>> From: Prasanta Sadhukhan
>>>> Sent: Thursday, August 31, 2017 3:39 PM
>>>> To: Philip Race; 2d-dev
>>>> Subject: [OpenJDK 2D-Dev] [10] RFR JDK-8186987:NullPointerException 
>>>> in RasterPrinterJob without PrinterResolution
>>>>
>>>> Hi All,
>>>>
>>>> Please review a fix for an issue where it a NPE is seen when an 
>>>> attempt is made to print to Brother HL-2240D series 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.
>>>>
>>>> Now, it seems in Brother HL-2240D series printer, it supports 3 
>>>> resolution [300, 600, HQ 1200] but for all these 3 resolutions,
>>>> getDefaultPrinterSettings() returns -50 for yRes and Quality.
>>>> So, as per this code
>>>> http://hg.openjdk.java.net/jdk10/client/jdk/file/dbb5b171a16b/src/java.desktop/windows/classes/sun/print/Win32PrintService.java#l1189 
>>>>
>>>> res < 0 and no PrinterResolution object is instantiated so when RPJ 
>>>> accesses 
>>>> printerResAttr.getCrossFeedResolution(ResolutionSyntax.DPI);   it 
>>>> causes NPE.
>>>>
>>>> Proposed fix is to create a default lowly 300 dpi PrinterResolution 
>>>> if, for some reason, yRes and Quality from printer comes out -ve.
>>>> http://cr.openjdk.java.net/~psadhukhan/8186987/webrev.00/
>>>>
>>>> Regards
>>>> Prasanta
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/2d-dev/attachments/20170919/3540ccce/attachment-0001.html>


More information about the 2d-dev mailing list