Skip to content

ConcurrentModificationException #839

Closed
@JerryDevis

Description

@JerryDevis

Describe the bug

JavaLogFactory.java's readLoggerConfiguration function throws ConcurrentModificationException at this line

if (System.getProperties().keySet().stream().anyMatch(propKey ->
        "java.util.logging.config.class".equals(propKey) || "java.util.logging.config.file".equals(propKey)))

in a multi-threaded environment when another thread is concurrently setting system properties while ESAPI is iterating over system properties.

Specify what ESAPI version(s) you are experiencing this bug in

2.5.2.0

To Reproduce

public class Reproduce {
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            public void run() {
                while (true) {
                    long time = System.currentTimeMillis();
                    // Emulate another thread modifying system properties
                    System.setProperty(time + "", time + "");
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }); t.start();
        EsapiThread esapiThread = new EsapiThread();
        esapiThread.start();
    }

    private static class EsapiThread extends Thread {
        public void run() {
            // Emulate the code of JavaLogFactory in ESAPI
            System.getProperties().keySet().stream().anyMatch(a -> {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                return "dummy".equals(a);
            });
        }
    }
}

Expected behavior

Proposed change: copy the System.getProperties().keySet() to a new collection and iterating over the new collection instead of the original one to avoid thread safety problem.

Platform environment (please complete the following information)

  • JDK version: JDK8

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions