fixed memory in case of a certificate parsing problem
This commit is contained in:
parent
e1d6f0869b
commit
b643bbbe40
|
@ -98,38 +98,40 @@ parse_x509_cert(sc_context_t *ctx, struct sc_pkcs15_der *der, struct sc_pkcs15_c
|
||||||
cert->data.len = data_len;
|
cert->data.len = data_len;
|
||||||
|
|
||||||
r = sc_asn1_decode(ctx, asn1_cert, obj, objlen, NULL, NULL);
|
r = sc_asn1_decode(ctx, asn1_cert, obj, objlen, NULL, NULL);
|
||||||
LOG_TEST_RET(ctx, r, "ASN.1 parsing of certificate failed");
|
cert->key = pubkey;
|
||||||
|
|
||||||
cert->version++;
|
cert->version++;
|
||||||
|
|
||||||
|
LOG_TEST_GOTO_ERR(ctx, r, "ASN.1 parsing of certificate failed");
|
||||||
|
|
||||||
if (!pubkey)
|
if (!pubkey)
|
||||||
LOG_TEST_RET(ctx, SC_ERROR_INVALID_ASN1_OBJECT, "Unable to decode subjectPublicKeyInfo from cert");
|
LOG_TEST_GOTO_ERR(ctx, SC_ERROR_INVALID_ASN1_OBJECT, "Unable to decode subjectPublicKeyInfo from cert");
|
||||||
cert->key = pubkey;
|
|
||||||
|
|
||||||
sc_asn1_clear_algorithm_id(&sig_alg);
|
sc_asn1_clear_algorithm_id(&sig_alg);
|
||||||
|
|
||||||
if (serial && serial_len) {
|
if (serial && serial_len) {
|
||||||
sc_format_asn1_entry(asn1_serial_number + 0, serial, &serial_len, 1);
|
sc_format_asn1_entry(asn1_serial_number + 0, serial, &serial_len, 1);
|
||||||
r = sc_asn1_encode(ctx, asn1_serial_number, &cert->serial, &cert->serial_len);
|
r = sc_asn1_encode(ctx, asn1_serial_number, &cert->serial, &cert->serial_len);
|
||||||
free(serial);
|
LOG_TEST_GOTO_ERR(ctx, r, "ASN.1 encoding of serial failed");
|
||||||
LOG_TEST_RET(ctx, r, "ASN.1 encoding of serial failed");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subject && subject_len) {
|
if (subject && subject_len) {
|
||||||
sc_format_asn1_entry(asn1_subject + 0, subject, &subject_len, 1);
|
sc_format_asn1_entry(asn1_subject + 0, subject, &subject_len, 1);
|
||||||
r = sc_asn1_encode(ctx, asn1_subject, &cert->subject, &cert->subject_len);
|
r = sc_asn1_encode(ctx, asn1_subject, &cert->subject, &cert->subject_len);
|
||||||
free(subject);
|
LOG_TEST_GOTO_ERR(ctx, r, "ASN.1 encoding of subject");
|
||||||
LOG_TEST_RET(ctx, r, "ASN.1 encoding of subject");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (issuer && issuer_len) {
|
if (issuer && issuer_len) {
|
||||||
sc_format_asn1_entry(asn1_issuer + 0, issuer, &issuer_len, 1);
|
sc_format_asn1_entry(asn1_issuer + 0, issuer, &issuer_len, 1);
|
||||||
r = sc_asn1_encode(ctx, asn1_issuer, &cert->issuer, &cert->issuer_len);
|
r = sc_asn1_encode(ctx, asn1_issuer, &cert->issuer, &cert->issuer_len);
|
||||||
free(issuer);
|
LOG_TEST_GOTO_ERR(ctx, r, "ASN.1 encoding of issuer");
|
||||||
LOG_TEST_RET(ctx, r, "ASN.1 encoding of issuer");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return SC_SUCCESS;
|
err:
|
||||||
|
free(serial);
|
||||||
|
free(subject);
|
||||||
|
free(issuer);
|
||||||
|
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -539,8 +541,7 @@ sc_pkcs15_free_certificate(struct sc_pkcs15_cert *cert)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cert->key)
|
sc_pkcs15_free_pubkey(cert->key);
|
||||||
sc_pkcs15_free_pubkey(cert->key);
|
|
||||||
free(cert->subject);
|
free(cert->subject);
|
||||||
free(cert->issuer);
|
free(cert->issuer);
|
||||||
free(cert->serial);
|
free(cert->serial);
|
||||||
|
@ -555,7 +556,6 @@ sc_pkcs15_free_cert_info(sc_pkcs15_cert_info_t *cert)
|
||||||
{
|
{
|
||||||
if (!cert)
|
if (!cert)
|
||||||
return;
|
return;
|
||||||
if (cert->value.value)
|
free(cert->value.value);
|
||||||
free(cert->value.value);
|
|
||||||
free(cert);
|
free(cert);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue