mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-26 06:08:40 +01:00
fix(linux): don't ship libsqlite3.so as a dereferenced symlink
The Linux bundle installed lib/libsqlite3.so as a symlink to libsqlite3_flutter_libs_plugin.so, which holds the sqlite3 amalgamation compiled into the plugin. The release tarball dereferences that symlink, so the extracted tree carries two byte-identical copies of the same shared object with the same SONAME. Loading both maps sqlite twice and sqlite3_initialize calls through a null mutex-init pointer, segfaulting about a second after launch before any UI paints. Drop the alias and open the plugin under its real name instead, falling back to the system sqlite when it isn't there. Verified on the v6.4.4 Linux release: restoring a real symlink launches and paints, copying the file back over it reproduces the segfault. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BkQt8DaFfxs3FThEUaMPix
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import 'dart:ffi';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:cw_core/db/sqlite_debug.dart';
|
||||
@@ -5,6 +6,7 @@ import 'package:cw_core/root_dir.dart';
|
||||
import 'package:cw_core/utils/print_verbose.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
|
||||
import 'package:sqlite3/open.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
|
||||
Database? db;
|
||||
@@ -49,6 +51,20 @@ Future<void> initDb({String? pathOverride}) async {
|
||||
|
||||
Future<void> _initDb({String? pathOverride}) async {
|
||||
if (Platform.isLinux || Platform.isWindows) {
|
||||
if (Platform.isLinux) {
|
||||
// The Linux bundle only installs the bundled sqlite3 shared object as
|
||||
// libsqlite3_flutter_libs_plugin.so (see linux/CMakeLists.txt); load it
|
||||
// directly instead of relying on a libsqlite3.so symlink, which the
|
||||
// release tarball dereferences into a second copy of the same library
|
||||
// and crashes the process when both copies get mapped.
|
||||
open.overrideFor(OperatingSystem.linux, () {
|
||||
try {
|
||||
return DynamicLibrary.open('libsqlite3_flutter_libs_plugin.so');
|
||||
} catch (_) {
|
||||
return DynamicLibrary.open('libsqlite3.so.0');
|
||||
}
|
||||
});
|
||||
}
|
||||
databaseFactory = databaseFactoryFfi;
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ dependencies:
|
||||
bech32:
|
||||
git:
|
||||
url: https://github.com/cake-tech/bech32.git
|
||||
sqlite3: 3.5.1
|
||||
sqlite3_flutter_libs: 0.5.40
|
||||
|
||||
dev_dependencies:
|
||||
|
||||
@@ -160,13 +160,6 @@ foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
|
||||
COMPONENT Runtime)
|
||||
endforeach(bundled_library)
|
||||
|
||||
install(CODE "
|
||||
execute_process(
|
||||
COMMAND \"${CMAKE_COMMAND}\" -E create_symlink
|
||||
libsqlite3_flutter_libs_plugin.so
|
||||
\"${INSTALL_BUNDLE_LIB_DIR}/libsqlite3.so\")
|
||||
" COMPONENT Runtime)
|
||||
|
||||
# Fully re-copy the assets directory on each build to avoid having stale files
|
||||
# from a previous install.
|
||||
set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
|
||||
|
||||
Reference in New Issue
Block a user