Hi Max,

Do you want me to go though official contribution (I already have signed OCA 
for glassfish) or
someone from oracle team will take care about it?

Thanks,
  Tigran.

----- Original Message -----
> From: "Weijun Wang" <weijun.w...@oracle.com>
> To: "Tigran Mkrtchyan" <tigran.mkrtch...@desy.de>
> Cc: "security-dev" <security-dev@openjdk.java.net>
> Sent: Friday, April 24, 2020 3:29:02 PM
> Subject: Re: NPE is used in javax.security.auth.Subject for flowcontrol

> Hi Tigran,
> 
> I read "Collection.html#optional-restrictions" carefully, and yes you're
> correct. Sorry for my ignorance.
> 
> This method is called quite a lot. It might be worth an enhancement.
> 
> Thanks,
> Max
> 
>> On Apr 24, 2020, at 9:00 PM, Mkrtchyan, Tigran <tigran.mkrtch...@desy.de> 
>> wrote:
>> 
>> 
>> 
>> Here is the benchmark results:
>> 
>> Benchmark                         Mode  Cnt        Score       Error  Units
>> SubjectBenchmark.jdkSubject      thrpt   20   473086.025 ±  7661.215  ops/s
>> SubjectBenchmark.patchedSubject  thrpt   20  2529016.530 ± 50982.465  ops/s
>> 
>> On a one hand, patched version has 5x higher throughput. However, on an other
>> hand
>> the throughput of the original code is sufficient for any real application. 
>> The
>> benchmark code is attached.
>> 
>> Sorry for the noise. Should have done benchmarks before trying to optimize 
>> it.
>> 
>> Tigran.
>> 
>> ----- Original Message -----
>>> From: "Tigran Mkrtchyan" <tigran.mkrtch...@desy.de>
>>> To: "Weijun Wang" <weijun.w...@oracle.com>
>>> Cc: "security-dev" <security-dev@openjdk.java.net>
>>> Sent: Friday, April 24, 2020 12:50:03 PM
>>> Subject: Re: NPE is used in javax.security.auth.Subject for flowcontrol
>> 
>>> I read it differently:
>>> 
>>>   Attempting to query the presence of an ineligible element may throw an
>>>   exception, or it may simply return false; some implementations
>>>   will exhibit the former  behavior and some will exhibit the latter.
>>> 
>>> Implementation might thrown an exception or return false, but sill don't 
>>> allow
>>> null values.
>>> 
>>>  ... would not result in the insertion of an ineligible element into the
>>>  collection may throw an exception or it may
>>>  succeed, at the option of the implementation.
>>> 
>>> 
>>> For example, TreeSet throws NPE depending on Comparator.
>>> 
>>> Well, I understand, this is a corner case that possibly  not worth to 
>>> optimize.
>>> Let me write
>>> a benchmark to see how much difference it makes.
>>> 
>>> Tigran.
>>> 
>>> 
>>> ----- Original Message -----
>>>> From: "Weijun Wang" <weijun.w...@oracle.com>
>>>> To: "Tigran Mkrtchyan" <tigran.mkrtch...@desy.de>
>>>> Cc: "security-dev" <security-dev@openjdk.java.net>
>>>> Sent: Friday, April 24, 2020 12:23:48 PM
>>>> Subject: Re: NPE is used in javax.security.auth.Subject for flowcontrol
>>> 
>>>> My understanding is by optional you have 2 options while designing the Set:
>>>> 
>>>> 1. Allow null
>>>> 
>>>> 2. Not allow null
>>>> 
>>>> Now that SecureSet has chosen the 2nd way, it is now in the "this set does 
>>>> not
>>>> permit null elements" category and therefore it should "@throws
>>>> NullPointerException if the specified element is null".
>>>> 
>>>> --Max
>>>> 
>>>>> On Apr 24, 2020, at 6:13 PM, Mkrtchyan, Tigran <tigran.mkrtch...@desy.de> 
>>>>> wrote:
>>>>> 
>>>>> Hi Max,
>>>>> 
>>>>> that's right, but java doc as well mentions that this exception is 
>>>>> *optional*,
>>>>> and has a corresponding note:
>>>>> 
>>>>> Some collection implementations have restrictions on the elements that 
>>>>> they may
>>>>> contain. For example, some implementations prohibit null elements, and 
>>>>> some
>>>>> have restrictions on the types of their elements. Attempting to add an
>>>>> ineligible element throws an unchecked exception, typically
>>>>> NullPointerException or ClassCastException. Attempting to query the 
>>>>> presence of
>>>>> an ineligible element may throw an exception, or it may simply return 
>>>>> false;
>>>>> some implementations will exhibit the former behavior and some will 
>>>>> exhibit the
>>>>> latter. More generally, attempting an operation on an ineligible element 
>>>>> whose
>>>>> completion would not result in the insertion of an ineligible element 
>>>>> into the
>>>>> collection may throw an exception or it may succeed, at the option of the
>>>>> implementation. Such exceptions are marked as "optional" in the 
>>>>> specification
>>>>> for this interface.
>>>>> 
>>>>> Thus, returning *false* is justified and spec compliant.
>>>>> 
>>>>> 
>>>>> Thanks,
>>>>>  Tigran.
>>>>> 
>>>>> 
>>>>> ----- Original Message -----
>>>>>> From: "Weijun Wang" <weijun.w...@oracle.com>
>>>>>> To: "Tigran Mkrtchyan" <tigran.mkrtch...@desy.de>
>>>>>> Cc: "security-dev" <security-dev@openjdk.java.net>
>>>>>> Sent: Friday, April 24, 2020 11:42:41 AM
>>>>>> Subject: Re: NPE is used in javax.security.auth.Subject for flowcontrol
>>>>> 
>>>>>> Hi Tigran,
>>>>>> 
>>>>>> In java.util.Set, we have:
>>>>>> 
>>>>>>   * @throws NullPointerException if the specified element is null and 
>>>>>> this
>>>>>>   *         set does not permit null elements
>>>>>>   * (<a href="Collection.html#optional-restrictions">optional</a>)
>>>>>>   */
>>>>>>  boolean contains(Object o);
>>>>>> 
>>>>>> As an implementation, SecureSet must follow the spec to throw an NPE. If 
>>>>>> it
>>>>>> returns null, some unexpected thing might happen when the contains() 
>>>>>> method is
>>>>>> called somewhere else.
>>>>>> 
>>>>>> Thanks,
>>>>>> Max
>>>>>> 
>>>>>>> On Apr 24, 2020, at 4:21 PM, Mkrtchyan, Tigran 
>>>>>>> <tigran.mkrtch...@desy.de> wrote:
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> Dear Java-SE security developers,
>>>>>>> 
>>>>>>> 
>>>>>>> Imagine a following code:
>>>>>>> 
>>>>>>> ```
>>>>>>> Subject s1 = ... ;
>>>>>>> 
>>>>>>> Subject s2 = ... ;
>>>>>>> 
>>>>>>> 
>>>>>>> s2.getPrincipals().addAll(s1.getPrincipals());
>>>>>>> 
>>>>>>> ```
>>>>>>> 
>>>>>>> The Subject's SecureSet.addAll checks that provided Set doesn't 
>>>>>>> contains 'null'
>>>>>>> values
>>>>>>> by calling collectionNullClean, which calls SecureSet#contains:
>>>>>>> 
>>>>>>> ```
>>>>>>> try {
>>>>>>>  hasNullElements = coll.contains(null);
>>>>>>> } catch (NullPointerException npe) {
>>>>>>> 
>>>>>>> ```
>>>>>>> 
>>>>>>> The SecureSet#contains itself checks for 'null' values, the  NPE is 
>>>>>>> always
>>>>>>> generated.
>>>>>>> 
>>>>>>> This as introduced by commit e680ab7f208e
>>>>>>> 
>>>>>>> https://hg.openjdk.java.net/jdk/jdk/diff/e680ab7f208e/jdk/src/share/classes/javax/security/auth/Subject.java
>>>>>>> 
>>>>>>> 
>>>>>>> As SecureSet doesn't allow null values, it will be much simpler to 
>>>>>>> return false
>>>>>>> right away:
>>>>>>> 
>>>>>>> ```
>>>>>>> 
>>>>>>>      public boolean contains(Object o) {
>>>>>>>        if (o == null) {
>>>>>>>             // null values rejected  by add
>>>>>>>             return false;
>>>>>>>        }
>>>>>>> 
>>>>>>>        ...
>>>>>>>      }
>>>>>>> 
>>>>>>> ```
>>>>>>> 
>>>>>>> 
>>>>>>> Thanks in advance,
>>>>>>> Tigran.
> > <SubjectBenchmark.java>

Reply via email to