Ghiles OUAREZKI created TIKA-4393: ------------------------------------- Summary: Thread-safety issue in TikaToXMP.getConverterMap() Key: TIKA-4393 URL: https://issues.apache.org/jira/browse/TIKA-4393 Project: Tika Issue Type: Bug Components: tika-app Affects Versions: 3.1.0, 2.9.3 Environment: java 8, fedora 3.9, tika 2.9.3 Reporter: Ghiles OUAREZKI
h2. Description: We execute TikaToXmp conversion in a multithreaded environment where we call multiple conversion at the same time. According to new parser contribution guide, there is nothing about thread-safety. During our test, a thread-safety issue has been found in the getConverterMap() method of the TikaToXMP class in the tika-xmp module. We are currently using the 2.9.3 version. We checked in the latest version and we think the behavior is the same. h2. Problem: The method manipulates the static class variable converterMap, but it is not thread-safe. Since there is no synchronization mechanism, multiple threads can enter getConverterMap() at the same time and create different instances of converterMap, leading to potential race conditions. Current code: {code:java} private static Map<MediaType, Class<? extends ITikaToXMPConverter>> converterMap; private static Map<MediaType, Class<? extends ITikaToXMPConverter>> getConverterMap() { if (converterMap == null) { converterMap = new HashMap<>(); initialize(); } return converterMap; } {code} If multiple threads call getConverterMap() simultaneously when converterMap is still null, they might create multiple instances of converterMap, which can lead to unexpected behavior. h2. Potential solution: To ensure thread safety, we offer a simple patch : to synchronize getConverterMap() so that only one thread can initialize converterMap at a time. The fix consists of adding the *synchronized* keyword to the method: {code:java} private static synchronized Map<MediaType, Class<? extends ITikaToXMPConverter>> getConverterMap() { if (converterMap == null) { converterMap = new HashMap<>(); initialize(); } return converterMap; }{code} -- This message was sent by Atlassian Jira (v8.20.10#820010)