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
	 Nicolas Williams
					Nicolas Williams