Skip to content

Commit 326cc38

Browse files
authored
The set returned by selector.selectedKeys() is not thread-safe; lock it before we iterate/remove keys from it (#10564)
The set returned by selector.selectedKeys() is not thread-safe; lock it before we iterate/remove keys from it Merge branch 'master' into mcculls/tunneling-socket-thread-safety Co-authored-by: stuart.mcculloch <stuart.mcculloch@datadoghq.com>
1 parent 6d44cf9 commit 326cc38

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

utils/socket-utils/src/main/java17/datadog/common/socket/TunnelingJdkSocket.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -238,19 +238,21 @@ public int read(byte[] b, int off, int len) throws IOException {
238238
}
239239

240240
Set<SelectionKey> selectedKeys = selector.selectedKeys();
241-
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
242-
while (keyIterator.hasNext()) {
243-
SelectionKey key = keyIterator.next();
244-
keyIterator.remove();
245-
if (key.isReadable()) {
246-
int r = unixSocketChannel.read(buffer);
247-
if (r == -1) {
248-
return -1;
241+
synchronized (selectedKeys) {
242+
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
243+
while (keyIterator.hasNext()) {
244+
SelectionKey key = keyIterator.next();
245+
keyIterator.remove();
246+
if (key.isReadable()) {
247+
int r = unixSocketChannel.read(buffer);
248+
if (r == -1) {
249+
return -1;
250+
}
251+
buffer.flip();
252+
len = Math.min(r, len);
253+
buffer.get(b, off, len);
254+
return len;
249255
}
250-
buffer.flip();
251-
len = Math.min(r, len);
252-
buffer.get(b, off, len);
253-
return len;
254256
}
255257
}
256258
return 0;

0 commit comments

Comments
 (0)