Make _krb5_n_fold return a error code. Prompted by patch of Charles Longeau.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@21736 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2007-07-31 15:48:37 +00:00
parent 015e358ad6
commit 9f15cdccf2

View File

@@ -34,19 +34,21 @@
RCSID("$Id$"); RCSID("$Id$");
static void static krb5_error_code
rr13(unsigned char *buf, size_t len) rr13(unsigned char *buf, size_t len)
{ {
unsigned char *tmp; unsigned char *tmp;
int bytes = (len + 7) / 8; int bytes = (len + 7) / 8;
int i; int i;
if(len == 0) if(len == 0)
return; return 0;
{ {
const int bits = 13 % len; const int bits = 13 % len;
const int lbit = len % 8; const int lbit = len % 8;
tmp = malloc(bytes); tmp = malloc(bytes);
if (tmp == NULL)
return ENOMEM;
memcpy(tmp, buf, bytes); memcpy(tmp, buf, bytes);
if(lbit) { if(lbit) {
/* pad final byte with inital bits */ /* pad final byte with inital bits */
@@ -75,6 +77,7 @@ rr13(unsigned char *buf, size_t len)
} }
free(tmp); free(tmp);
} }
return 0;
} }
/* Add `b' to `a', both beeing one's complement numbers. */ /* Add `b' to `a', both beeing one's complement numbers. */
@@ -95,22 +98,28 @@ add1(unsigned char *a, unsigned char *b, size_t len)
} }
} }
void KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_FUNCTION
_krb5_n_fold(const void *str, size_t len, void *key, size_t size) _krb5_n_fold(const void *str, size_t len, void *key, size_t size)
{ {
/* if len < size we need at most N * len bytes, ie < 2 * size; /* if len < size we need at most N * len bytes, ie < 2 * size;
if len > size we need at most 2 * len */ if len > size we need at most 2 * len */
krb5_error_code ret = 0;
size_t maxlen = 2 * max(size, len); size_t maxlen = 2 * max(size, len);
size_t l = 0; size_t l = 0;
unsigned char *tmp = malloc(maxlen); unsigned char *tmp = malloc(maxlen);
unsigned char *buf = malloc(len); unsigned char *buf = malloc(len);
if (tmp == NULL || buf == NULL)
return ENOMEM;
memcpy(buf, str, len); memcpy(buf, str, len);
memset(key, 0, size); memset(key, 0, size);
do { do {
memcpy(tmp + l, buf, len); memcpy(tmp + l, buf, len);
l += len; l += len;
rr13(buf, len * 8); ret = rr13(buf, len * 8);
if (ret)
goto out;
while(l >= size) { while(l >= size) {
add1(key, tmp, size); add1(key, tmp, size);
l -= size; l -= size;
@@ -119,8 +128,10 @@ _krb5_n_fold(const void *str, size_t len, void *key, size_t size)
memmove(tmp, tmp + size, l); memmove(tmp, tmp + size, l);
} }
} while(l != 0); } while(l != 0);
out:
memset(buf, 0, len); memset(buf, 0, len);
free(buf); free(buf);
memset(tmp, 0, maxlen); memset(tmp, 0, maxlen);
free(tmp); free(tmp);
return ret;
} }