From 7767717d179871222fdad7a295b8262fb632d1f8 Mon Sep 17 00:00:00 2001 From: Steven Hawkins Date: Fri, 22 Aug 2025 12:01:28 -0400 Subject: [PATCH] fix: using volatile for double checked locking closes: #40630 Signed-off-by: Steve Hawkins --- .../credential/WebAuthnCredentialProviderFactory.java | 2 +- ...WebAuthnPasswordlessCredentialProviderFactory.java | 2 +- .../keycloak/services/resources/WelcomeResource.java | 11 ++++------- .../freemarker/DefaultFreeMarkerProviderFactory.java | 2 +- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/services/src/main/java/org/keycloak/credential/WebAuthnCredentialProviderFactory.java b/services/src/main/java/org/keycloak/credential/WebAuthnCredentialProviderFactory.java index d8e4224d26c..6cf9029e50a 100644 --- a/services/src/main/java/org/keycloak/credential/WebAuthnCredentialProviderFactory.java +++ b/services/src/main/java/org/keycloak/credential/WebAuthnCredentialProviderFactory.java @@ -26,7 +26,7 @@ public class WebAuthnCredentialProviderFactory implements CredentialProviderFact public static final String PROVIDER_ID = "keycloak-webauthn"; - private ObjectConverter converter; + private volatile ObjectConverter converter; @Override public CredentialProvider create(KeycloakSession session) { diff --git a/services/src/main/java/org/keycloak/credential/WebAuthnPasswordlessCredentialProviderFactory.java b/services/src/main/java/org/keycloak/credential/WebAuthnPasswordlessCredentialProviderFactory.java index 77433239d5f..47dd28881e1 100644 --- a/services/src/main/java/org/keycloak/credential/WebAuthnPasswordlessCredentialProviderFactory.java +++ b/services/src/main/java/org/keycloak/credential/WebAuthnPasswordlessCredentialProviderFactory.java @@ -31,7 +31,7 @@ public class WebAuthnPasswordlessCredentialProviderFactory implements Credential public static final String PROVIDER_ID = "keycloak-webauthn-passwordless"; - private ObjectConverter converter; + private volatile ObjectConverter converter; @Override public CredentialProvider create(KeycloakSession session) { diff --git a/services/src/main/java/org/keycloak/services/resources/WelcomeResource.java b/services/src/main/java/org/keycloak/services/resources/WelcomeResource.java index 1cf1d128834..5934cfaecc4 100755 --- a/services/src/main/java/org/keycloak/services/resources/WelcomeResource.java +++ b/services/src/main/java/org/keycloak/services/resources/WelcomeResource.java @@ -61,7 +61,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Properties; -import java.util.concurrent.atomic.AtomicBoolean; /** * @author Stian Thorgersen @@ -72,9 +71,7 @@ public class WelcomeResource { protected static final Logger logger = Logger.getLogger(WelcomeResource.class); - private static final String KEYCLOAK_STATE_CHECKER = "WELCOME_STATE_CHECKER"; - - private AtomicBoolean shouldBootstrap; + private volatile Boolean shouldBootstrap; @Context KeycloakSession session; @@ -144,7 +141,7 @@ public class WelcomeResource { expireCsrfCookie(); - shouldBootstrap.set(false); + shouldBootstrap = false; ServicesLogger.LOGGER.createdTemporaryAdminUser(username); return createWelcomePage("User created", null); } @@ -262,11 +259,11 @@ public class WelcomeResource { if (shouldBootstrap == null) { synchronized (this) { if (shouldBootstrap == null) { - shouldBootstrap = new AtomicBoolean(new ApplianceBootstrap(session).isNoMasterUser()); + shouldBootstrap = new ApplianceBootstrap(session).isNoMasterUser(); } } } - return shouldBootstrap.get(); + return shouldBootstrap; } public static boolean isLocal(KeycloakSession session) { diff --git a/services/src/main/java/org/keycloak/theme/freemarker/DefaultFreeMarkerProviderFactory.java b/services/src/main/java/org/keycloak/theme/freemarker/DefaultFreeMarkerProviderFactory.java index 51a54e82a1d..68d691d47bc 100644 --- a/services/src/main/java/org/keycloak/theme/freemarker/DefaultFreeMarkerProviderFactory.java +++ b/services/src/main/java/org/keycloak/theme/freemarker/DefaultFreeMarkerProviderFactory.java @@ -10,7 +10,7 @@ import java.util.concurrent.ConcurrentHashMap; public class DefaultFreeMarkerProviderFactory implements FreeMarkerProviderFactory { - private DefaultFreeMarkerProvider provider; + private volatile DefaultFreeMarkerProvider provider; private ConcurrentHashMap cache; private KeycloakSanitizerMethod kcSanitizeMethod;