mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-06-14 08:53:13 +02:00
CLI: disable async crash-recovery backup in headless mode (fixes segfault)
QETProject schedules an asynchronous crash-recovery backup on construction (writeBackup() -> QtConcurrent::run(QET::writeToFile, ..., &m_backup_file)). In one-shot CLI mode the QETProject is destroyed as soon as the command returns, while that background write still references its m_backup_file member — an intermittent use-after-free segfault during teardown (~1 in 6 runs; observed on --resave and --set-titleblock). A crash-recovery backup is meaningless for a short-lived headless command, so add QETProject::setBackupEnabled(false), called from the CLI entry in main(). writeBackup() then early-returns, so no background write is ever launched. Fixes the crash for all CLI commands. See #492.
This commit is contained in:
@@ -105,6 +105,12 @@ class QETProject : public QObject
|
||||
QVersionNumber declaredQElectroTechVersion();
|
||||
void setTitle(const QString &);
|
||||
|
||||
/// Enable/disable the asynchronous crash-recovery backup for all
|
||||
/// projects. Disabled by the headless CLI: the backup write runs on a
|
||||
/// background thread referencing the project, and a short-lived CLI
|
||||
/// process can destroy the project before the write finishes (crash).
|
||||
static void setBackupEnabled(bool enabled);
|
||||
|
||||
///DEFAULT PROPERTIES
|
||||
BorderProperties defaultBorderProperties() const;
|
||||
void setDefaultBorderProperties(const BorderProperties &);
|
||||
@@ -241,6 +247,8 @@ class QETProject : public QObject
|
||||
|
||||
// attributes
|
||||
private:
|
||||
/// When false, writeBackup() is a no-op (set by the headless CLI)
|
||||
static bool m_backup_enabled;
|
||||
/// File path this project is saved to
|
||||
QString m_file_path;
|
||||
/// Current state of the project
|
||||
|
||||
Reference in New Issue
Block a user