Check output of mpz_set_str and fix leak on error condition

master
est31 2015-07-24 21:38:40 +02:00
parent c6da9eeb3f
commit 84a07dde15
1 changed files with 19 additions and 12 deletions

31
srp.c
View File

@ -159,6 +159,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 )
{
NGConstant *ng = (NGConstant *) malloc(sizeof(NGConstant));
@ -173,22 +182,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;
}
mpz_set_str(ng->N, n_hex, 16);
mpz_set_str(ng->g, g_hex, 16);
int rv = 0;
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;
}
static void delete_ng( NGConstant *ng )
{
if (ng) {
mpz_clear(ng->N);
mpz_clear(ng->g);
free(ng);
}
}
typedef union
{
@ -842,6 +847,8 @@ err_exit:
mpz_clear(usr->a);
mpz_clear(usr->A);
mpz_clear(usr->S);
if (usr->ng)
delete_ng(usr->ng);
if (usr->username)
free(usr->username);
if (usr->username_verifier)