From 6d4f55ffe5eacebe0dbf7e3e8ab5755050704081 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 7 May 2026 23:37:01 -0400 Subject: [PATCH] A couple of socket fixes so root fenrir and user fenrir do not battle. --- .../core/remoteInstanceRegistry.py | 10 +++--- .../remoteDriver/unixDriver.py | 33 +++++++++++++++---- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/fenrirscreenreader/core/remoteInstanceRegistry.py b/src/fenrirscreenreader/core/remoteInstanceRegistry.py index 987d2634..75b99085 100644 --- a/src/fenrirscreenreader/core/remoteInstanceRegistry.py +++ b/src/fenrirscreenreader/core/remoteInstanceRegistry.py @@ -14,10 +14,7 @@ INSTANCE_TIMEOUT_SEC = 30.0 def get_registry_dir(): - return os.path.join( - tempfile.gettempdir(), - f"fenrirscreenreader-instances-{os.getuid()}", - ) + return os.path.join(tempfile.gettempdir(), "fenrirscreenreader-instances") def get_instance_file(pid=None): @@ -28,13 +25,14 @@ def get_instance_file(pid=None): def write_instance(instance_data): registry_dir = get_registry_dir() - os.makedirs(registry_dir, mode=0o700, exist_ok=True) - os.chmod(registry_dir, 0o700) + os.makedirs(registry_dir, mode=0o755, exist_ok=True) + os.chmod(registry_dir, 0o755) instance_data["updated_at"] = time.time() instance_path = get_instance_file(instance_data.get("pid")) with open(instance_path, "w", encoding="utf-8") as instance_file: json.dump(instance_data, instance_file, sort_keys=True) instance_file.write("\n") + os.chmod(instance_path, 0o644) def remove_instance(pid=None): diff --git a/src/fenrirscreenreader/remoteDriver/unixDriver.py b/src/fenrirscreenreader/remoteDriver/unixDriver.py index c335ef66..b176855b 100644 --- a/src/fenrirscreenreader/remoteDriver/unixDriver.py +++ b/src/fenrirscreenreader/remoteDriver/unixDriver.py @@ -23,7 +23,7 @@ class driver(remoteDriver): def __init__(self): remoteDriver.__init__(self) self.fenrirSocks = [] - self.socket_files = [] + self.bound_sockets = [] def initialize(self, environment): self.env = environment @@ -94,11 +94,16 @@ class driver(remoteDriver): def _register_instance(self): settings_manager = self.env["runtime"]["SettingsManager"] + active_socket_files = [ + socket_file + for fenrir_sock, socket_file in self.bound_sockets + if self._socket_file_matches_socket(fenrir_sock, socket_file) + ] instance_data = { "pid": os.getpid(), "ppid": os.getppid(), - "socket_files": self.socket_files, - "main_socket": MAIN_SOCKET_FILE in self.socket_files, + "socket_files": active_socket_files, + "main_socket": MAIN_SOCKET_FILE in active_socket_files, "screen_driver": settings_manager.get_setting("screen", "driver"), "keyboard_driver": settings_manager.get_setting("keyboard", "driver"), "x11_window_id": settings_manager.get_setting( @@ -108,6 +113,17 @@ class driver(remoteDriver): } remoteInstanceRegistry.write_instance(instance_data) + def _socket_file_matches_socket(self, fenrir_sock, socket_file): + try: + socket_stat = os.stat(socket_file) + fd_stat = os.fstat(fenrir_sock.fileno()) + except OSError: + return False + return ( + socket_stat.st_dev == fd_stat.st_dev + and socket_stat.st_ino == fd_stat.st_ino + ) + def _cleanup(self): for fenrir_sock in self.fenrirSocks: try: @@ -116,13 +132,16 @@ class driver(remoteDriver): pass self.fenrirSocks = [] - for socket_file in self.socket_files: + for _, socket_file in self.bound_sockets: try: - if os.path.exists(socket_file): + if ( + os.path.exists(socket_file) + and not self._is_socket_active(socket_file) + ): os.unlink(socket_file) except OSError: pass - self.socket_files = [] + self.bound_sockets = [] remoteInstanceRegistry.remove_instance() def _handle_client(self, client_sock, event_queue): @@ -167,7 +186,7 @@ class driver(remoteDriver): if fenrir_sock is None: continue self.fenrirSocks.append(fenrir_sock) - self.socket_files.append(socket_file) + self.bound_sockets.append((fenrir_sock, socket_file)) if not self.fenrirSocks: return