kadm5: Make kadm5_get_principals() not quadratic
This commit is contained in:
@@ -39,17 +39,27 @@ struct foreach_data {
|
|||||||
const char *exp;
|
const char *exp;
|
||||||
char *exp2;
|
char *exp2;
|
||||||
char **princs;
|
char **princs;
|
||||||
int count;
|
size_t nalloced;
|
||||||
|
size_t count;
|
||||||
};
|
};
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
add_princ(krb5_context context, struct foreach_data *d, char *princ)
|
add_princ(krb5_context context, struct foreach_data *d, char *princ)
|
||||||
{
|
{
|
||||||
char **tmp;
|
|
||||||
tmp = realloc(d->princs, (d->count + 1) * sizeof(*tmp));
|
if (d->count == INT_MAX)
|
||||||
if (tmp == NULL)
|
return ERANGE;
|
||||||
return krb5_enomem(context);
|
if (d->nalloced == d->count) {
|
||||||
d->princs = tmp;
|
size_t n = d->nalloced + (d->nalloced >> 1) + 128; /* No O(N^2) pls */
|
||||||
|
char **tmp;
|
||||||
|
|
||||||
|
if (SIZE_MAX / sizeof(*tmp) <= n)
|
||||||
|
return ERANGE;
|
||||||
|
if ((tmp = realloc(d->princs, n * sizeof(*tmp))) == NULL)
|
||||||
|
return krb5_enomem(context);
|
||||||
|
d->princs = tmp;
|
||||||
|
d->nalloced = n;
|
||||||
|
}
|
||||||
d->princs[d->count++] = princ;
|
d->princs[d->count++] = princ;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -109,16 +119,20 @@ kadm5_s_get_principals(void *server_handle,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
d.princs = NULL;
|
d.princs = NULL;
|
||||||
|
d.nalloced = 0;
|
||||||
d.count = 0;
|
d.count = 0;
|
||||||
ret = hdb_foreach(context->context, context->db, HDB_F_ADMIN_DATA, foreach, &d);
|
ret = hdb_foreach(context->context, context->db, HDB_F_ADMIN_DATA, foreach, &d);
|
||||||
|
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = add_princ(context->context, &d, NULL);
|
ret = add_princ(context->context, &d, NULL);
|
||||||
if (ret == 0){
|
if (d.count >= INT_MAX)
|
||||||
|
*count = INT_MAX;
|
||||||
|
else
|
||||||
|
*count = d.count - 1;
|
||||||
|
if (ret == 0)
|
||||||
*princs = d.princs;
|
*princs = d.princs;
|
||||||
*count = d.count - 1;
|
else
|
||||||
} else
|
kadm5_free_name_list(context, d.princs, count);
|
||||||
kadm5_free_name_list(context, d.princs, &d.count);
|
|
||||||
free(d.exp2);
|
free(d.exp2);
|
||||||
out:
|
out:
|
||||||
if (!context->keep_open)
|
if (!context->keep_open)
|
||||||
|
Reference in New Issue
Block a user