提交 ba9e5a2f 编写于 作者: W weijun

6880321: sun.security.provider.JavaKeyStore abuse of OOM Exception handling

Reviewed-by: xuelei
上级 82b04893
...@@ -29,9 +29,9 @@ import java.io.*; ...@@ -29,9 +29,9 @@ import java.io.*;
import java.security.*; import java.security.*;
import java.security.cert.Certificate; import java.security.cert.Certificate;
import java.security.cert.CertificateFactory; import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.util.*; import java.util.*;
import sun.misc.IOUtils;
import sun.security.pkcs.EncryptedPrivateKeyInfo; import sun.security.pkcs.EncryptedPrivateKeyInfo;
...@@ -677,50 +677,39 @@ abstract class JavaKeyStore extends KeyStoreSpi { ...@@ -677,50 +677,39 @@ abstract class JavaKeyStore extends KeyStoreSpi {
entry.date = new Date(dis.readLong()); entry.date = new Date(dis.readLong());
// Read the private key // Read the private key
try { entry.protectedPrivKey =
entry.protectedPrivKey = new byte[dis.readInt()]; IOUtils.readFully(dis, dis.readInt(), true);
} catch (OutOfMemoryError e) {
throw new IOException("Keysize too big");
}
dis.readFully(entry.protectedPrivKey);
// Read the certificate chain // Read the certificate chain
int numOfCerts = dis.readInt(); int numOfCerts = dis.readInt();
try { if (numOfCerts > 0) {
if (numOfCerts > 0) { List<Certificate> certs = new ArrayList<>(
entry.chain = new Certificate[numOfCerts]; numOfCerts > 10 ? 10 : numOfCerts);
} for (int j = 0; j < numOfCerts; j++) {
} catch (OutOfMemoryError e) { if (xVersion == 2) {
throw new IOException // read the certificate type, and instantiate a
("Too many certificates in chain"); // certificate factory of that type (reuse
} // existing factory if possible)
for (int j = 0; j < numOfCerts; j++) { String certType = dis.readUTF();
if (xVersion == 2) { if (cfs.containsKey(certType)) {
// read the certificate type, and instantiate a // reuse certificate factory
// certificate factory of that type (reuse cf = cfs.get(certType);
// existing factory if possible) } else {
String certType = dis.readUTF(); // create new certificate factory
if (cfs.containsKey(certType)) { cf = CertificateFactory.getInstance(certType);
// reuse certificate factory // store the certificate factory so we can
cf = cfs.get(certType); // reuse it later
} else { cfs.put(certType, cf);
// create new certificate factory }
cf = CertificateFactory.getInstance(certType);
// store the certificate factory so we can
// reuse it later
cfs.put(certType, cf);
} }
// instantiate the certificate
encoded = IOUtils.readFully(dis, dis.readInt(), true);
bais = new ByteArrayInputStream(encoded);
certs.add(cf.generateCertificate(bais));
bais.close();
} }
// instantiate the certificate // We can be sure now that numOfCerts of certs are read
try { entry.chain = certs.toArray(new Certificate[numOfCerts]);
encoded = new byte[dis.readInt()];
} catch (OutOfMemoryError e) {
throw new IOException("Certificate too big");
}
dis.readFully(encoded);
bais = new ByteArrayInputStream(encoded);
entry.chain[j] = cf.generateCertificate(bais);
bais.close();
} }
// Add the entry to the list // Add the entry to the list
...@@ -753,12 +742,7 @@ abstract class JavaKeyStore extends KeyStoreSpi { ...@@ -753,12 +742,7 @@ abstract class JavaKeyStore extends KeyStoreSpi {
cfs.put(certType, cf); cfs.put(certType, cf);
} }
} }
try { encoded = IOUtils.readFully(dis, dis.readInt(), true);
encoded = new byte[dis.readInt()];
} catch (OutOfMemoryError e) {
throw new IOException("Certificate too big");
}
dis.readFully(encoded);
bais = new ByteArrayInputStream(encoded); bais = new ByteArrayInputStream(encoded);
entry.cert = cf.generateCertificate(bais); entry.cert = cf.generateCertificate(bais);
bais.close(); bais.close();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册