Anyone can help reviewing this?

I addressed this by applying the double-checked-locking pattern for lazy initialization of instance fields.

Existing code already have most of the code structured for the pattern but misses the second check.

Bug: https://bugs.openjdk.java.net/browse/JDK-8238566

Webrev: http://cr.openjdk.java.net/~valeriep/8238566/webrev.00/

Thanks,

Valerie

On 2/5/2020 12:49 PM, Arthur Eubanks wrote:
Webrev: http://cr.openjdk.java.net/~aeubanks/8238566/webrev.00/
Bug: https://bugs.openjdk.java.net/browse/JDK-8238566

Found by TSAN, java.security.Provider$Service.supportsParameter() is racy. We haven't observed any actual bad behavior, but reasoning through it seems like bad behavior is possible.

http://hg.openjdk.java.net/jdk/jdk/file/62b5bfef8d61/src/java.base/share/classes/java/security/Provider.java#l1927

The synchronized block seems to not have any effect on correctness.

Example race:
T1 in hasKeyAttributes() writes true to hasKeyAttributes and fills out supportedFormats/supportedClasses.

T2 in hasKeyAttributes() racily reads hasKeyAttributes as true, but then in supportsKeyFormat() racily reads supportedFormats as null. It can then improperly return false from supportsParameter(). There is no synchronization between T1 and T2 because T2 never does any synchronization, so T2 can read what T1 writes in any order.

Fix is to make all of hasKeyAttributes() synchronized.

Reply via email to