diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 724503e9c4c188b5b051d3b6a600e7f7d4d1e471..e48baa2cbfdfde4baafcd5a0dbbbc67a55c2fbb7 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.139 2003/05/28 16:03:59 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.140 2003/07/17 20:52:36 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -2651,9 +2651,6 @@ static unsigned char * convert_string_datum(Datum value, Oid typid) { char *val; - char *xfrmstr; - size_t xfrmsize; - size_t xfrmlen; switch (typid) { @@ -2693,17 +2690,21 @@ convert_string_datum(Datum value, Oid typid) if (!lc_collate_is_c()) { - /* Guess that transformed string is not much bigger than original */ - xfrmsize = strlen(val) + 32; /* arbitrary pad value here... */ - xfrmstr = (char *) palloc(xfrmsize); - xfrmlen = strxfrm(xfrmstr, val, xfrmsize); - if (xfrmlen >= xfrmsize) - { - /* Oops, didn't make it */ - pfree(xfrmstr); - xfrmstr = (char *) palloc(xfrmlen + 1); - xfrmlen = strxfrm(xfrmstr, val, xfrmlen + 1); - } + char *xfrmstr; + size_t xfrmlen; + size_t xfrmlen2; + + /* + * Note: originally we guessed at a suitable output buffer size, + * and only needed to call strxfrm twice if our guess was too small. + * However, it seems that some versions of Solaris have buggy + * strxfrm that can write past the specified buffer length in that + * scenario. So, do it the dumb way for portability. + */ + xfrmlen = strxfrm(NULL, val, 0); + xfrmstr = (char *) palloc(xfrmlen + 1); + xfrmlen2 = strxfrm(xfrmstr, val, xfrmlen + 1); + Assert(xfrmlen2 == xfrmlen); pfree(val); val = xfrmstr; }