Skip to content

Commit 9616555

Browse files
committed
Fixes #2500
1 parent 39c318b commit 9616555

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereRequestImpl.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -395,13 +395,15 @@ public String getHeader(String s, boolean checkCase) {
395395
public String getParameter(String s) {
396396
String name = isNotNoOps() ? b.request.getParameter(s) : null;
397397
if (name == null) {
398-
if (b.queryStrings.get(s) != null) {
399-
return b.queryStrings.get(s)[0];
398+
String[] values = b.queryStrings.get(s);
399+
if (values != null) {
400+
return values[0];
400401
}
401402
}
402403
return name;
403404
}
404405

406+
405407
@Override
406408
public Map<String, String[]> getParameterMap() {
407409
if (!queryComputed) {

modules/cpr/src/test/java/org/atmosphere/cpr/AtmosphereRequestTest.java

+40
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
import java.util.Enumeration;
3232
import java.util.HashMap;
3333
import java.util.Map;
34+
import java.util.concurrent.ExecutorService;
35+
import java.util.concurrent.Executors;
36+
import java.util.concurrent.TimeUnit;
3437
import java.util.concurrent.atomic.AtomicReference;
3538

3639
import static org.mockito.Mockito.mock;
@@ -40,6 +43,7 @@
4043
import static org.testng.Assert.assertNotNull;
4144
import static org.testng.Assert.assertNull;
4245
import static org.testng.Assert.assertTrue;
46+
import static org.testng.AssertJUnit.fail;
4347

4448
public class AtmosphereRequestTest {
4549
private AtmosphereFramework framework;
@@ -351,5 +355,41 @@ public void testWrapMethodWithNullAttributeValue() throws IOException, ServletEx
351355
assertNull(wrappedRequest.getAttribute("org.eclipse.jetty.multipartConfig"), "Attribute value should be null");
352356
}
353357

358+
public class AtmosphereRequestImplTest {
359+
360+
@Test
361+
public void testGetParameterRaceCondition() throws InterruptedException {
362+
final Map<String, String[]> queryStrings = Collections.synchronizedMap(new HashMap<>());
363+
queryStrings.put("testParam", new String[]{"testValue"});
364+
365+
AtmosphereRequestImpl.Builder builder = new AtmosphereRequestImpl.Builder();
366+
builder.queryStrings(queryStrings);
367+
368+
final AtmosphereRequest request = builder.build();
369+
370+
Runnable addAndRemove = () -> {
371+
queryStrings.put("testParam", new String[]{"testValue"});
372+
queryStrings.remove("testParam");
373+
};
374+
375+
Runnable getParameter = () -> {
376+
try {
377+
request.getParameter("testParam");
378+
} catch (NullPointerException e) {
379+
fail("NullPointerException occurred");
380+
}
381+
};
382+
383+
ExecutorService executor = Executors.newFixedThreadPool(2);
384+
for (int i = 0; i < 10000; i++) {
385+
executor.execute(addAndRemove);
386+
executor.execute(getParameter);
387+
}
388+
389+
executor.shutdown();
390+
executor.awaitTermination(1, TimeUnit.MINUTES);
391+
}
392+
}
393+
354394

355395
}

0 commit comments

Comments
 (0)