Check output of mpz_set_str and fix leak on error condition

Also add static identifier as upstream did
This commit is contained in:
est31 2015-07-24 21:38:40 +02:00
parent aab7c83d02
commit 5bde7798e9
2 changed files with 21 additions and 14 deletions

View File

@ -15,8 +15,8 @@
const char SHA256_version[] = "SHA-256" OPENSSL_VERSION_PTEXT; const char SHA256_version[] = "SHA-256" OPENSSL_VERSION_PTEXT;
/* mem_clr.c */ /* mem_clr.c */
unsigned char cleanse_ctr = 0; unsigned static char cleanse_ctr = 0;
void OPENSSL_cleanse(void *ptr, size_t len) static void OPENSSL_cleanse(void *ptr, size_t len)
{ {
unsigned char *p = ptr; unsigned char *p = ptr;
size_t loop = len, ctr = cleanse_ctr; size_t loop = len, ctr = cleanse_ctr;

View File

@ -166,6 +166,15 @@ static struct NGHex global_Ng_constants[] = {
}; };
static void delete_ng(NGConstant *ng)
{
if (ng) {
mpz_clear(ng->N);
mpz_clear(ng->g);
free(ng);
}
}
static NGConstant *new_ng( SRP_NGType ng_type, const char *n_hex, const char *g_hex ) static NGConstant *new_ng( SRP_NGType ng_type, const char *n_hex, const char *g_hex )
{ {
NGConstant *ng = (NGConstant *) malloc(sizeof(NGConstant)); NGConstant *ng = (NGConstant *) malloc(sizeof(NGConstant));
@ -180,22 +189,18 @@ static NGConstant *new_ng( SRP_NGType ng_type, const char *n_hex, const char *g_
g_hex = global_Ng_constants[ ng_type ].g_hex; g_hex = global_Ng_constants[ ng_type ].g_hex;
} }
mpz_set_str(ng->N, n_hex, 16); int rv = 0;
mpz_set_str(ng->g, g_hex, 16); rv = mpz_set_str(ng->N, n_hex, 16);
rv = rv | mpz_set_str(ng->g, g_hex, 16);
if (rv) {
delete_ng(ng);
return 0;
}
return ng; return ng;
} }
static void delete_ng( NGConstant *ng )
{
if (ng) {
mpz_clear(ng->N);
mpz_clear(ng->g);
free(ng);
}
}
typedef union typedef union
{ {
@ -849,6 +854,8 @@ struct SRPUser *srp_user_new(SRP_HashAlgorithm alg, SRP_NGType ng_type,
mpz_clear(usr->a); mpz_clear(usr->a);
mpz_clear(usr->A); mpz_clear(usr->A);
mpz_clear(usr->S); mpz_clear(usr->S);
if (usr->ng)
delete_ng(usr->ng);
if (usr->username) if (usr->username)
free(usr->username); free(usr->username);
if (usr->username_verifier) if (usr->username_verifier)