JDK 10 RFR JDK-8171194: Exception "Duplicate field name&signature in class file" should report the name and signature of the field

Shafi Ahmad shafi.s.ahmad at oracle.com
Wed Feb 15 06:02:40 UTC 2017


Hi David,

Please find updated webrev at http://cr.openjdk.java.net/~shshahma/8171194/webrev.01/
Added overloaded method classfile_parse_error.

Regards,
Shafi

> -----Original Message-----
> From: David Holmes
> Sent: Wednesday, February 15, 2017 3:55 AM
> To: Shafi Ahmad <shafi.s.ahmad at oracle.com>; hotspot-
> dev at openjdk.java.net
> Subject: Re: JDK 10 RFR JDK-8171194: Exception "Duplicate field
> name&signature in class file" should report the name and signature of the
> field
> 
> Hi Shafi,
> 
> On 14/02/2017 11:20 PM, Shafi Ahmad wrote:
> > Hi David,
> >
> > Thanks for reviewing it.
> >
> > Initially I started with fixed size of local char array but later I changed my
> mind and make it dynamic.
> > Let me know if I have to make it local char array like.
> >
> > +         unsigned int siglength = sig->utf8_length();
> > +         unsigned int namelength = name->utf8_length();
> > +         unsigned int length = siglength + namelength + 64;
> > +         char *buff = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char,
> length);
> > +         jio_snprintf(buff, length,
> > +                     "Duplicate method name \"%s\" with signature \"%s\" in class
> file",
> > +                     name->as_C_string(), sig->as_klass_external_name());
> > +         classfile_parse_error("%s %s", buff, CHECK);
> >        }
> >
> > to
> >
> > +         char buff[fixedsize];  // say fixedsize is 512
> > +         jio_snprintf(buff, 512,
> > +                     "Duplicate method name \"%s\" with signature \"%s\" in class
> file",
> > +                     name->as_C_string(), sig->as_klass_external_name());
> > +         classfile_parse_error("%s %s", buff, CHECK);
> >        }
> 
> It could still be dynamic, you just need to use
> NEW_RESOURCE_ARRAY_IN_THREAD_RETURN_NULL and check for a NULL
> return, and fallback to not including the additional info. But the underlying
> Exceptions::fthrow uses a local buffer itself (1024 max), so you could just do
> the same as you propose above.
> 
> Though it is very annoying to have to allocate a buffer just to pass it through
> to classfile_parse_error which passes it through to Exceptions::fthrow which
> is a varargs method. So another possibility is to just add another overload of
> classfile_parse_error that takes in the two additional strings you want to
> print.
> 
> Thanks,
> David
> 
> > Regards,
> > Shafi
> >
> >> -----Original Message-----
> >> From: David Holmes
> >> Sent: Tuesday, February 14, 2017 6:34 PM
> >> To: Shafi Ahmad <shafi.s.ahmad at oracle.com>; hotspot-
> >> dev at openjdk.java.net
> >> Subject: Re: JDK 10 RFR JDK-8171194: Exception "Duplicate field
> >> name&signature in class file" should report the name and signature of
> >> the field
> >>
> >> Hi Shafi,
> >>
> >> I'm concerned about the use of NEW_RESOURCE_ARRAY_IN_THREAD. If
> it
> >> can't allocate it will abort the VM. That seems like a bad thing to happen.
> >>
> >> Thanks,
> >> David
> >>
> >> On 14/02/2017 7:19 PM, Shafi Ahmad wrote:
> >>> Summary: java.lang.ClassFormatError: Exception "Duplicate field
> >> name&signature in class file" should report the name and signature of
> >> the field.
> >>>
> >>> It's a very small change to single file.
> >>> In the current implementation name and signature of duplicate field
> >>> is
> >> missing in java.lang.ClassFormatError exception message.
> >>> Without a field name + signature it is hard to triggering the problem.
> >>>
> >>> Webrev link:
> http://cr.openjdk.java.net/~shshahma/8171194/webrev.00/
> >>> bug link: https://bugs.openjdk.java.net/browse/JDK-8171194
> >>>
> >>> Testing: jprt and jtreg test.
> >>>
> >>> I have verified my changes with the reproduces of
> >> https://bugs.openjdk.java.net/browse/JDK-8080842 on jdk8u60-b01 code
> >> base as I was not able to write reproducer of current issue.
> >>> With the fix I am getting below exception message.
> >>>
> >>> $ java CreateBadClassFile
> >>> .foreach() call: Exception in thread "main" java.lang.ClassFormatError:
> >> Duplicate field name "hasNext" with signature "Ljava.lang.Object;" in
> >> class file WidgetCollection$1
> >>> 	at java.lang.ClassLoader.defineClass1(Native Method)
> >>> 	at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
> >>> 	at
> >> java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
> >> 2)
> >>>                . . .
> >>>
> >>> Thanks,
> >>> Coleen
> >>>


More information about the hotspot-dev mailing list