krb5: Fix moduli open file leak
This commit is contained in:
@@ -2108,17 +2108,22 @@ _krb5_parse_moduli_line(krb5_context context,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_moduli_element(struct krb5_dh_moduli *element)
|
||||||
|
{
|
||||||
|
free(element->name);
|
||||||
|
der_free_heim_integer(&element->p);
|
||||||
|
der_free_heim_integer(&element->g);
|
||||||
|
der_free_heim_integer(&element->q);
|
||||||
|
free(element);
|
||||||
|
}
|
||||||
|
|
||||||
KRB5_LIB_FUNCTION void KRB5_LIB_CALL
|
KRB5_LIB_FUNCTION void KRB5_LIB_CALL
|
||||||
_krb5_free_moduli(struct krb5_dh_moduli **moduli)
|
_krb5_free_moduli(struct krb5_dh_moduli **moduli)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; moduli[i] != NULL; i++) {
|
for (i = 0; moduli[i] != NULL; i++)
|
||||||
free(moduli[i]->name);
|
free_moduli_element(moduli[i]);
|
||||||
der_free_heim_integer(&moduli[i]->p);
|
|
||||||
der_free_heim_integer(&moduli[i]->g);
|
|
||||||
der_free_heim_integer(&moduli[i]->q);
|
|
||||||
free(moduli[i]);
|
|
||||||
}
|
|
||||||
free(moduli);
|
free(moduli);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2236,29 +2241,33 @@ _krb5_parse_moduli(krb5_context context, const char *file,
|
|||||||
buf[strcspn(buf, "\n")] = '\0';
|
buf[strcspn(buf, "\n")] = '\0';
|
||||||
lineno++;
|
lineno++;
|
||||||
|
|
||||||
m2 = realloc(m, (n + 2) * sizeof(m[0]));
|
|
||||||
if (m2 == NULL) {
|
|
||||||
_krb5_free_moduli(m);
|
|
||||||
return krb5_enomem(context);
|
|
||||||
}
|
|
||||||
m = m2;
|
|
||||||
|
|
||||||
m[n] = NULL;
|
|
||||||
|
|
||||||
ret = _krb5_parse_moduli_line(context, file, lineno, buf, &element);
|
ret = _krb5_parse_moduli_line(context, file, lineno, buf, &element);
|
||||||
if (ret) {
|
if (ret)
|
||||||
_krb5_free_moduli(m);
|
break;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
if (element == NULL)
|
if (element == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
m2 = realloc(m, (n + 2) * sizeof(m[0]));
|
||||||
|
if (m2 == NULL) {
|
||||||
|
free_moduli_element(element);
|
||||||
|
ret = krb5_enomem(context);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
m = m2;
|
||||||
|
|
||||||
m[n] = element;
|
m[n] = element;
|
||||||
m[n + 1] = NULL;
|
m[n + 1] = NULL;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
if (ret) {
|
||||||
|
_krb5_free_moduli(m);
|
||||||
|
m = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
*moduli = m;
|
*moduli = m;
|
||||||
return 0;
|
|
||||||
|
(void) fclose(f);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
|
KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
|
||||||
|
Reference in New Issue
Block a user