[OpenJDK 2D-Dev] jdk6 and jdk7: wrong class cast in sun.print.IPPPrintService (in Solaris classes)

Jennifer Godinez jennifer.godinez at oracle.com
Tue Nov 16 23:39:30 UTC 2010


Hi Nico,

Thank you for the very thorough explanation.  I will file the bug but I 
need the following information:
OS
JDKversion
hardware
CUPS version

Thank you.

Jennifer

Nico R. wrote:
> Hello!
>
> Jennifer Godinez wrote:
>   
>> In our code we only use http in getIPPConnection so we expect
>> HttpURLConnection .
>>     
>
> This is true for the calls to getIPPConnection from the CUPSPrinter
> class, but not for all calls. See below.
>
>   
>>  If openConection is returning FileURLConnection
>> then this looks like a bug and needs further investigation.
>>     
>
> Some investigation is below. I assume it is sufficient to reconstruct
> what is happening.
>
>   
>>   Please
>> file the bug at:
>>
>> http://bugreport.sun.com/bugreport/
>>     
>
> Unfortunately, I am not able to do this, because the bug reporting
> system does not work for me. (I’ve just sent a report about this problem
> using the contact form
> <URL:https://developers.sun.com/contact/feedback.jsp?category=sdn&mailsubject=General%20Site%20Comment>.)
>
> I’d appreciate it if you could report this bug instead. Here is some
> further investigation:
>
> It is not true that the code in OpenJDK always uses the "http" protocol.
> It may also use a protocol reported by CUPS for a printer, as explained
> by the following reverse call trace.
>
>
> IPPPrintService.getIPPConnection(URL)
> called by:
>     CUPSPrinter.getAllPrinters()
>       --> OK, always uses "http" protocol.
>     CUPSPrinter.getDefaultPrinter()
>       --> OK, always uses "http" protocol.
>
>     IPPPrintService.initAttributes()
>       --> uses same protocol as IPPPrintService.myURL
>     IPPPrintService.isPostscript()
>       --> uses same protocol as IPPPrintService.myURL
>
>
> URL IPPPrintService.myURL
> initialized by:
>     IPPPrintService(String,URL)
>       --> myURL is set to second parameter (url)
>
>     IPPPrintService(String,String,boolean)
>       --> if second parameter (uriStr) does not contain "ipp" and does
>           not contain "http", then myURL will be constructed from a
>           string which does not contain "http" (and may well be a "file"
>           URL if the input starts with "file:")
>
>
> IPPPrintService(String,String,boolean)
> called by:
>     UnixPrintServiceLookup.getDefaultPrintService()
>       --> OK, always uses "http" URL
>
>     UnixPrintServiceLookup.refreshServices()
>       --> uses string from local variable printerURIs[]
>
>
> printerURIs[] (local variable in IPPPrintService(String,String,boolean))
> initialized with value from:
>     CUPSPrinter.getAllPrinters()
>       --> returns String[] created from values from printerNames (local
>           variable)
>
>
> printerNames (local variable in CUPSPrinter.getAllPrinters())
> initialized from printer-uri-supported attribute values received from
> CUPS
>
>
> CUPS may report a "file" URL for a printer if, for example,
> /var/cache/cups/remote.cache (the file may be stored somewhere else,
> depending on your system/distribution/CUPS installation) contains a
> reference to "file:/dev/null". This is where the "file" URL originated
> on my test system.
>
> OpenJDK should be able to handle this properly, and it seems that
> someone already thought of implementing this, but introduced a bug here:
>
> In my original mail, I wrote:
> […]
>   
>>> The buggy code is:
>>>
>>>     public static HttpURLConnection getIPPConnection(URL url) {
>>>         HttpURLConnection connection;
>>>         try {
>>>             connection = (HttpURLConnection)url.openConnection();
>>>         } catch (java.io.IOException ioe) {
>>>             return null;
>>>         }
>>>         if (!(connection instanceof HttpURLConnection)) {
>>>             return null;
>>>         }
>>>       
>
> As I already explained, this code does not make sense:
>
> * if the class cast works, the block with ‘instanceof’ does not do anything;
>
> * if the class cast does not work, a ClassCastException is thrown, and
> the block with ‘instanceof’ is not executed at all.
>
> (A non-null reference read from a local variable is always instanceof
> the declared type of that variable, isn’t it?)
>
> If my explanations were not verbose enough, please tell me what to
> clarify further.
>
> Regards
>   



More information about the 2d-dev mailing list