Fix memory leak on malloc failure.
Found by running malloc tests with -valgrind. Unfortunately, the next one is deep in crypto/asn1 itself, so I'm going to stop here for now. Change-Id: I7a33971ee07c6b7b7a98715f2f18e0f29380c0a1 Reviewed-on: https://boringssl-review.googlesource.com/3350 Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
parent
2d445c0921
commit
9e128b06a1
@ -175,6 +175,16 @@ static void x509_name_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it)
|
|||||||
*pval = NULL;
|
*pval = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void local_sk_X509_NAME_ENTRY_free(STACK_OF(X509_NAME_ENTRY) *ne)
|
||||||
|
{
|
||||||
|
sk_X509_NAME_ENTRY_free(ne);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void local_sk_X509_NAME_ENTRY_pop_free(STACK_OF(X509_NAME_ENTRY) *ne)
|
||||||
|
{
|
||||||
|
sk_X509_NAME_ENTRY_pop_free(ne, X509_NAME_ENTRY_free);
|
||||||
|
}
|
||||||
|
|
||||||
static int x509_name_ex_d2i(ASN1_VALUE **val,
|
static int x509_name_ex_d2i(ASN1_VALUE **val,
|
||||||
const unsigned char **in, long len, const ASN1_ITEM *it,
|
const unsigned char **in, long len, const ASN1_ITEM *it,
|
||||||
int tag, int aclass, char opt, ASN1_TLC *ctx)
|
int tag, int aclass, char opt, ASN1_TLC *ctx)
|
||||||
@ -197,9 +207,14 @@ static int x509_name_ex_d2i(ASN1_VALUE **val,
|
|||||||
if(ret <= 0) return ret;
|
if(ret <= 0) return ret;
|
||||||
|
|
||||||
if(*val) x509_name_ex_free(val, NULL);
|
if(*val) x509_name_ex_free(val, NULL);
|
||||||
if(!x509_name_ex_new(&nm.a, NULL)) goto err;
|
|
||||||
/* We've decoded it: now cache encoding */
|
/* We've decoded it: now cache encoding */
|
||||||
if(!BUF_MEM_grow(nm.x->bytes, p - q)) goto err;
|
if (!x509_name_ex_new(&nm.a, NULL) ||
|
||||||
|
!BUF_MEM_grow(nm.x->bytes, p - q))
|
||||||
|
{
|
||||||
|
sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname.s,
|
||||||
|
local_sk_X509_NAME_ENTRY_pop_free);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
memcpy(nm.x->bytes->data, q, p - q);
|
memcpy(nm.x->bytes->data, q, p - q);
|
||||||
|
|
||||||
/* Convert internal representation to X509_NAME structure */
|
/* Convert internal representation to X509_NAME structure */
|
||||||
@ -248,16 +263,6 @@ static int x509_name_ex_i2d(ASN1_VALUE **val, unsigned char **out, const ASN1_IT
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void local_sk_X509_NAME_ENTRY_free(STACK_OF(X509_NAME_ENTRY) *ne)
|
|
||||||
{
|
|
||||||
sk_X509_NAME_ENTRY_free(ne);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void local_sk_X509_NAME_ENTRY_pop_free(STACK_OF(X509_NAME_ENTRY) *ne)
|
|
||||||
{
|
|
||||||
sk_X509_NAME_ENTRY_pop_free(ne, X509_NAME_ENTRY_free);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int x509_name_encode(X509_NAME *a)
|
static int x509_name_encode(X509_NAME *a)
|
||||||
{
|
{
|
||||||
union { STACK_OF(STACK_OF_X509_NAME_ENTRY) *s;
|
union { STACK_OF(STACK_OF_X509_NAME_ENTRY) *s;
|
||||||
|
@ -1053,7 +1053,8 @@ func runTest(test *testCase, buildDir string, mallocNumToFail int64) error {
|
|||||||
shim.Stdout = &stdoutBuf
|
shim.Stdout = &stdoutBuf
|
||||||
shim.Stderr = &stderrBuf
|
shim.Stderr = &stderrBuf
|
||||||
if mallocNumToFail >= 0 {
|
if mallocNumToFail >= 0 {
|
||||||
shim.Env = []string{"MALLOC_NUMBER_TO_FAIL=" + strconv.FormatInt(mallocNumToFail, 10)}
|
shim.Env = os.Environ()
|
||||||
|
shim.Env = append(shim.Env, "MALLOC_NUMBER_TO_FAIL="+strconv.FormatInt(mallocNumToFail, 10))
|
||||||
if *mallocTestDebug {
|
if *mallocTestDebug {
|
||||||
shim.Env = append(shim.Env, "MALLOC_ABORT_ON_FAIL=1")
|
shim.Env = append(shim.Env, "MALLOC_ABORT_ON_FAIL=1")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user