Get list of credential uuids and stuff them into the cursor and
itereate of them in get_next and free the cursor in end_get(). git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@24008 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -51,9 +51,16 @@ typedef struct krb5_kcmcache {
|
|||||||
char *door_path;
|
char *door_path;
|
||||||
} krb5_kcmcache;
|
} krb5_kcmcache;
|
||||||
|
|
||||||
|
typedef struct krb5_kcm_cursor {
|
||||||
|
unsigned long offset;
|
||||||
|
unsigned long length;
|
||||||
|
uuid_t *uuids;
|
||||||
|
} *krb5_kcm_cursor;
|
||||||
|
|
||||||
|
|
||||||
#define KCMCACHE(X) ((krb5_kcmcache *)(X)->data.data)
|
#define KCMCACHE(X) ((krb5_kcmcache *)(X)->data.data)
|
||||||
#define CACHENAME(X) (KCMCACHE(X)->name)
|
#define CACHENAME(X) (KCMCACHE(X)->name)
|
||||||
#define KCMCURSOR(C) (*(uint32_t *)(C))
|
#define KCMCURSOR(C) ((krb5_kcm_cursor)(C))
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
try_door(krb5_context context,
|
try_door(krb5_context context,
|
||||||
@@ -610,10 +617,10 @@ kcm_get_first (krb5_context context,
|
|||||||
krb5_cc_cursor *cursor)
|
krb5_cc_cursor *cursor)
|
||||||
{
|
{
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
|
krb5_kcm_cursor c;
|
||||||
krb5_kcmcache *k = KCMCACHE(id);
|
krb5_kcmcache *k = KCMCACHE(id);
|
||||||
krb5_storage *request, *response;
|
krb5_storage *request, *response;
|
||||||
krb5_data response_data;
|
krb5_data response_data;
|
||||||
int32_t tmp;
|
|
||||||
|
|
||||||
ret = kcm_storage_request(context, KCM_OP_GET_FIRST, &request);
|
ret = kcm_storage_request(context, KCM_OP_GET_FIRST, &request);
|
||||||
if (ret)
|
if (ret)
|
||||||
@@ -626,27 +633,50 @@ kcm_get_first (krb5_context context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret = kcm_call(context, k, request, &response, &response_data);
|
ret = kcm_call(context, k, request, &response, &response_data);
|
||||||
if (ret) {
|
|
||||||
krb5_storage_free(request);
|
krb5_storage_free(request);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
c = calloc(1, sizeof(*c));
|
||||||
|
if (c == NULL) {
|
||||||
|
ret = ENOMEM;
|
||||||
|
krb5_set_error_message(context, ret,
|
||||||
|
N_("malloc: out of memory", ""));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = krb5_ret_int32(response, &tmp);
|
do {
|
||||||
if (ret || tmp < 0)
|
ssize_t sret;
|
||||||
ret = KRB5_CC_IO;
|
uuid_t uuid;
|
||||||
|
void *ptr;
|
||||||
|
|
||||||
|
sret = krb5_storage_read(response, &uuid, sizeof(uuid));
|
||||||
|
if (sret != sizeof(uuid)) {
|
||||||
|
ret = EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = realloc(c->uuids, sizeof(c->uuids[0]) * (c->length + 1));
|
||||||
|
if (ptr == NULL) {
|
||||||
|
free(c->uuids);
|
||||||
|
free(c);
|
||||||
|
krb5_clear_error_message(context);
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
c->uuids = ptr;
|
||||||
|
|
||||||
|
memcpy(&c->uuids[c->length], &uuid, sizeof(uuid));
|
||||||
|
c->length += 1;
|
||||||
|
|
||||||
|
} while (ret == 0);
|
||||||
|
|
||||||
krb5_storage_free(request);
|
|
||||||
krb5_storage_free(response);
|
krb5_storage_free(response);
|
||||||
krb5_data_free(&response_data);
|
krb5_data_free(&response_data);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
*cursor = malloc(sizeof(tmp));
|
*cursor = c;
|
||||||
if (*cursor == NULL)
|
|
||||||
return KRB5_CC_NOMEM;
|
|
||||||
|
|
||||||
KCMCURSOR(*cursor) = tmp;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -667,9 +697,15 @@ kcm_get_next (krb5_context context,
|
|||||||
{
|
{
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
krb5_kcmcache *k = KCMCACHE(id);
|
krb5_kcmcache *k = KCMCACHE(id);
|
||||||
|
krb5_kcm_cursor c = KCMCURSOR(*cursor);
|
||||||
krb5_storage *request, *response;
|
krb5_storage *request, *response;
|
||||||
krb5_data response_data;
|
krb5_data response_data;
|
||||||
|
|
||||||
|
again:
|
||||||
|
|
||||||
|
if (c->offset >= c->length)
|
||||||
|
return KRB5_CC_END;
|
||||||
|
|
||||||
ret = kcm_storage_request(context, KCM_OP_GET_NEXT, &request);
|
ret = kcm_storage_request(context, KCM_OP_GET_NEXT, &request);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -680,23 +716,25 @@ kcm_get_next (krb5_context context,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = krb5_store_int32(request, KCMCURSOR(*cursor));
|
ret = krb5_storage_write(request,
|
||||||
|
&c->uuids[c->offset],
|
||||||
|
sizeof(c->uuids[c->offset]));
|
||||||
|
c->offset++;
|
||||||
if (ret) {
|
if (ret) {
|
||||||
krb5_storage_free(request);
|
krb5_storage_free(request);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = kcm_call(context, k, request, &response, &response_data);
|
ret = kcm_call(context, k, request, &response, &response_data);
|
||||||
if (ret) {
|
|
||||||
krb5_storage_free(request);
|
krb5_storage_free(request);
|
||||||
return ret;
|
if (ret == KRB5_CC_END) {
|
||||||
|
goto again;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = krb5_ret_creds(response, creds);
|
ret = krb5_ret_creds(response, creds);
|
||||||
if (ret)
|
if (ret)
|
||||||
ret = KRB5_CC_IO;
|
ret = KRB5_CC_IO;
|
||||||
|
|
||||||
krb5_storage_free(request);
|
|
||||||
krb5_storage_free(response);
|
krb5_storage_free(response);
|
||||||
krb5_data_free(&response_data);
|
krb5_data_free(&response_data);
|
||||||
|
|
||||||
@@ -718,6 +756,7 @@ kcm_end_get (krb5_context context,
|
|||||||
{
|
{
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
krb5_kcmcache *k = KCMCACHE(id);
|
krb5_kcmcache *k = KCMCACHE(id);
|
||||||
|
krb5_kcm_cursor c = KCMCURSOR(*cursor);
|
||||||
krb5_storage *request;
|
krb5_storage *request;
|
||||||
|
|
||||||
ret = kcm_storage_request(context, KCM_OP_END_GET, &request);
|
ret = kcm_storage_request(context, KCM_OP_END_GET, &request);
|
||||||
@@ -730,22 +769,14 @@ kcm_end_get (krb5_context context,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = krb5_store_int32(request, KCMCURSOR(*cursor));
|
|
||||||
if (ret) {
|
|
||||||
krb5_storage_free(request);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = kcm_call(context, k, request, NULL, NULL);
|
ret = kcm_call(context, k, request, NULL, NULL);
|
||||||
if (ret) {
|
|
||||||
krb5_storage_free(request);
|
krb5_storage_free(request);
|
||||||
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
krb5_storage_free(request);
|
free(c->uuids);
|
||||||
|
free(c);
|
||||||
|
|
||||||
KCMCURSOR(*cursor) = 0;
|
|
||||||
free(*cursor);
|
|
||||||
*cursor = NULL;
|
*cursor = NULL;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user