From 0d7f51ef207cb22f37f2821e8151b894e9b31eca Mon Sep 17 00:00:00 2001 From: Quanah Gibson-Mount Date: Sat, 1 Nov 2008 00:35:21 +0000 Subject: [PATCH] ITS#5699 --- CHANGES | 1 + libraries/liblutil/utils.c | 17 +++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index bec65ffda2..c01f80529d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,7 @@ OpenLDAP 2.4 Change Log OpenLDAP 2.4.13 Engineering + Fixed liblutil hex conversion (ITS#5699) Fixed slapd-bdb/hdb invalid db crash (ITS#5698) OpenLDAP 2.4.12 Release (2008/10/12) diff --git a/libraries/liblutil/utils.c b/libraries/liblutil/utils.c index 8a199f85dd..ff37d417a0 100644 --- a/libraries/liblutil/utils.c +++ b/libraries/liblutil/utils.c @@ -695,7 +695,6 @@ lutil_str2bin( struct berval *in, struct berval *out, void *ctx ) { char *pin, *pout, ctmp; char *end; - long l; int i, chunk, len, rc = 0, hex = 0; if ( !out || !out->bv_val || out->bv_len < in->bv_len ) return -1; @@ -718,38 +717,40 @@ lutil_str2bin( struct berval *in, struct berval *out, void *ctx ) } if ( hex ) { #define HEXMAX (2 * sizeof(long)) + unsigned long l; /* Convert a longword at a time, but handle leading * odd bytes first */ - chunk = len & (HEXMAX-1); + chunk = len % HEXMAX; if ( !chunk ) chunk = HEXMAX; while ( len ) { + int ochunk; ctmp = pin[chunk]; pin[chunk] = '\0'; errno = 0; - l = strtol( pin, &end, 16 ); + l = strtoul( pin, &end, 16 ); pin[chunk] = ctmp; if ( errno ) return -1; - chunk++; - chunk >>= 1; - for ( i = chunk; i>=0; i-- ) { + ochunk = (chunk + 1)/2; + for ( i = ochunk - 1; i >= 0; i-- ) { pout[i] = l & 0xff; l >>= 8; } pin += chunk; - pout += sizeof(long); + pout += ochunk; len -= chunk; chunk = HEXMAX; } - out->bv_len = pout + len - out->bv_val; + out->bv_len = pout - out->bv_val; } else { /* Decimal */ char tmpbuf[64], *tmp; lutil_int_decnum num; int neg = 0; + long l; len = in->bv_len; pin = in->bv_val; -- 2.39.5