summaryrefslogtreecommitdiff
path: root/kerberosIV/kadm/kadm_stream.c
diff options
context:
space:
mode:
Diffstat (limited to 'kerberosIV/kadm/kadm_stream.c')
-rw-r--r--kerberosIV/kadm/kadm_stream.c316
1 files changed, 174 insertions, 142 deletions
diff --git a/kerberosIV/kadm/kadm_stream.c b/kerberosIV/kadm/kadm_stream.c
index 58f53cce124..9f10aa45e1b 100644
--- a/kerberosIV/kadm/kadm_stream.c
+++ b/kerberosIV/kadm/kadm_stream.c
@@ -1,3 +1,4 @@
+/* $OpenBSD: kadm_stream.c,v 1.4 1997/12/12 10:02:47 art Exp $ */
/* $KTH: kadm_stream.c,v 1.11 1997/05/02 10:28:05 joda Exp $ */
/*
@@ -26,16 +27,17 @@ or implied warranty.
*/
/*
- kadm_stream.c
- this holds the stream support routines for the kerberos administration server
-
- vals_to_stream: converts a vals struct to a stream for transmission
- internals build_field_header, vts_[string, char, long, short]
- stream_to_vals: converts a stream to a vals struct
- internals check_field_header, stv_[string, char, long, short]
- error: prints out a kadm error message, returns
- fatal: prints out a kadm fatal error message, exits
-*/
+ * kadm_stream.c
+ * this holds the stream support routines for the kerberos administration
+ * server
+ *
+ * vals_to_stream: converts a vals struct to a stream for transmission
+ * internals build_field_header, vts_[string, char, long, short]
+ * stream_to_vals: converts a stream to a vals struct
+ * internals check_field_header, stv_[string, char, long, short]
+ * error: prints out a kadm error message, returns
+ * fatal: prints out a kadm fatal error message, exits
+ */
#include "kadm_locl.h"
@@ -44,9 +46,11 @@ build_field_header(u_char *cont, u_char **st)
/* container for fields data */
/* stream */
{
- *st = (u_char *) malloc (4);
- memcpy(*st, cont, 4);
- return 4; /* return pointer to current stream location */
+ *st = (u_char *) malloc (4);
+ if (st == NULL)
+ return -1;
+ memcpy(*st, cont, 4);
+ return 4; /* return pointer to current stream location */
}
static int
@@ -55,10 +59,10 @@ check_field_header(u_char *st, u_char *cont, int maxlen)
/* container for fields data */
{
- if (4 > maxlen)
- return(-1);
- memcpy(cont, st, 4);
- return 4; /* return pointer to current stream location */
+ if (maxlen < 4 || cont == NULL || st == NULL)
+ return(-1);
+ memcpy(cont, st, 4);
+ return 4; /* return pointer to current stream location */
}
int
@@ -67,9 +71,11 @@ vts_string(char *dat, u_char **st, int loc)
/* base pointer to the stream */
/* offset into the stream for current data */
{
- *st = (u_char *) realloc (*st, (unsigned) (loc + strlen(dat) + 1));
- memcpy(*st + loc, dat, strlen(dat)+1);
- return strlen(dat)+1;
+ *st = (u_char *) realloc (*st, (unsigned) (loc + strlen(dat) + 1));
+ if (*st == NULL)
+ return -1;
+ memcpy(*st + loc, dat, strlen(dat)+1);
+ return strlen(dat)+1;
}
@@ -134,18 +140,18 @@ stv_string(u_char *st, /* base pointer to the stream */
int stlen, /* max length of string to copy in */
int maxlen) /* max length of input stream */
{
- int maxcount; /* max count of chars to copy */
-
- maxcount = min(maxlen - loc, stlen);
-
- if(maxcount <= 0)
- return -1;
-
- strncpy(dat, (char *)st + loc, maxcount);
-
- if (dat[maxcount-1]) /* not null-term --> not enuf room */
- return(-1);
- return strlen(dat)+1;
+ int maxcount; /* max count of chars to copy */
+
+ maxcount = min(maxlen - loc, stlen);
+
+ if(maxcount <= 0)
+ return -1;
+
+ strncpy(dat, (char *)st + loc, maxcount);
+
+ if (dat[maxcount - 1]) /* not null-term --> not enough room */
+ return -1;
+ return strlen(dat)+1;
}
static int
@@ -155,11 +161,11 @@ stv_short(u_char *st, u_int16_t *dat, int loc, int maxlen)
/* offset into the stream for current data */
{
- if (maxlen - loc < 2)
- return -1;
-
- *dat = (st[loc] << 8) | st[loc + 1];
- return 2;
+ if (maxlen - loc < 2)
+ return -1;
+
+ *dat = (st[loc] << 8) | st[loc + 1];
+ return 2;
}
int
@@ -169,11 +175,11 @@ stv_long(u_char *st, u_int32_t *dat, int loc, int maxlen)
/* offset into the stream for current data */
/* maximum length of st */
{
- if (maxlen - loc < 4)
- return -1;
+ if (maxlen - loc < 4)
+ return -1;
- *dat = (st[loc] << 24) | (st[loc+1] << 16) | (st[loc+2] << 8) | st[loc+3];
- return 4;
+ *dat = (st[loc] << 24) | (st[loc+1] << 16) | (st[loc+2] << 8) | st[loc+3];
+ return 4;
}
static int
@@ -183,121 +189,147 @@ stv_char(u_char *st, u_char *dat, int loc, int maxlen)
/* offset into the stream for current data */
{
- if (maxlen - loc < 1)
- return -1;
+ if (maxlen - loc < 1)
+ return -1;
- *dat = st[loc];
- return 1;
+ *dat = st[loc];
+ return 1;
}
/*
-vals_to_stream
- recieves : kadm_vals *, u_char *
- returns : a realloced and filled in u_char *
-
-this function creates a byte-stream representation of the kadm_vals structure
-*/
+ * vals_to_stream
+ * recieves : kadm_vals *, u_char *
+ * returns : a realloced and filled in u_char *
+ *
+ * this function creates a byte-stream representation of the kadm_vals
+ * structure
+ */
+
int
vals_to_stream(Kadm_vals *dt_in, u_char **dt_out)
{
- int vsloop, stsize; /* loop counter, stream size */
-
- stsize = build_field_header(dt_in->fields, dt_out);
- for (vsloop=31; vsloop>=0; vsloop--)
- if (IS_FIELD(vsloop,dt_in->fields)) {
- switch (vsloop) {
- case KADM_NAME:
- stsize+=vts_string(dt_in->name, dt_out, stsize);
- break;
- case KADM_INST:
- stsize+=vts_string(dt_in->instance, dt_out, stsize);
- break;
- case KADM_EXPDATE:
- stsize+=vts_long(dt_in->exp_date, dt_out, stsize);
- break;
- case KADM_ATTR:
- stsize+=vts_short(dt_in->attributes, dt_out, stsize);
- break;
- case KADM_MAXLIFE:
- stsize+=vts_char(dt_in->max_life, dt_out, stsize);
- break;
- case KADM_DESKEY:
- stsize+=vts_long(dt_in->key_high, dt_out, stsize);
- stsize+=vts_long(dt_in->key_low, dt_out, stsize);
- break;
- default:
- break;
- }
-}
- return(stsize);
+ int vsloop, stsize, stsizetemp; /* loop counter, stream size */
+
+ stsize = build_field_header(dt_in->fields, dt_out);
+ if (stsize < 0)
+ return -1;
+
+ for (vsloop=31; vsloop>=0; vsloop--)
+ if (IS_FIELD(vsloop, dt_in->fields)) {
+ switch (vsloop) {
+ case KADM_NAME:
+ stsizetemp = vts_string(dt_in->name, dt_out, stsize);
+ if (stsizetemp < 0)
+ return -1;
+ stsize += stsizetemp;
+ break;
+ case KADM_INST:
+ stsizetemp = vts_string(dt_in->instance, dt_out, stsize);
+ if (stsizetemp < 0)
+ return -1;
+ stsize += stsizetemp;
+ break;
+ case KADM_EXPDATE:
+ stsizetemp = vts_long(dt_in->exp_date, dt_out, stsize);
+ if (stsizetemp < 0)
+ return -1;
+ stsize += stsizetemp;
+ break;
+ case KADM_ATTR:
+ stsizetemp = vts_short(dt_in->attributes, dt_out, stsize);
+ if (stsizetemp < 0)
+ return -1;
+ stsize += stsizetemp;
+ break;
+ case KADM_MAXLIFE:
+ stsizetemp = vts_char(dt_in->max_life, dt_out, stsize);
+ if (stsizetemp < 0)
+ return -1;
+ stsize += stsizetemp;
+ break;
+ case KADM_DESKEY:
+ stsizetemp = vts_long(dt_in->key_high, dt_out, stsize);
+ if (stsizetemp < 0)
+ return -1;
+ stsize += stsizetemp;
+ stsizetemp = vts_long(dt_in->key_low, dt_out, stsize);
+ if (stsizetemp < 0)
+ return -1;
+ stsize += stsizetemp;
+ break;
+ default:
+ break;
+ }
+ }
+ return(stsize);
}
/*
-stream_to_vals
- recieves : u_char *, kadm_vals *
- returns : a kadm_vals filled in according to u_char *
-
-this decodes a byte stream represntation of a vals struct into kadm_vals
-*/
+ * stream_to_vals
+ * recieves : u_char *, kadm_vals *
+ * returns : a kadm_vals filled in according to u_char *
+ *
+ * this decodes a byte stream represntation of a vals struct into kadm_vals
+ */
int
stream_to_vals(u_char *dt_in, Kadm_vals *dt_out, int maxlen)
/* max length to use */
{
- int vsloop, stsize; /* loop counter, stream size */
- int status;
-
- memset(dt_out, 0, sizeof(*dt_out));
-
- stsize = check_field_header(dt_in, dt_out->fields, maxlen);
- if (stsize < 0)
- return(-1);
- for (vsloop=31; vsloop>=0; vsloop--)
- if (IS_FIELD(vsloop,dt_out->fields))
- switch (vsloop) {
- case KADM_NAME:
- if ((status = stv_string(dt_in, dt_out->name, stsize,
- sizeof(dt_out->name), maxlen)) < 0)
- return(-1);
- stsize += status;
- break;
- case KADM_INST:
- if ((status = stv_string(dt_in, dt_out->instance, stsize,
- sizeof(dt_out->instance), maxlen)) < 0)
- return(-1);
- stsize += status;
- break;
- case KADM_EXPDATE:
- if ((status = stv_long(dt_in, &dt_out->exp_date, stsize,
- maxlen)) < 0)
- return(-1);
- stsize += status;
- break;
- case KADM_ATTR:
- if ((status = stv_short(dt_in, &dt_out->attributes, stsize,
- maxlen)) < 0)
- return(-1);
- stsize += status;
- break;
- case KADM_MAXLIFE:
- if ((status = stv_char(dt_in, &dt_out->max_life, stsize,
- maxlen)) < 0)
- return(-1);
- stsize += status;
- break;
- case KADM_DESKEY:
- if ((status = stv_long(dt_in, &dt_out->key_high, stsize,
- maxlen)) < 0)
- return(-1);
- stsize += status;
- if ((status = stv_long(dt_in, &dt_out->key_low, stsize,
- maxlen)) < 0)
- return(-1);
- stsize += status;
- break;
- default:
- break;
- }
- return stsize;
+ int vsloop, stsize; /* loop counter, stream size */
+ int status;
+
+ memset(dt_out, 0, sizeof(*dt_out));
+
+ stsize = check_field_header(dt_in, dt_out->fields, maxlen);
+ if (stsize < 0)
+ return(-1);
+ for (vsloop=31; vsloop>=0; vsloop--)
+ if (IS_FIELD(vsloop,dt_out->fields))
+ switch (vsloop) {
+ case KADM_NAME:
+ if ((status = stv_string(dt_in, dt_out->name, stsize,
+ sizeof(dt_out->name), maxlen)) < 0)
+ return(-1);
+ stsize += status;
+ break;
+ case KADM_INST:
+ if ((status = stv_string(dt_in, dt_out->instance, stsize,
+ sizeof(dt_out->instance), maxlen)) < 0)
+ return(-1);
+ stsize += status;
+ break;
+ case KADM_EXPDATE:
+ if ((status = stv_long(dt_in, &dt_out->exp_date, stsize,
+ maxlen)) < 0)
+ return(-1);
+ stsize += status;
+ break;
+ case KADM_ATTR:
+ if ((status = stv_short(dt_in, &dt_out->attributes, stsize,
+ maxlen)) < 0)
+ return(-1);
+ stsize += status;
+ break;
+ case KADM_MAXLIFE:
+ if ((status = stv_char(dt_in, &dt_out->max_life, stsize,
+ maxlen)) < 0)
+ return(-1);
+ stsize += status;
+ break;
+ case KADM_DESKEY:
+ if ((status = stv_long(dt_in, &dt_out->key_high, stsize,
+ maxlen)) < 0)
+ return(-1);
+ stsize += status;
+ if ((status = stv_long(dt_in, &dt_out->key_low, stsize,
+ maxlen)) < 0)
+ return(-1);
+ stsize += status;
+ break;
+ default:
+ break;
+ }
+ return stsize;
}