X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblunicode%2Fucstr.c;h=9246dc8edbfbe2273c745e9591a37b9beb2a7005;hb=0355abeb1a0ea471970c5313a69ce5b20916b408;hp=a8c65df8616e8de76045f0ad346dd01837e7eb69;hpb=d5e55877dcd69cefafe04e5b03e514a83c3fbd2f;p=openldap diff --git a/libraries/liblunicode/ucstr.c b/libraries/liblunicode/ucstr.c index a8c65df861..9246dc8edb 100644 --- a/libraries/liblunicode/ucstr.c +++ b/libraries/liblunicode/ucstr.c @@ -1,11 +1,21 @@ -/* - * Copyright 2000-2003 The OpenLDAP Foundation - * COPYING RESTRICTIONS APPLY. See COPYRIGHT File in top level directory - * of this package for details. +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2007 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" +#include #include #include #include @@ -100,7 +110,7 @@ struct berval * UTF8bvnormalize( { int i, j, len, clen, outpos, ucsoutlen, outsize, last; char *out, *outtmp, *s; - unsigned long *ucs, *p, *ucsout; + ac_uint4 *ucs, *p, *ucsout; static unsigned char mask[] = { 0, 0x7f, 0x1f, 0x0f, 0x07, 0x03, 0x01 }; @@ -251,6 +261,18 @@ struct berval * UTF8bvnormalize( last = i; + /* Allocate more space in out if necessary */ + if (len - i >= outsize - outpos) { + outsize += 1 + ((len - i) - (outsize - outpos)); + outtmp = (char *) realloc(out, outsize); + if (outtmp == NULL) { + free(out); + free(ucs); + return NULL; + } + out = outtmp; + } + /* s[i] is ascii */ /* finish off everything up to char before next non-ascii */ for ( i++; (i < len) && LDAP_UTF8_ISASCII(s + i); i++ ) { @@ -281,7 +303,7 @@ int UTF8bvnormcmp( { int i, l1, l2, len, ulen, res = 0; char *s1, *s2, *done; - unsigned long *ucs, *ucsout1, *ucsout2; + ac_uint4 *ucs, *ucsout1, *ucsout2; unsigned casefold = flags & LDAP_UTF8_CASEFOLD; unsigned norm1 = flags & LDAP_UTF8_ARG1NFC; @@ -361,7 +383,7 @@ int UTF8bvnormcmp( /* * XXYYZ: we convert to ucs4 even though -llunicode - * expects ucs2 in an unsigned long + * expects ucs2 in an ac_uint4 */ /* convert and normalize 1st string */ @@ -379,6 +401,7 @@ int UTF8bvnormcmp( l1 = ulen; ucs = malloc( l2 * sizeof(*ucs) ); if ( ucs == NULL ) { + free( ucsout1 ); return l1 > l2 ? 1 : -1; /* what to do??? */ } } else {