summaryrefslogtreecommitdiffstats
path: root/src/lib/gssapi/generic
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2014-03-10 23:01:40 -0400
committerGreg Hudson <ghudson@mit.edu>2014-03-18 11:58:50 -0400
commit23a378046bd8122839e501b3e47bb807b66e1c03 (patch)
tree1bcbee8c712ef83f410bbd7f2a7ee37d1792cde7 /src/lib/gssapi/generic
parent40b105e2e6637d370025b4433dc9e1bda5d3950a (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.h35
-rw-r--r--src/lib/gssapi/generic/t_seqstate.c10
-rw-r--r--src/lib/gssapi/generic/util_ordering.c64
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;
}