From 9f15cdccf2d8b9c66afdb4b75e32e87f8267cbed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Tue, 31 Jul 2007 15:48:37 +0000 Subject: [PATCH] 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 --- lib/krb5/n-fold.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/krb5/n-fold.c b/lib/krb5/n-fold.c index 7253c40a7..5b1e1fae3 100644 --- a/lib/krb5/n-fold.c +++ b/lib/krb5/n-fold.c @@ -34,19 +34,21 @@ RCSID("$Id$"); -static void +static krb5_error_code rr13(unsigned char *buf, size_t len) { unsigned char *tmp; int bytes = (len + 7) / 8; int i; if(len == 0) - return; + return 0; { const int bits = 13 % len; const int lbit = len % 8; tmp = malloc(bytes); + if (tmp == NULL) + return ENOMEM; memcpy(tmp, buf, bytes); if(lbit) { /* pad final byte with inital bits */ @@ -75,6 +77,7 @@ rr13(unsigned char *buf, size_t len) } free(tmp); } + return 0; } /* 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) { /* if len < size we need at most N * len bytes, ie < 2 * size; if len > size we need at most 2 * len */ + krb5_error_code ret = 0; size_t maxlen = 2 * max(size, len); size_t l = 0; unsigned char *tmp = malloc(maxlen); unsigned char *buf = malloc(len); + if (tmp == NULL || buf == NULL) + return ENOMEM; + memcpy(buf, str, len); memset(key, 0, size); do { memcpy(tmp + l, buf, len); l += len; - rr13(buf, len * 8); + ret = rr13(buf, len * 8); + if (ret) + goto out; while(l >= size) { add1(key, tmp, 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); } } while(l != 0); +out: memset(buf, 0, len); free(buf); memset(tmp, 0, maxlen); free(tmp); + return ret; }