From f952f8d2881b3394fb520d5a02c43c4c1e26a486 Mon Sep 17 00:00:00 2001 From: Babneet Singh Date: Wed, 5 Feb 2025 14:53:28 -0500 Subject: [PATCH] Add synchronization for Class.allPermissionsPD Synchronization has been added to ensure safe initialization and safe publication of Class.allPermissionsPD. This addresses the locking contention on Class.allPermissionsPD in Class.getProtectionDomain(). Fixes: #20351 Signed-off-by: Babneet Singh --- .../share/classes/java/lang/Class.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/jcl/src/java.base/share/classes/java/lang/Class.java b/jcl/src/java.base/share/classes/java/lang/Class.java index 78defe34934..8bfcd6a9c4f 100644 --- a/jcl/src/java.base/share/classes/java/lang/Class.java +++ b/jcl/src/java.base/share/classes/java/lang/Class.java @@ -160,12 +160,13 @@ public final class Class implements java.io.Serializable, GenericDeclaration, /*[ENDIF] JAVA_SPEC_VERSION >= 12 */ { private static final long serialVersionUID = 3206093459760846163L; - private static ProtectionDomain AllPermissionsPD; private static final int SYNTHETIC = 0x1000; private static final int ANNOTATION = 0x2000; private static final int ENUM = 0x4000; private static final int MEMBER_INVALID_TYPE = -1; + private static volatile ProtectionDomain allPermissionsPD; + /*[IF]*/ /** * It is important that these remain static final @@ -2484,16 +2485,24 @@ ProtectionDomain getProtectionDomainInternal() { if (result != null) { return result; } - if (AllPermissionsPD == null) { + if (allPermissionsPD == null) { allocateAllPermissionsPD(); } - return AllPermissionsPD; + return allPermissionsPD; } private void allocateAllPermissionsPD() { - Permissions collection = new Permissions(); - collection.add(SecurityConstants.ALL_PERMISSION); - AllPermissionsPD = new ProtectionDomain(null, collection); + /* Synchronization to ensure safe initialization and safe publication of + * allPermissionsPD. This addresses the locking contention on allPermissionsPD + * in getProtectionDomain(). + */ + synchronized(this) { + if (allPermissionsPD == null) { + Permissions collection = new Permissions(); + collection.add(SecurityConstants.ALL_PERMISSION); + allPermissionsPD = new ProtectionDomain(null, collection); + } + } } /**