From a2d61f3bf3311ee2674b4005bcb651c0c95a88cb Mon Sep 17 00:00:00 2001 From: Arkadiusz Hiler Date: Mon, 31 Oct 2022 22:12:31 +0200 Subject: [PATCH] proton: Sync pfx creation and create a guard file. Due to unlucky power off or a crash crash when first starting the game the prefix can end up in corrupted state with no obvious way of troubleshooting. This is an attempt at ensuring that the prefix was created successfully and force-recreate it if it wasn't. CW-Bug-Id: #19720 --- proton | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/proton b/proton index 29cc697a..a6c845a4 100755 --- a/proton +++ b/proton @@ -16,6 +16,7 @@ import subprocess import sys import tarfile import shlex +import time from ctypes import CDLL from ctypes import CFUNCTYPE @@ -40,7 +41,7 @@ from random import randrange #To enable debug logging, copy "user_settings.sample.py" to "user_settings.py" #and edit it if needed. -CURRENT_PREFIX_VERSION="7.0-100" +CURRENT_PREFIX_VERSION="7.0-101" PFX="Proton: " ld_path_var = "LD_LIBRARY_PATH" @@ -475,6 +476,7 @@ class CompatData: def __init__(self, compatdata): self.base_dir = compatdata + "/" self.prefix_dir = self.path("pfx/") + self.creation_sync_guard = self.path("pfx/creation_sync_guard") self.version_file = self.path("version") self.config_info_file = self.path("config_info") self.tracked_files_file = self.path("tracked_files") @@ -624,6 +626,13 @@ class CompatData: log("Unable to write new registry file to " + sysreg_fp) pass + if int(old_proton_maj) < 7 or (int(old_proton_maj) == 7 and + int(old_proton_min) == 0 and + int(old_prefix_ver) < 101): + with open(self.creation_sync_guard, "x"): + pass + os.sync() + stale_builtins = [self.prefix_dir + "/drive_c/windows/system32/amd_ags_x64.dll", self.prefix_dir + "/drive_c/windows/syswow64/amd_ags_x64.dll" ] for builtin in stale_builtins: @@ -783,12 +792,20 @@ class CompatData: self.upgrade_pfx(old_ver) + # not fully-created prefix, copy it for future investigation + if file_exists(self.prefix_dir, follow_symlinks=True) and not file_exists(self.creation_sync_guard, follow_symlinks=True): + shutil.move(self.prefix_dir, self.path(f"corrupted_pfx-{time.time()}.bak")) + if not file_exists(self.prefix_dir, follow_symlinks=True): makedirs(self.prefix_dir + "/drive_c") set_dir_casefold_bit(self.prefix_dir + "/drive_c") - if not file_exists(self.prefix_dir + "/user.reg", follow_symlinks=True): self.copy_pfx() + os.sync() + + with open(self.creation_sync_guard, "x"): + pass + os.sync() self.migrate_user_paths()