Skip to content

Commit 7e52736

Browse files
authored
Force init of Unbox in log4j (#92377) (#92398)
* Force init of Unbox in log4j Some libaries have static initializers that require security manager permissions. When this initialization occurs during normal operation, it can cause security manager exceptions depending on where a logging call is made. This commit adds a place for static initialization of log4j utility classes to be run, and specifically adds the Unbox class which wants to read env vars. closes #91964
1 parent 0725a53 commit 7e52736

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

docs/changelog/92377.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 92377
2+
summary: Force init of Unbox in log4j
3+
area: Infra/Core
4+
type: bug
5+
issues:
6+
- 91964

server/src/main/java/org/elasticsearch/common/logging/LogConfigurator.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.logging.log4j.status.StatusData;
3131
import org.apache.logging.log4j.status.StatusListener;
3232
import org.apache.logging.log4j.status.StatusLogger;
33+
import org.apache.logging.log4j.util.Unbox;
3334
import org.elasticsearch.cluster.ClusterName;
3435
import org.elasticsearch.common.logging.internal.LoggerFactoryImpl;
3536
import org.elasticsearch.common.settings.Settings;
@@ -41,6 +42,7 @@
4142
import java.io.IOException;
4243
import java.io.InputStream;
4344
import java.io.PrintStream;
45+
import java.lang.invoke.MethodHandles;
4446
import java.nio.charset.StandardCharsets;
4547
import java.nio.file.FileVisitOption;
4648
import java.nio.file.FileVisitResult;
@@ -122,6 +124,7 @@ public static void configure(final Environment environment, boolean useConsole)
122124
}
123125
configureESLogging();
124126
configure(environment.settings(), environment.configFile(), environment.logsFile(), useConsole);
127+
initializeStatics();
125128
}
126129

127130
public static void configureESLogging() {
@@ -144,6 +147,17 @@ public static void setNodeName(String nodeName) {
144147
NodeNamePatternConverter.setNodeName(nodeName);
145148
}
146149

150+
// Some classes within log4j have static initializers that require security manager permissions.
151+
// Here we aggressively initialize those classes during logging configuration so that
152+
// actual logging calls at runtime do not trigger that initialization.
153+
private static void initializeStatics() {
154+
try {
155+
MethodHandles.publicLookup().ensureInitialized(Unbox.class);
156+
} catch (IllegalAccessException impossible) {
157+
throw new AssertionError(impossible);
158+
}
159+
}
160+
147161
private static void checkErrorListener() {
148162
assert errorListenerIsRegistered() : "expected error listener to be registered";
149163
if (error.get()) {

0 commit comments

Comments
 (0)