protonscr

vrserver segfaults (null deref in driver_vrlink.so+0xc9950) after vrcompositor fails with CreateDriverDirectModeResolveTextures (Steam Frame)

steamvropen
ValveSoftware/SteamVR-for-Linux#991 · opened 2026-10-05 by zeeboguy · updated 2026-10-05 · 0 comments · github
Zzeeboguy 2026-10-05 github

Describe the bug

With a Steam Frame over VRLink, starting SteamVR goes wrong in the same way each time. The first vrcompositor exits silently about 15 ms after "Startup Complete" (no core dump, no breakpad dump, no NVIDIA Xid). When a game is launched into that state, the replacement compositor fails with VRInitError_Compositor_CreateDriverDirectModeResolveTextures. vrserver then segfaults on a null pointer dereference in driver_vrlink.so+0xc9950, on its vrcomp thread.

This happened twice on SteamVR 2.17.10 with an identical stack and fault address. Relaunching the game right afterwards worked both times.

Steps to reproduce

  1. Start SteamVR while the Frame is still showing as Disconnected VRLink Headset (vrlink activates the headset and controllers about 0.7s later).
  2. vrcompositor starts, creates its 3240x3240 swap texture sets, logs Startup Complete, and disconnects about 15 ms later without logging an error.
  3. vrserver logs 12x Failed to unref VRCompositor resource 0x{2..d}00xxxxxx.
  4. About 30s later, launch a game (Half-Life: Alyx in both cases). vrserver starts a new vrcompositor.
  5. The new compositor fails, and vrserver segfaults.

Timeline (2026-10-04 22:07–22:08, SteamVR 2.17.10)

22:07:36.433  vrserver   Driver 'vrlink' started activation of tracked device with serial number 'Disconnected VRLink Headset'
22:07:37.134  vrserver   vrlink activates headset + 2 controllers
22:07:37.937  vrcompositor  Creating systemlayer textures (w=3240,h=3240)
22:07:38.008  vrcompositor  Startup Complete (0.368557 seconds)
22:07:38.024  vrserver   Process 2862433: vrcompositor disconnected        <-- no error logged by the compositor
22:07:38.025  vrserver   Failed to unref VRCompositor resource 0x7002bad61   (x12, 0x2..0xd)
22:08:08.107  vrserver   New Connect message from .../Half-Life Alyx/game/bin/linuxsteamrt64/hlvr (VRApplication_Scene)
22:08:08.773  vrcompositor  Creating systemlayer textures (w=3240,h=3240)
22:08:08.821  vrcompositor  Failed to create cursor overlay (x3)
22:08:08.822  vrcompositor  Failed to initialize compositor post-ipc.
22:08:08.822  vrcompositor  Failed to start compositor: VRInitError_Compositor_CreateDriverDirectModeResolveTextures
22:08:08.923  vrserver   Process 2863287: vrcompositor disconnected
22:08:09      kernel     vrcomp[2863362]: segfault at 0 ip 000075f2d6cc9950 ... in driver_vrlink.so[c8950,75f2d6c76000+19a000]

The 00:17–00:18 occurrence follows the same sequence:

  • First compositor: Startup Complete at 00:17:21.236, disconnected at 00:17:21.249.
  • hlvr connected at 00:18:08.
  • CreateDriverDirectModeResolveTextures at 00:18:09.002.
  • vrserver segfault at 00:18:09.

Before that run, the compositor had failed to allocate the 3240x3240 shared image while supersampling was set to 1.5x. Forcing the render scale to 1.0 did not change the outcome, so the resolution itself does not seem to be the cause.

Crash details

Both crashes have the same stack. Thread name vrcomp, frames are offsets into the named binaries:

#0 driver_vrlink.so+0xc9950
#1 vrserver+0x22adc2
#2 vrserver+0x3e8ed4
#3 vrserver+0x2bda22
#4 libc start_thread

The kernel reported the same fault both times:

vrcomp[1635253]: segfault at 0 ip 0000788f834c9950 sp 0000788f2a8fbc20 error 4 in driver_vrlink.so[c8950,788f83476000+19a000]
vrcomp[2863362]: segfault at 0 ip 000075f2d6cc9950 sp 000075f2941f9c20 error 4 in driver_vrlink.so[c8950,75f2d6c76000+19a000]
Code: 24 3b 5a 08 75 c4 4c 39 e1 0f 84 87 00 00 00 49 8b 04 24 4c 8d 68 20 48 83 e8 80 48 89 45 a8 49 8b 7d 00 48 8d 0d a0 c0 ff ff <48> 8b 07 48 8b 40 10 48 39 c8 75 34 ...

The faulting instruction is mov (%rdi),%rax with rdi == 0. The code loads an object pointer from a list entry and then reads that object's vtable, so a null object pointer is being dereferenced. Judging by the code that follows, it compares the vtable slot against a known function, which looks like a devirtualization check. My guess is that this is an entry for a resource or swap texture set left behind by the compositor that failed.

Breakpad IDs: bp-133fe00d-e1a5-45ad-89f2-dbbe92261004 (vrserver), bp-cf6c7fee-3fde-4729-ad36-be5572261004 (assert).

Status on 2.18.2 beta

I switched to the beta branch (2.18.2, vrlink 0.4.3 20260930.6234839) afterwards. In one session on 2.18.2, the first compositor stayed up and Half-Life: Alyx launched without this crash. So this may already be fixed in the beta. Even so, the vrserver null dereference after a compositor init failure seems worth checking regardless of how the compositor failed. I'll update here if it happens again on 2.18.2.

System information

  • SteamVR 2.17.10 (stable) when these crashes happened; now on 2.18.2 beta
  • Headset: Steam Frame via Frame Wi-Fi dongle (28de:2432, rtw89_8852cu)
  • GPU: NVIDIA RTX 5080, driver 610.57.04 (open kernel modules)
  • OS: Arch Linux (Omarchy), kernel 7.2.5
  • Compositor: Hyprland 0.56.2, Wayland. vrcompositor logs CHmdWindowSDL: Using Wayland and leases the HMD via wp_drm_lease_device_v1. Hyprland logged no protocol errors.
  • Legacy Steam Runtime (app 4032350) installed; the outcome was the same before and after installing it.
  • Launch options: QT_QPA_PLATFORM=xcb %command%

Related: #990 (a vrcompositor use-after-free during shutdown on 2.18.2, possibly the same resource-lifetime area).

A SteamVR system report and core dumps are available on request.

Launch lines