[OpenJDK 2D-Dev] <AWT Dev> [rfc]Stream doesn't reset mark in finally
Andrew Hughes
gnu.andrew at redhat.com
Wed Nov 25 17:53:48 UTC 2015
----- Original Message -----
> On 11/18/2015 06:17 PM, Jiri Vanek wrote:
> > On 11/12/2015 02:24 PM, Sergey Bylokhov wrote:
> >> Hi, Jiri.
> >> This is a valid point, did you file a new CR for this issue?
>
> ping?
>
> >>
> >
> > Hello!
> >
> > here it is:
> > https://jvanek.fedorapeople.org/oracle/jdk8/webrevs/resetInTryFinally/v1/
> >
> > Patch:
> > https://jvanek.fedorapeople.org/oracle/jdk8/webrevs/resetInTryFinally/v1/webrev/
> > and reprodcuer
> > https://jvanek.fedorapeople.org/oracle/jdk8/webrevs/resetInTryFinally/v1/MarkTryFinallyReproducer.java
> >
> >
> > Reproducer can be easily turned to jtreg if wonted.
> >
> > The patch is for 8, but is valid also for 9, except the path to file.
> > I will adapt it to 9 once you are ok with it (or you may on your own,
> > depends on you)
> >
> > J.
> >
> >
> >> On 09.11.15 15:45, Alexander Scherbatiy wrote:
> >>> On 11/7/2015 11:38 AM, Jiri Vanek wrote:
> >>>> Hello!
> >>>>
> >>>> Looking to imageIO.java (if this is bad thread, please redirect me!)
> >>>
> >>> 2d-dev alias should be also the right place to ask image related
> >>> questions in AWT.
> >>>
> >>> Thanks,
> >>> Alexandr.
> >>>
> >>>> when reading images
> >>>> http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/javax/imageio/ImageIO.java#l543
> >>>>
> >>>>
> >>>>
> >>>> and ending at:
> >>>>
> >>>> // Perform mark/reset as a defensive measure
> >>>> // even though plug-ins are supposed to take
> >>>> // care of it.
> >>>> boolean canDecode = false;
> >>>> if (stream != null) {
> >>>> stream.mark();
> >>>> }
> >>>> canDecode = spi.canDecodeInput(input);
> >>>> if (stream != null) {
> >>>> stream.reset();
> >>>> }
> >>>> return canDecode;
> >>>>
> >>>> I'm wondering, why stream.reset(); is not in finaly block:
> >>>>
> >>>> // Perform mark/reset as a defensive measure
> >>>> // even though plug-ins are supposed to take
> >>>> // care of it.
> >>>> boolean canDecode = false;
> >>>> if (stream != null) {
> >>>> stream.mark();
> >>>> }
> >>>> try{
> >>>> canDecode = spi.canDecodeInput(input);
> >>>> } finally {
> >>>> if (stream != null) {
> >>>> stream.reset();
> >>>> }
> >>>> }
> >>>> return canDecode;
> >>>>
> >>>>
> >>>> Eg png and bmp decoders can are throwing IIOException when header is
> >>>> corrutped. That pretty definitely sure killer of stream mark stacks.
> >>>> You yourselves write : //Perform mark/reset as a defensive measure
> >>>> even though plug-ins are supposed to take care of it.
> >>>> So if densive, then try/finaly please.
> >>>>
> >>>> I did not check if this changed in 9 but if not....Please. This is
> >>>> makig work on custom image plugins, for image formats which just wraps
> >>>> another bmp/png and are expecting corrupted headers preatty hards.
> >>>>
> >>>>
> >>>> J.
> >>>
> >>
> >>
> >
>
>
I've filed https://bugs.openjdk.java.net/browse/JDK-8144071 for this.
The change looks good to me. I can confirm the reproducer fails
on OpenJDK 6, 7 and 8:
Exception in thread "main" java.lang.RuntimeException: exeption from call to canDecodeInput in ImageIO corrupted stack in ImageInputStream
at MarkTryFinallyReproducer.main(MarkTryFinallyReproducer.java:317)
I suggest the test case is converted to jtreg and the patch to
OpenJDK 9 for a new webrev. Once that is posted, I can commit
the change.
Thanks,
--
Andrew :)
Senior Free Java Software Engineer
Red Hat, Inc. (http://www.redhat.com)
PGP Key: ed25519/35964222 (hkp://keys.gnupg.net)
Fingerprint = 5132 579D D154 0ED2 3E04 C5A0 CFDA 0F9B 3596 4222
PGP Key: rsa4096/248BDC07 (hkp://keys.gnupg.net)
Fingerprint = EC5A 1F5E C0AD 1D15 8F1F 8F91 3B96 A578 248B DC07
More information about the 2d-dev
mailing list