From 228f9f6004d55c08afd612c81b178a84c9c96da0 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Wed, 14 Oct 2026 09:41:29 +0700 Subject: [PATCH] android: deleting or updating a profile no longer crashes when its data source was already closed A profile keeps the VpnProfileSqlDataSource it was loaded from, and close() nulls its database, so insert/update/delete on that profile hit a NullPointerException and the profile stayed in place. The data source now reopens the database on demand. Co-Authored-By: Claude Sonnet 5.5 --- .../android/data/VpnProfileSqlDataSource.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/data/VpnProfileSqlDataSource.java b/src/frontends/android/app/src/main/java/org/strongswan/android/data/VpnProfileSqlDataSource.java index cee26a457..63d2deabe 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/data/VpnProfileSqlDataSource.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/data/VpnProfileSqlDataSource.java @@ -54,6 +54,16 @@ public class VpnProfileSqlDataSource implements VpnProfileDataSource return this; } + /** + * A profile keeps the data source it was loaded from, which may be closed + * by the time the profile is updated or deleted, so reopen on demand. + */ + private SQLiteDatabase database() + { + open(); + return mDatabase; + } + @Override public void close() { @@ -67,7 +77,7 @@ public class VpnProfileSqlDataSource implements VpnProfileDataSource public VpnProfile insertProfile(VpnProfile profile) { ContentValues values = ContentValuesFromVpnProfile(profile); - long insertId = mDatabase.insert(DatabaseHelper.TABLE_VPN_PROFILE.Name, null, values); + long insertId = database().insert(DatabaseHelper.TABLE_VPN_PROFILE.Name, null, values); if (insertId == -1) { return null; @@ -82,14 +92,14 @@ public class VpnProfileSqlDataSource implements VpnProfileDataSource { final UUID uuid = profile.getUUID(); ContentValues values = ContentValuesFromVpnProfile(profile); - return mDatabase.update(DatabaseHelper.TABLE_VPN_PROFILE.Name, values, KEY_UUID + " = ?", new String[]{uuid.toString()}) > 0; + return database().update(DatabaseHelper.TABLE_VPN_PROFILE.Name, values, KEY_UUID + " = ?", new String[]{uuid.toString()}) > 0; } @Override public boolean deleteVpnProfile(VpnProfile profile) { final UUID uuid = profile.getUUID(); - return mDatabase.delete(DatabaseHelper.TABLE_VPN_PROFILE.Name, KEY_UUID + " = ?", new String[]{uuid.toString()}) > 0; + return database().delete(DatabaseHelper.TABLE_VPN_PROFILE.Name, KEY_UUID + " = ?", new String[]{uuid.toString()}) > 0; } @Override