diff options
| author | Greg Hudson <ghudson@mit.edu> | 2014-03-10 23:01:40 -0400 |
|---|---|---|
| committer | Greg Hudson <ghudson@mit.edu> | 2014-03-18 11:58:50 -0400 |
| commit | 23a378046bd8122839e501b3e47bb807b66e1c03 (patch) | |
| tree | 1bcbee8c712ef83f410bbd7f2a7ee37d1792cde7 /src/lib/gssapi/generic | |
| parent | 40b105e2e6637d370025b4433dc9e1bda5d3950a (diff) | |
Improve internal API for GSS sequence numbers
Use an opaque structure type instead of a void pointer for the
sequence number state. Rename all functions to use a g_seqstate
prefix rather than a mix of g_order and g_queue. Remove the
unneccessary indirection from the state object parameter in
g_seqstate_check and g_seqstate_free. Return OM_uint32 where we
return a GSS major code, long where we return an errno value, and void
where we can't fail.
Diffstat (limited to 'src/lib/gssapi/generic')
| -rw-r--r-- | src/lib/gssapi/generic/gssapiP_generic.h | 35 | ||||
| -rw-r--r-- | src/lib/gssapi/generic/t_seqstate.c | 10 | ||||
| -rw-r--r-- | src/lib/gssapi/generic/util_ordering.c | 64 |
3 files changed, 50 insertions, 59 deletions
diff --git a/src/lib/gssapi/generic/gssapiP_generic.h b/src/lib/gssapi/generic/gssapiP_generic.h index 16da0fb83..5e321867c 100644 --- a/src/lib/gssapi/generic/gssapiP_generic.h +++ b/src/lib/gssapi/generic/gssapiP_generic.h @@ -109,12 +109,12 @@ #define g_verify_token_header gssint_g_verify_token_header #define g_display_major_status gssint_g_display_major_status #define g_display_com_err_status gssint_g_display_com_err_status -#define g_order_init gssint_g_order_init -#define g_order_check gssint_g_order_check -#define g_order_free gssint_g_order_free -#define g_queue_size gssint_g_queue_size -#define g_queue_externalize gssint_g_queue_externalize -#define g_queue_internalize gssint_g_queue_internalize +#define g_seqstate_init gssint_g_seqstate_init +#define g_seqstate_check gssint_g_seqstate_check +#define g_seqstate_free gssint_g_seqstate_free +#define g_seqstate_size gssint_g_seqstate_size +#define g_seqstate_externalize gssint_g_seqstate_externalize +#define g_seqstate_internalize gssint_g_seqstate_internalize #define g_canonicalize_host gssint_g_canonicalize_host #define g_local_host_name gssint_g_local_host_name #define g_strdup gssint_g_strdup @@ -126,6 +126,8 @@ typedef struct { } g_set; #define G_SET_INIT { K5_MUTEX_PARTIAL_INITIALIZER, 0 } +typedef struct g_seqnum_state_st *g_seqnum_state; + int g_set_init (g_set_elt *s); int g_set_destroy (g_set_elt *s); int g_set_entry_add (g_set_elt *s, void *key, void *value); @@ -172,18 +174,15 @@ OM_uint32 g_display_com_err_status (OM_uint32 *minor_status, OM_uint32 status_value, gss_buffer_t status_string); -gss_int32 g_order_init (void **queue, uint64_t seqnum, - int do_replay, int do_sequence, int wide); - -gss_int32 g_order_check (void **queue, uint64_t seqnum); - -void g_order_free (void **queue); - -gss_uint32 g_queue_size(void *vqueue, size_t *sizep); -gss_uint32 g_queue_externalize(void *vqueue, unsigned char **buf, - size_t *lenremain); -gss_uint32 g_queue_internalize(void **vqueue, unsigned char **buf, - size_t *lenremain); +long g_seqstate_init(g_seqnum_state *state_out, uint64_t seqnum, + int do_replay, int do_sequence, int wide); +OM_uint32 g_seqstate_check(g_seqnum_state state, uint64_t seqnum); +void g_seqstate_free(g_seqnum_state state); +void g_seqstate_size(g_seqnum_state state, size_t *sizep); +long g_seqstate_externalize(g_seqnum_state state, unsigned char **buf, + size_t *lenremain); +long g_seqstate_internalize(g_seqnum_state *state_out, unsigned char **buf, + size_t *lenremain); char *g_strdup (char *str); diff --git a/src/lib/gssapi/generic/t_seqstate.c b/src/lib/gssapi/generic/t_seqstate.c index 6be4b2e82..c7250b9ad 100644 --- a/src/lib/gssapi/generic/t_seqstate.c +++ b/src/lib/gssapi/generic/t_seqstate.c @@ -160,7 +160,7 @@ main() size_t i, j; enum width w; struct test *t; - void *seqstate; + g_seqnum_state seqstate; OM_uint32 status; for (i = 0; i < sizeof(tests) / sizeof(*tests); i++) { @@ -169,18 +169,18 @@ main() for (w = NARROW; w <= WIDE; w++) { if (t->wide_seqnums != BOTH && t->wide_seqnums != w) continue; - if (g_order_init(&seqstate, t->initial, t->do_replay, - t->do_sequence, w)) + if (g_seqstate_init(&seqstate, t->initial, t->do_replay, + t->do_sequence, w)) abort(); for (j = 0; j < t->nseqs; j++) { - status = g_order_check(&seqstate, t->seqs[j].seqnum); + status = g_seqstate_check(seqstate, t->seqs[j].seqnum); if (status != t->seqs[j].result) { fprintf(stderr, "Test %d seq %d failed: %d != %d\n", (int)i, (int)j, status, t->seqs[j].result); return 1; } } - g_order_free(&seqstate); + g_seqstate_free(seqstate); } } diff --git a/src/lib/gssapi/generic/util_ordering.c b/src/lib/gssapi/generic/util_ordering.c index 22c6be2e3..d6feed10d 100644 --- a/src/lib/gssapi/generic/util_ordering.c +++ b/src/lib/gssapi/generic/util_ordering.c @@ -34,7 +34,7 @@ #define QUEUE_LENGTH 20 -typedef struct _queue { +typedef struct g_seqnum_state_st { int do_replay; int do_sequence; int start; @@ -88,9 +88,9 @@ queue_insert(queue *q, int after, uint64_t seqnum) } } -gss_int32 -g_order_init(void **vqueue, uint64_t seqnum, - int do_replay, int do_sequence, int wide_nums) +long +g_seqstate_init(g_seqnum_state *state_out, uint64_t seqnum, + int do_replay, int do_sequence, int wide_nums) { queue *q; @@ -112,19 +112,16 @@ g_order_init(void **vqueue, uint64_t seqnum, q->firstnum = seqnum; q->elem[q->start] = ((uint64_t)0 - 1) & q->mask; - *vqueue = (void *) q; + *state_out = q; return(0); } -gss_int32 -g_order_check(void **vqueue, uint64_t seqnum) +OM_uint32 +g_seqstate_check(g_seqnum_state q, uint64_t seqnum) { - queue *q; int i; uint64_t expected; - q = (queue *) (*vqueue); - if (!q->do_replay && !q->do_sequence) return(GSS_S_COMPLETE); @@ -217,51 +214,46 @@ g_order_check(void **vqueue, uint64_t seqnum) } void -g_order_free(void **vqueue) +g_seqstate_free(g_seqnum_state q) { - queue *q; - - q = (queue *) (*vqueue); - free(q); - - *vqueue = NULL; } /* * These support functions are for the serialization routines */ -gss_uint32 -g_queue_size(void *vqueue, size_t *sizep) +void +g_seqstate_size(g_seqnum_state q, size_t *sizep) { - *sizep += sizeof(queue); - return 0; + *sizep += sizeof(*q); } -gss_uint32 -g_queue_externalize(void *vqueue, unsigned char **buf, size_t *lenremain) +long +g_seqstate_externalize(g_seqnum_state q, unsigned char **buf, + size_t *lenremain) { - if (*lenremain < sizeof(queue)) + if (*lenremain < sizeof(*q)) return ENOMEM; - memcpy(*buf, vqueue, sizeof(queue)); - *buf += sizeof(queue); - *lenremain -= sizeof(queue); + memcpy(*buf, q, sizeof(*q)); + *buf += sizeof(*q); + *lenremain -= sizeof(*q); return 0; } -gss_uint32 -g_queue_internalize(void **vqueue, unsigned char **buf, size_t *lenremain) +long +g_seqstate_internalize(g_seqnum_state *state_out, unsigned char **buf, + size_t *lenremain) { - void *q; + queue *q; - if (*lenremain < sizeof(queue)) + if (*lenremain < sizeof(*q)) return EINVAL; - if ((q = malloc(sizeof(queue))) == 0) + if ((q = malloc(sizeof(*q))) == 0) return ENOMEM; - memcpy(q, *buf, sizeof(queue)); - *buf += sizeof(queue); - *lenremain -= sizeof(queue); - *vqueue = q; + memcpy(q, *buf, sizeof(*q)); + *buf += sizeof(*q); + *lenremain -= sizeof(*q); + *state_out = q; return 0; } |
