NPE is used in javax.security.auth.Subject for flowcontrol

Weijun Wang weijun.wang at oracle.com
Fri Apr 24 13:29:02 UTC 2020


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.mkrtchyan at 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.mkrtchyan at desy.de>
>> To: "Weijun Wang" <weijun.wang at oracle.com>
>> Cc: "security-dev" <security-dev at 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.wang at oracle.com>
>>> To: "Tigran Mkrtchyan" <tigran.mkrtchyan at desy.de>
>>> Cc: "security-dev" <security-dev at 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.mkrtchyan at 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.wang at oracle.com>
>>>>> To: "Tigran Mkrtchyan" <tigran.mkrtchyan at desy.de>
>>>>> Cc: "security-dev" <security-dev at 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.mkrtchyan at 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>




More information about the security-dev mailing list