RFR (S) 8218755: [REDO] Symbol leak in prepend_host_package_name
David Holmes
david.holmes at oracle.com
Wed Feb 13 02:06:19 UTC 2019
On 13/02/2019 11:54 am, coleen.phillimore at oracle.com wrote:
>
>
> On 2/12/19 7:39 PM, David Holmes wrote:
>> Hi Coleen,
>>
>> On 13/02/2019 1:13 am, coleen.phillimore at oracle.com wrote:
>>> Summary: fix Symbol refcounting again, add comment and a test.
>>>
>>> open webrev at
>>> http://cr.openjdk.java.net/~coleenp/2019/8218755.01/webrev
>>> bug link https://bugs.openjdk.java.net/browse/JDK-8218755
>>>
>>> I hope this is better. Ran hs-tier1-6 and a new test!
>>
>> You got rid of the NULL check in update_class_name() but the one
>> remaining call-site has:
>>
>> // Update _class_name which could be null previously
>> // to reflect the name in the constant pool
>> update_class_name(class_name_in_cp);
>>
>> implying we still need it - even though we assert _class_name is not
>> NULL earlier (perhaps shouldn't be NULL but we need to be conservative?).
>>
>
> The comment is wrong. We initialize _class_name with :
>
> _class_name = name != NULL ? name : vmSymbols::unknown_class_name();
>
> So it's never null.
>
>> I'm inclined to just inline update_class_name along with the comments
>> - they can be shortened and are no worse than the block you added
>> elsewhere:
>
> I really dislike the exceptionally long functions that we have in
> Hotspot, especially parse_stream, and would rather have this call out to
> do this special refcount magic. I tried but I couldn't add more lines
> of code to that function.
>
>>
>> ! // The new class name is created with a refcount of one. When
>> installed into the InstanceKlass,
>> ! // it'll be two and when the ClassFileParser destructor runs,
>> it'll go back to one and get deleted
>> ! // when the class is unloaded.
>>
>
> That's in an already relatively short function.
>> ---
>>
>> test/hotspot/jtreg/runtime/defineAnonClass/AnonSymbolLeak.java
>>
>> 24 // This is copied from these DefineAnon
>>
>> delete "these"
>
> Fixed.
>
>>
>> Aside: singleoneInstanceField is an insanely long (and strange) name
>> for a local variable that gets written out three times!
>>
>> Aside 2: these tests should be migrated off sun.misc.Unsafe and use
>> jdk.internal.misc.Unsafe
>>
>> 81 try {
>> 82 p1cls.getMethod("test").invoke(null);
>> 83 } catch (Throwable ex) {
>> 84 ex.printStackTrace();
>> 85 fail = ex; // throw this to make test fail, since
>> subtest failed
>> 86 }
>>
>> This code can never fail. If the exception occurs we store it in the
>> local variable fail but don't do anything with it. ??
>
> More copy paste.
>
> I fixed the Unsafe code in the tests in that directory.
>
> http://cr.openjdk.java.net/~coleenp/2019/8218755.02/webrev/index.html
Thanks for the updates! Changes mostly look good. In AnonSymbolLeak
71 } catch (Throwable ex) {
72 ex.printStackTrace();
73 throw new RuntimeException("package injections should
not have failed");
74 }
given everything is delcared to throw Throwable you don't need to catch
anything here. If you really want to convert to a RuntimeException then
you don't need to printStackTrace but should pass ex as the cause of the
RuntimeException.
Similarly in TestAnonSymbolLeak:
57 t.printStackTrace();
58 throw new RuntimeException("Exception happened");
just:
throw new RuntimeException("Exception happened", t);
Thanks,
David
-----
> Thanks,
> Coleen
>>
>> Thanks,
>> David
>> ----
>>
>>> Thanks,
>>> Coleen
>
More information about the hotspot-runtime-dev
mailing list