fix(wallet): reliable process detection + drop the harmful start-retry
Two issues the latest live log exposed: - The switch's start-retry spawned a SECOND dragonxd while the first was still shutting down, so the two held wallet.dat against each other (BDB "Failed to rename wallet-savings.dat … Error"), and it then span on a stale "Daemon already running". Revert to a single start — the stopDaemonForWalletSwitch() wait already ensures the old process is gone, so a valid wallet opens cleanly and a bad one exits during init and reverts, without overlapping spawns. - findProcessByName() used the non-suffixed PROCESSENTRY32/Process32First with an ANSI _stricmp; if UNICODE is defined those map to the wide variants, so the compare comparing garbage would NEVER match — silently making the process-gone wait a no-op. Rewritten with the explicit wide Toolhelp API + lstrcmpiW so it's correct either way (verified to compile under mingw with and without -DUNICODE). Note: a corrupt wallet.dat (BDB recovery failing) still can't be opened by any node — that's a data issue needing a clean reset, not a switch-flow bug. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -683,18 +683,25 @@ static DWORD findProcessByName(const char* name)
|
||||
{
|
||||
HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||
if (snap == INVALID_HANDLE_VALUE) return 0;
|
||||
|
||||
PROCESSENTRY32 entry;
|
||||
|
||||
// Use the explicit WIDE Toolhelp API + a wide compare so this is correct regardless of the UNICODE
|
||||
// macro. (The non-suffixed PROCESSENTRY32/Process32First map to the wide variants when UNICODE is
|
||||
// defined, in which case szExeFile is WCHAR[] and an ANSI _stricmp would compare garbage and NEVER
|
||||
// match — silently making findProcessByName a no-op that returns 0 for a running process.)
|
||||
wchar_t wname[MAX_PATH];
|
||||
if (MultiByteToWideChar(CP_ACP, 0, name, -1, wname, MAX_PATH) == 0) { CloseHandle(snap); return 0; }
|
||||
|
||||
PROCESSENTRY32W entry;
|
||||
entry.dwSize = sizeof(entry);
|
||||
|
||||
|
||||
DWORD pid = 0;
|
||||
if (Process32First(snap, &entry)) {
|
||||
if (Process32FirstW(snap, &entry)) {
|
||||
do {
|
||||
if (_stricmp(entry.szExeFile, name) == 0) {
|
||||
if (lstrcmpiW(entry.szExeFile, wname) == 0) { // Win32 case-insensitive wide compare
|
||||
pid = entry.th32ProcessID;
|
||||
break;
|
||||
}
|
||||
} while (Process32Next(snap, &entry));
|
||||
} while (Process32NextW(snap, &entry));
|
||||
}
|
||||
CloseHandle(snap);
|
||||
return pid;
|
||||
|
||||
Reference in New Issue
Block a user