diff --git a/electron/main/process-instance-lock.ts b/electron/main/process-instance-lock.ts index 154d36e..72bdc19 100644 --- a/electron/main/process-instance-lock.ts +++ b/electron/main/process-instance-lock.ts @@ -76,7 +76,9 @@ export function acquireProcessInstanceFileLock( } ownerPid = readLockOwnerPid(lockPath); - if (ownerPid && !isPidAlive(ownerPid) && existsSync(lockPath)) { + const shouldTreatAsStale = + ownerPid === undefined || !isPidAlive(ownerPid); + if (shouldTreatAsStale && existsSync(lockPath)) { try { rmSync(lockPath, { force: true }); continue; diff --git a/tests/unit/process-instance-lock.test.ts b/tests/unit/process-instance-lock.test.ts index ebf59c4..dadb579 100644 --- a/tests/unit/process-instance-lock.test.ts +++ b/tests/unit/process-instance-lock.test.ts @@ -77,4 +77,20 @@ describe('process instance file lock', () => { expect(readFileSync(lockPath, 'utf8')).toBe('5555'); lock.release(); }); + + it('replaces malformed lock file content', () => { + const userDataDir = createTempDir(); + const lockPath = join(userDataDir, 'clawx.instance.lock'); + writeFileSync(lockPath, 'not-a-pid', 'utf8'); + + const lock = acquireProcessInstanceFileLock({ + userDataDir, + lockName: 'clawx', + pid: 6666, + }); + + expect(lock.acquired).toBe(true); + expect(readFileSync(lockPath, 'utf8')).toBe('6666'); + lock.release(); + }); });