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.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<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.
*/

View file

@ -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<Certificate> mCurrentlyMoving = new LinkedList<Certificate>();
private Set<Certificate> mCurrentlyMoving =
Collections.newSetFromMap(new ConcurrentHashMap<Certificate, Boolean>());
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);