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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user