Link installer "Restart your computer" loop — root cause: Windows usernames containing "(" crash the installer's log sanitiser (fix found)
Summary
Meta Horizon Link Setup (_Setup v1.16.0.0, OculusDriverInstaller/ODI v1.21.5.0) fails and rolls back on every attempt when the Windows account name contains a regex metacharacter such as "(". My account name has this form: Daniel(…. The drivers actually install fine, but the installer's analytics/telemetry code then crashes, oculus-driver.exe exits with an unhandled .NET exception, and Setup rolls the whole install back. I confirmed the cause by decompiling the installer and testing a patched build, which installed successfully.
Environment
Windows 11, Quest 3, domain-joined work account whose short logon name contains "(".
Symptom
"Restart your computer. Sorry, we encountered an error during installation…" every time. Restarting, clean reinstalls, antivirus off, unplugging the second monitor and fresh installer downloads made no difference.
What the logs show (%LOCALAPPDATA%\Oculus)
OculusDriverInstaller_*.log: every driver installs and reports "Install Complete: Success", then[Fatal] Exception thrown that wasn't caught locally: One or more errors occurred. (AggregateException) at OculusDriverInstaller.EntryPoint.RunOculusSetup.log:Process …\oculus-drivers\oculus-driver.exe exited with code -532462766 (failure)(0xE0434352, unhandled CLR exception) →Install 'Dawn.Setup.InstallDriversStep' failed.→Rolling back installation.- At exit:
System.ArgumentException: parsing "\bDaniel(…\b" - Not enough )'s. at Daybreak.Util.Extensions.RecursivelySanitise … at Daybreak.Net.MarauderClient.CreateMarauderPacket
Root cause (from decompiling Daybreak.dll)
Daybreak.Net.Analytics.BuildSubstitutions() adds Environment.UserName as a key to be scrubbed from telemetry. Daybreak.Util.Extensions.RecursivelySanitise then does:
text = Regex.Replace(text, "\\b" + substitution.Key + "\\b", substitution.Value);
The key isn't passed through Regex.Escape, so a username with "(" produces an invalid pattern and throws. MarauderClient.Runloop only catches OperationCanceledException, so the exception faults the analytics task, which surfaces when the process waits on it at shutdown. In oculus-driver.exe that turns a successful driver install into a crash exit code, and Setup treats that as failure and rolls back.
Because the name comes from Environment.UserName (the Win32 API), overriding USERNAME/USERPROFILE/TEMP/LOCALAPPDATA doesn't help. I tried it, and the logs show the same crash.
Also logged, but caught (not the cause): BuildSubstitutions throws InvalidCastException: GroupPrincipal → UserPrincipal from UserPrincipal.Current on a domain-joined account.
Suggested fix for Meta
Regex.Escape(substitution.Key)inRecursivelySanitise, or a plainstring.Replace.- Never let telemetry exceptions escape: catch inside
MarauderClient.Tick/Runloop, so analytics can't fail an install. - Reconsider rolling back an entire install because the driver tool's exit code is non-zero after its own log says "Install Complete: Success".
How I got it installed (using Claude)
I had Claude (Anthropic's AI assistant) read the installer logs on my PC. When workarounds failed, it decompiled the installer with ILSpy's decompiler engine and found the bug above. It then made a same-size byte patch to my local copy of Setup.exe:
- In the embedded Daybreak.dll,
RecursivelySanitisenow does a literaltext.Replace(key, value)instead ofRegex.Replace(username scrubbing still works). - In
Dawn.Mixins.ExecuteProcessBool(used only by the driver step at install time), the catch now returns true, so the driver tool's crash on exit no longer triggers a rollback.
The downloaded packages and drivers were untouched and still go through Meta's signature checks. With the patched setup, every step succeeded and Setup exited with code 0. Since the patched setup loses Meta's code signature I'm not sharing it, but the information above should let Meta fix this quickly. Happy to provide full logs.
