lsteamclient missing SteamNetworkingSocketsSerialized 004/005Follow-up to the SendP2PRendezvous fencepost abort. Interface version strings
extracted with strings -a from the shipped binaries on a stock install.
Native Linux Steam client (identical in all five copies:
ubuntu12_32/, linux32/, linux64/, steamrt32/, steamrt64/steamclient.so),
client buildid 1784778118:
SteamNetworkingSocketsSerialized001
SteamNetworkingSocketsSerialized002
SteamNetworkingSocketsSerialized003
SteamNetworkingSocketsSerialized004
SteamNetworkingSocketsSerialized005
Proton's lsteamclient.dll (files/lib/wine/x86_64-windows/lsteamclient.dll)
— all three builds tested:
SteamNetworkingSocketsSerialized001
SteamNetworkingSocketsSerialized002
SteamNetworkingSocketsSerialized003
| Proton build | md5 of lsteamclient.dll | max Serialized version |
|---|---|---|
Proton Experimental experimental-11.0-20260713 |
f13c727c90e10600231d2adc057a4c77 |
003 |
| GE-Proton11-3 (2026-07-25) | b9a83a935db63ca9419ccaa2d663fdd7 |
003 |
| Proton 9.0-4f | — | 003 |
Deadlock's own game/bin/win64/steamnetworkingsockets.dll references:
SteamNetworkingSocketsSerialized003
SteamNetworkingSocketsSerialized005
The game requests SteamNetworkingSocketsSerialized005, which the native client
implements. lsteamclient — the Wine-side bridge that marshals these calls —
implements nothing above 003. The resulting SendP2PRendezvous payload does
not match what the client's 005 deserializer expects, and the client aborts on
the fencepost check rather than rejecting the call.
This would explain why the failure is identical across three independently built
Proton versions, including a GE build released one day before testing: none of
them has been regenerated against the SDK that introduced 004/005.
If that reading is right, the fix is regenerating lsteamclient for
SteamNetworkingSocketsSerialized 004 and 005, and no user-side Proton choice
can work around it.
Independently of the Proton fix: a malformed serialized call from a game process
causes the Steam client itself to std::terminate and core-dump, which
takes down the user's whole Steam session and leaves the game with every thread
blocked on IPC to a dead peer. A rejected call would seem preferable to an
aborted client.
ge-proton11-3x2 2026-07proton 9.0-4fx2 2026-07proton experimentalx2 2026-07MANGOHUD=1`x1 2026-07lsteamclient.dllx2 2026-07steamnetworkingsockets.dllx1 2026-07
Steam client aborts on
IClientNetworkingSocketsSerialized::SendP2PRendezvousunder Proton (Deadlock, appid 1422450)Summary
Joining a friend's lobby in Deadlock (appid 1422450) under Proton reliably
aborts the native Linux Steam client with a fencepost deserialize mismatch.
The game itself does not crash — it is left with every thread blocked on IPC to
the now-dead client, so it hangs indefinitely and never registers as "Playing".
Reproduced 6 times in ~90 minutes (12 assert lines) on 2026-07-26.
Reproduction
Once a rendezvous is queued, the assert also fires ~20 s after game launch,
before any lobby interaction, presumably as the pending rendezvous is retried.
What the game process looks like after the abort
All threads parked, nothing running — consistent with blocking on a dead peer:
futex_do_wait, 16 inntsync_schedule, 2 inpoll_schedule_timeoutTested and ruled out
-dev/MANGOHUD=1from launch optionsGE-Proton ships a distinct
lsteamclientbuild, so this is not one shimtested twice:
files/lib/wine/x86_64-windows/lsteamclient.dll— md5b9a83a935db63ca9419ccaa2d663fdd7, 5.6 MBfiles/lib/wine/x86_64-windows/lsteamclient.dll— md5f13c727c90e10600231d2adc057a4c77, 5.5 MBTwo independently built shims failing against the same client deserializer
suggests both are generated from a Steamworks SDK older than the interface
version the current client expects.
Environment
ntsyncmodule loaded)experimental-11.0-20260713(default branch, no betakey)Crash IDs (auto-uploaded)
Directly on the
SendP2PRendezvousassert:Same session, downstream
pipes.cpp (900) : fatal stalled cross-thread pipeaborts that follow once the client is gone:
I used AI to help write this, it knows more than i do.