Fixed crash when rapidly moving multiple certificates using list buttons.

This commit is contained in:
Felix Ableitner 2014-08-05 20:46:32 +02:00
parent 200fefe9c3
commit 2ccda3cb3f
2 changed files with 29 additions and 5 deletions

View File

@ -4,9 +4,11 @@ import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log; import android.util.Log;
import android.util.Pair;
import com.nutomic.zertman.Certificate; import com.nutomic.zertman.Certificate;
import com.nutomic.zertman.CertificateManager; import com.nutomic.zertman.CertificateManager;
import com.nutomic.zertman.test.R;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.DataInputStream; import java.io.DataInputStream;
@ -132,6 +134,23 @@ public class CertificateManagerTest extends AndroidTestCase {
assertReadOnly(); assertReadOnly();
} }
@SmallTest
public void testGetDescription() {
Certificate cert = copyCertificate(false);
Pair<String, String> desc = CertificateManager.getDescription(cert);
assertFalse(desc.first.isEmpty());
assertNotSame(desc.first, desc.second);
mCertificateManager.deleteCertificate(cert);
}
@SmallTest
public void testGetDescriptionNonExistant() {
Pair<String, String> desc =
CertificateManager.getDescription(new Certificate("does-not-exist", false));
assertNotNull(desc);
assertFalse(desc.first.isEmpty());
}
/** /**
* Checks that /system is properly remounted as read only. * Checks that /system is properly remounted as read only.
*/ */

View File

@ -13,8 +13,10 @@ import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory; import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedList; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import eu.chainfire.libsuperuser.Shell; 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. * Contains all certificates that are currently being moved from user to system storage.
*/ */
private LinkedList<Certificate> mCurrentlyMoving = new LinkedList<Certificate>(); private Set<Certificate> mCurrentlyMoving =
Collections.newSetFromMap(new ConcurrentHashMap<Certificate, Boolean>());
private OnCertificateChangedListener mOnCertificateChangedListener; private OnCertificateChangedListener mOnCertificateChangedListener;
@ -143,11 +146,13 @@ public class CertificateManager {
is = new BufferedInputStream(new FileInputStream(cert.getFile())); is = new BufferedInputStream(new FileInputStream(cert.getFile()));
cert2 = (X509Certificate) factory.generateCertificate(is); cert2 = (X509Certificate) factory.generateCertificate(is);
} catch (IOException | CertificateException e) { } catch (IOException | CertificateException e) {
return null; Log.w(TAG, "Failed to read certificate description");
return new Pair<>(cert.getFile().getName(), "");
} finally { } finally {
try { try {
// TODO: crash here if (is != null) {
is.close(); is.close();
}
} }
catch (IOException e) { catch (IOException e) {
Log.w(TAG, "Failed to close stream", e); Log.w(TAG, "Failed to close stream", e);