Race condition in DataFeedHandler::sendDataFeedUpdate #182

Closed
opened 2026-04-05 18:03:13 +02:00 by MrUnknownDE · 0 comments
Owner

Originally created by @ImSapphire on 11/7/2025

When the GUI starts up and sends the StartDataFeed packet, sendDataFeedUpdate might run while onStartDataFeed is setting up the ConnectionContext's dataFeedConfigList and dataFeedTimers lists, which may result in a server crash.

19:10:11 [INFO] [WebSocketAPI] New connection from: 0:0:0:0:0:0:0:1
19:10:11 [SEVERE] Exception in thread "VRServer" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
19:10:11 [SEVERE]         at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
19:10:11 [SEVERE]         at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
19:10:11 [SEVERE]         at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
19:10:11 [SEVERE]         at java.base/java.util.Objects.checkIndex(Objects.java:361)
19:10:11 [SEVERE]         at java.base/java.util.ArrayList.get(ArrayList.java:427)
19:10:11 [SEVERE]         at dev.slimevr.protocol.datafeed.DataFeedHandler.lambda$sendDataFeedUpdate$0(DataFeedHandler.java:129)
19:10:11 [SEVERE]         at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
19:10:11 [SEVERE]         at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
19:10:11 [SEVERE]         at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
19:10:11 [SEVERE]         at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
19:10:11 [SEVERE]         at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
19:10:11 [SEVERE]         at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
19:10:11 [SEVERE]         at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
19:10:11 [SEVERE]         at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
19:10:11 [SEVERE]         at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
19:10:11 [SEVERE]         at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
19:10:11 [SEVERE]         at dev.slimevr.protocol.datafeed.DataFeedHandler.lambda$sendDataFeedUpdate$1(DataFeedHandler.java:121)
19:10:11 [SEVERE]         at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
19:10:11 [SEVERE]         at dev.slimevr.protocol.datafeed.DataFeedHandler.sendDataFeedUpdate(DataFeedHandler.java:121)
19:10:11 [SEVERE]         at dev.slimevr.VRServer.run(VRServer.kt:233)
19:22:23 [INFO] [WebSocketAPI] New connection from: 0:0:0:0:0:0:0:1
19:22:24 [INFO] [WebSocketAPI] Disconnected: 0:0:0:0:0:0:0:1, (1006) Connection reset by peer. Remote: false
19:22:25 [INFO] [WebSocketAPI] New connection from: 0:0:0:0:0:0:0:1
19:22:25 [INFO] [WebSocketAPI] Disconnected: 0:0:0:0:0:0:0:1, (1006) Connection reset. Remote: false
19:22:26 [INFO] [WebSocketAPI] New connection from: 0:0:0:0:0:0:0:1
19:22:26 [INFO] [WebSocketAPI] Disconnected: 0:0:0:0:0:0:0:1, (1006) . Remote: true
19:22:27 [INFO] [WebSocketAPI] New connection from: 0:0:0:0:0:0:0:1
19:22:27 [SEVERE] Exception in thread "VRServer" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
19:22:27 [SEVERE]         at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
19:22:27 [SEVERE]         at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
19:22:27 [SEVERE]         at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
19:22:27 [SEVERE]         at java.base/java.util.Objects.checkIndex(Objects.java:361)
19:22:27 [SEVERE]         at java.base/java.util.ArrayList.get(ArrayList.java:427)
19:22:27 [SEVERE]         at dev.slimevr.protocol.datafeed.DataFeedHandler.lambda$sendDataFeedUpdate$0(DataFeedHandler.java:129)
*Originally created by @ImSapphire on 11/7/2025* When the GUI starts up and sends the `StartDataFeed` packet, `sendDataFeedUpdate` might run while `onStartDataFeed` is setting up the `ConnectionContext`'s `dataFeedConfigList` and `dataFeedTimers` lists, which may result in a server crash. ``` 19:10:11 [INFO] [WebSocketAPI] New connection from: 0:0:0:0:0:0:0:1 19:10:11 [SEVERE] Exception in thread "VRServer" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 19:10:11 [SEVERE] at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) 19:10:11 [SEVERE] at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) 19:10:11 [SEVERE] at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266) 19:10:11 [SEVERE] at java.base/java.util.Objects.checkIndex(Objects.java:361) 19:10:11 [SEVERE] at java.base/java.util.ArrayList.get(ArrayList.java:427) 19:10:11 [SEVERE] at dev.slimevr.protocol.datafeed.DataFeedHandler.lambda$sendDataFeedUpdate$0(DataFeedHandler.java:129) 19:10:11 [SEVERE] at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) 19:10:11 [SEVERE] at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) 19:10:11 [SEVERE] at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) 19:10:11 [SEVERE] at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) 19:10:11 [SEVERE] at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) 19:10:11 [SEVERE] at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) 19:10:11 [SEVERE] at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) 19:10:11 [SEVERE] at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) 19:10:11 [SEVERE] at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 19:10:11 [SEVERE] at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) 19:10:11 [SEVERE] at dev.slimevr.protocol.datafeed.DataFeedHandler.lambda$sendDataFeedUpdate$1(DataFeedHandler.java:121) 19:10:11 [SEVERE] at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) 19:10:11 [SEVERE] at dev.slimevr.protocol.datafeed.DataFeedHandler.sendDataFeedUpdate(DataFeedHandler.java:121) 19:10:11 [SEVERE] at dev.slimevr.VRServer.run(VRServer.kt:233) ``` ``` 19:22:23 [INFO] [WebSocketAPI] New connection from: 0:0:0:0:0:0:0:1 19:22:24 [INFO] [WebSocketAPI] Disconnected: 0:0:0:0:0:0:0:1, (1006) Connection reset by peer. Remote: false 19:22:25 [INFO] [WebSocketAPI] New connection from: 0:0:0:0:0:0:0:1 19:22:25 [INFO] [WebSocketAPI] Disconnected: 0:0:0:0:0:0:0:1, (1006) Connection reset. Remote: false 19:22:26 [INFO] [WebSocketAPI] New connection from: 0:0:0:0:0:0:0:1 19:22:26 [INFO] [WebSocketAPI] Disconnected: 0:0:0:0:0:0:0:1, (1006) . Remote: true 19:22:27 [INFO] [WebSocketAPI] New connection from: 0:0:0:0:0:0:0:1 19:22:27 [SEVERE] Exception in thread "VRServer" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 19:22:27 [SEVERE] at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) 19:22:27 [SEVERE] at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) 19:22:27 [SEVERE] at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266) 19:22:27 [SEVERE] at java.base/java.util.Objects.checkIndex(Objects.java:361) 19:22:27 [SEVERE] at java.base/java.util.ArrayList.get(ArrayList.java:427) 19:22:27 [SEVERE] at dev.slimevr.protocol.datafeed.DataFeedHandler.lambda$sendDataFeedUpdate$0(DataFeedHandler.java:129) ```
MrUnknownDE added the Type: BugArea: ServerArea: Application ProtocolPriority: HighType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolPriority: HighPriority: HighPriority: HighPriority: HighPriority: HighPriority: HighPriority: HighPriority: HighPriority: High labels 2026-04-05 18:03:22 +02:00
Sign in to join this conversation.
No Label Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Priority: High Priority: High Priority: High Priority: High Priority: High Priority: High Priority: High Priority: High Priority: High Priority: High Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github/SlimeVR-Server#182