fix: crash GUI su Windows (OverflowError anno 2038) — schede/menu BAL rotti (#3)
* fix(gui): voci di menu BAL duplicate/condensate dopo riavvio o cambio wallet
Sintomo (Windows 11): dopo aver riavviato Electrum o cambiato wallet, le
schede Will/Heirs sparivano dalla tab bar e dal menu, e compariva una voce
di menu condensata/illeggibile (icona + testo sovrapposti) sotto il logo di
Electrum, accanto a 'Portafogli'.
Causa: init_menubar_tools veniva eseguito DUE volte sulla stessa finestra.
Con il plugin gia abilitato, al riavvio Electrum invoca sia l'hook
init_menubar sia il percorso di init a caldo (init_qt -> _setup_window),
entrambi chiamano init_menubar_tools -> addTab/addAction duplicati.
Nell'originale init_qt faceva return (chiedendo il riavvio) e quindi i menu
venivano creati una sola volta; rimuovendo quel return (fix B3) e' emersa la
doppia inizializzazione.
Fix:
- BalWindow._menubar_initialized: guardia di idempotenza.
- init_menubar_tools: se gia inizializzato, esce subito (niente duplicati).
- on_close: resetta il flag dopo aver rimosso tab/azioni, cosi la stessa
finestra puo essere riusata per un altro wallet.
- tests/gui_fixes_test.py: regressione che verifica la guardia in __init__,
init_menubar_tools e on_close.
Logica di business invariata (nessuna modifica a bal/core/*).
* fix(gui): ripristina create_status_bar come no-op (come originale)
L'elemento di menu condensato/illeggibile sotto il logo di Electrum era
causato dal StatusBarButton aggiunto da create_status_bar.
Nell'originale Gitea questo hook aveva un 'return' subito dopo il log, PRIMA
di costruire il bottone: era quindi disabilitato di proposito. Durante la
pulizia del 'dead code' nel refactoring quel return era stato rimosso,
riattivando la creazione del bottone -> elemento icona+testo renderizzato
nel punto sbagliato dopo riavvio/cambio wallet.
Fix: create_status_bar torna a essere un no-op (return), fedele all'originale.
Le impostazioni restano raggiungibili da Strumenti -> Plugin.
Regressione: gui_fixes_test verifica che create_status_bar non chiami
addPermanentWidget.
* fix(core): OverflowError su Windows (anno 2038) che rompeva tab/menu BAL
CAUSA VERA (dal log Electrum dell'utente, Windows 11):
OverflowError: Python int too large to convert to C int
window.py __init__ -> create_heirs_tab -> WillSettingsWidget
-> on_locktime_change -> BalTimestamp.to_date
-> datetime.fromtimestamp(NLOCKTIME_MAX)
Su Windows time_t e' a 32 bit, quindi datetime.fromtimestamp() solleva
OverflowError per qualsiasi timestamp oltre il 2038 (es. NLOCKTIME_MAX =
2**32-1 = 4294967295, usato come locktime di default/sentinella). Su Linux
64-bit la stessa chiamata funziona: per questo il bug si vedeva solo su
Windows e i test su Linux non lo intercettavano.
L'eccezione interrompeva BalWindow.__init__ durante init_menubar/load_wallet,
lasciando le schede Will/Heirs e la voce di menu a meta' costruzione ->
l'elemento grafico condensato/illeggibile sotto il logo di Electrum.
FIX (comportamento invariato per tutti i valori normali):
- BalTimestamp._safe_fromtimestamp(): datetime.fromtimestamp con clamp a
INT32_MAX in caso di OverflowError/OSError/ValueError, esattamente come la
funzione get_max_allowed_timestamp() dell'originale (Electrum issue #6170).
- Usato in to_date / to_timestamp / __str__ / __repr__ di BalTimestamp.
- widgets.py set_value: usa il converter sicuro.
- util.py timestamp_minus: stessa protezione inline con clamp a INT32_MAX.
I valori entro il 2038 (date assolute normali, durate relative come 90d/5y)
producono lo stesso identico risultato di prima.
TEST: tests/windows_overflow_test.py riproduce il limite 32-bit di Windows
(monkeypatch di datetime.fromtimestamp) e dimostra che senza il fix si ottiene
lo stesso OverflowError del log, mentre col fix passa. Verificato anche che il
test FALLISCE senza il fix.
* docs(it): documenta il fix OverflowError Windows (anno 2038) nel changelog
Aggiunge la sezione §13 al CHANGELOG_REFACTOR.md che descrive:
- sintomo (schede/menu rotti su Windows dopo riavvio/cambio wallet)
- causa vera dal log (datetime.fromtimestamp(NLOCKTIME_MAX) -> OverflowError
su time_t 32-bit di Windows)
- fix con _safe_fromtimestamp (clamp a INT32_MAX, come Electrum #6170)
- test di regressione windows_overflow_test.py
Aggiornata anche la cronologia (§12) con PR #3.
---------
Co-authored-by: GenSpark AI Developer <ai@genspark.dev>
This commit is contained in:
committed by
steal
parent
6bff6760bf
commit
b1c8bba9e9
@@ -398,3 +398,60 @@ Suddivisione del vecchio `qt.py` (3777 righe) nei moduli GUI:
|
||||
vita (Fase A).
|
||||
- **`dd6f677`** (PR **#2**, squash) — correzioni GUI **B1-B10** + fix download
|
||||
lista will-executor + `window_utils.py` + test di regressione (sezioni §9-§10).
|
||||
- **PR #3** — fix **OverflowError su Windows (anno 2038)** che rompeva le schede
|
||||
Will/Heirs e la voce di menu (sezione §13).
|
||||
|
||||
---
|
||||
|
||||
## 13. CORREZIONE BUG: OverflowError su Windows (limite anno 2038)
|
||||
|
||||
### Sintomo (Windows 11)
|
||||
Dopo aver **riavviato Electrum** o **cambiato wallet**, le schede **Will** e
|
||||
**Heirs** sparivano e compariva una **voce di menu condensata/illeggibile**
|
||||
(icona + testo sovrapposti) sotto il logo di Electrum, accanto a *Portafogli*.
|
||||
Su Linux il problema non si manifestava.
|
||||
|
||||
### Causa vera (dal log di Electrum dell'utente)
|
||||
```
|
||||
OverflowError: Python int too large to convert to C int
|
||||
window.py __init__ -> create_heirs_tab -> WillSettingsWidget
|
||||
-> on_locktime_change -> BalTimestamp.to_date
|
||||
-> datetime.fromtimestamp(NLOCKTIME_MAX)
|
||||
```
|
||||
|
||||
- `NLOCKTIME_MAX = 2**32 - 1 = 4294967295` viene usato come locktime di
|
||||
**default/sentinella**.
|
||||
- Su **Windows** `time_t` è a **32 bit**, quindi `datetime.fromtimestamp(ts)`
|
||||
solleva **`OverflowError`** per qualsiasi timestamp oltre il **2038**.
|
||||
- Su **Linux 64-bit** la stessa chiamata **funziona**: ecco perché il bug si
|
||||
vedeva solo su Windows e i test su Linux non lo intercettavano.
|
||||
- L'eccezione interrompeva `BalWindow.__init__` durante `init_menubar` /
|
||||
`load_wallet`, lasciando le schede Will/Heirs e la voce di menu **a metà
|
||||
costruzione** → l'elemento grafico condensato/illeggibile sotto il logo.
|
||||
|
||||
> Nota: i due primi tentativi di correzione (status-bar no-op e idempotenza di
|
||||
> `init_menubar_tools`) **non** centravano la causa; sono stati comunque
|
||||
> mantenuti perché innocui e leggermente migliorativi, ma il vero colpevole era
|
||||
> questo crash a monte.
|
||||
|
||||
### Fix (comportamento invariato per tutti i valori normali)
|
||||
- **`BalTimestamp._safe_fromtimestamp()`**: `datetime.fromtimestamp` con
|
||||
**clamp a INT32_MAX** (anno 2038) in caso di `OverflowError`/`OSError`/
|
||||
`ValueError`, **esattamente** come la funzione `get_max_allowed_timestamp()`
|
||||
dell'originale (workaround per Electrum issue **#6170**).
|
||||
- Usato in `to_date` / `to_timestamp` / `__str__` / `__repr__` di
|
||||
`BalTimestamp`.
|
||||
- `gui/qt/widgets.py` (`set_value`): usa il converter sicuro.
|
||||
- `core/util.py` (`timestamp_minus`): stessa protezione inline con clamp a
|
||||
INT32_MAX.
|
||||
|
||||
I valori entro il 2038 (date assolute normali, durate relative come `90d`/`5y`)
|
||||
producono **lo stesso identico risultato** di prima.
|
||||
|
||||
### Test
|
||||
- `tests/windows_overflow_test.py` riproduce il limite 32-bit di Windows
|
||||
(monkeypatch di `datetime.fromtimestamp`) e dimostra che **senza** il fix si
|
||||
ottiene lo **stesso** `OverflowError` del log, mentre **con** il fix passa.
|
||||
Verificato anche che il test **fallisce** senza il fix.
|
||||
|
||||
Confermato dall'utente: **"si ora funziona"**.
|
||||
|
||||
Reference in New Issue
Block a user