double-checked locking for thread safety in MIME utility initialization

This commit is contained in:
Balázs Szücs 2025-08-06 14:34:47 +02:00
parent b7815fff33
commit c5eee8cad9

View File

@ -1301,8 +1301,7 @@ public class EmlToPdf {
Object attachmentContent = getContent.invoke(part); Object attachmentContent = getContent.invoke(part);
byte[] attachmentData = null; byte[] attachmentData = null;
if (attachmentContent instanceof InputStream) { if (attachmentContent instanceof InputStream inputStream) {
InputStream inputStream = (InputStream) attachmentContent;
// Enhanced stream handling with EOF protection // Enhanced stream handling with EOF protection
try (InputStream stream = inputStream) { try (InputStream stream = inputStream) {
attachmentData = stream.readAllBytes(); attachmentData = stream.readAllBytes();
@ -1891,7 +1890,11 @@ public class EmlToPdf {
} }
if (!mimeUtilityChecked) { if (!mimeUtilityChecked) {
initializeMimeUtilityDecoding(); synchronized (EmlToPdf.class) {
if (!mimeUtilityChecked) {
initializeMimeUtilityDecoding();
}
}
} }
if (mimeUtilityDecodeTextMethod != null) { if (mimeUtilityDecodeTextMethod != null) {
@ -1904,11 +1907,7 @@ public class EmlToPdf {
return decodeMimeHeader(headerValue.trim()); return decodeMimeHeader(headerValue.trim());
} }
private static synchronized void initializeMimeUtilityDecoding() { private static void initializeMimeUtilityDecoding() {
if (mimeUtilityChecked) {
return; // Already initialized
}
try { try {
Class<?> mimeUtilityClass = Class.forName("jakarta.mail.internet.MimeUtility"); Class<?> mimeUtilityClass = Class.forName("jakarta.mail.internet.MimeUtility");
mimeUtilityDecodeTextMethod = mimeUtilityClass.getMethod("decodeText", String.class); mimeUtilityDecodeTextMethod = mimeUtilityClass.getMethod("decodeText", String.class);