From 2ccda3cb3fd88efa2782fb42e8976b2990777f48 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Tue, 5 Aug 2014 20:46:32 +0200 Subject: [PATCH] Fixed crash when rapidly moving multiple certificates using list buttons. --- .../CertificateManagerTest.java | 19 +++++++++++++++++++ .../nutomic/zertman/CertificateManager.java | 15 ++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/app/src/androidTest/java/com.nutomic.zertman.test/CertificateManagerTest.java b/app/src/androidTest/java/com.nutomic.zertman.test/CertificateManagerTest.java index fd64598..ab71a08 100644 --- a/app/src/androidTest/java/com.nutomic.zertman.test/CertificateManagerTest.java +++ b/app/src/androidTest/java/com.nutomic.zertman.test/CertificateManagerTest.java @@ -4,9 +4,11 @@ import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; +import android.util.Pair; import com.nutomic.zertman.Certificate; import com.nutomic.zertman.CertificateManager; +import com.nutomic.zertman.test.R; import java.io.BufferedReader; import java.io.DataInputStream; @@ -132,6 +134,23 @@ public class CertificateManagerTest extends AndroidTestCase { assertReadOnly(); } + @SmallTest + public void testGetDescription() { + Certificate cert = copyCertificate(false); + Pair desc = CertificateManager.getDescription(cert); + assertFalse(desc.first.isEmpty()); + assertNotSame(desc.first, desc.second); + mCertificateManager.deleteCertificate(cert); + } + + @SmallTest + public void testGetDescriptionNonExistant() { + Pair desc = + CertificateManager.getDescription(new Certificate("does-not-exist", false)); + assertNotNull(desc); + assertFalse(desc.first.isEmpty()); + } + /** * Checks that /system is properly remounted as read only. */ diff --git a/app/src/main/java/com/nutomic/zertman/CertificateManager.java b/app/src/main/java/com/nutomic/zertman/CertificateManager.java index b01b650..ff9b8e8 100644 --- a/app/src/main/java/com/nutomic/zertman/CertificateManager.java +++ b/app/src/main/java/com/nutomic/zertman/CertificateManager.java @@ -13,8 +13,10 @@ import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.ArrayList; -import java.util.LinkedList; +import java.util.Collections; import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import eu.chainfire.libsuperuser.Shell; @@ -44,7 +46,8 @@ public class CertificateManager { /** * Contains all certificates that are currently being moved from user to system storage. */ - private LinkedList mCurrentlyMoving = new LinkedList(); + private Set mCurrentlyMoving = + Collections.newSetFromMap(new ConcurrentHashMap()); private OnCertificateChangedListener mOnCertificateChangedListener; @@ -143,11 +146,13 @@ public class CertificateManager { is = new BufferedInputStream(new FileInputStream(cert.getFile())); cert2 = (X509Certificate) factory.generateCertificate(is); } catch (IOException | CertificateException e) { - return null; + Log.w(TAG, "Failed to read certificate description"); + return new Pair<>(cert.getFile().getName(), ""); } finally { try { - // TODO: crash here - is.close(); + if (is != null) { + is.close(); + } } catch (IOException e) { Log.w(TAG, "Failed to close stream", e);