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)

Reply via email to