Commit 343a9a27 authored by Magnus Hagander's avatar Magnus Hagander

Check return code from strxfrm on Windows since it has a

non-standard way of indicating errors, so we don't try to
allocate INT_MAX bytes to store a result in.
parent 4835df30
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.233 2007/04/21 21:01:45 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.234 2007/05/05 17:05:48 mha Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -3137,6 +3137,10 @@ convert_string_datum(Datum value, Oid typid) ...@@ -3137,6 +3137,10 @@ convert_string_datum(Datum value, Oid typid)
* from the second call than the first; thus the Assert must be <= not * from the second call than the first; thus the Assert must be <= not
* == as you'd expect. Can't any of these people program their way * == as you'd expect. Can't any of these people program their way
* out of a paper bag? * out of a paper bag?
*
* XXX: strxfrm doesn't support UTF-8 encoding on Win32, it can return
* bogus data or set an error. This is not really a problem unless it
* crashes since it will only give an estimation error and nothing fatal.
*/ */
#if _MSC_VER == 1400 /* VS.Net 2005 */ #if _MSC_VER == 1400 /* VS.Net 2005 */
...@@ -3151,6 +3155,15 @@ convert_string_datum(Datum value, Oid typid) ...@@ -3151,6 +3155,15 @@ convert_string_datum(Datum value, Oid typid)
} }
#else #else
xfrmlen = strxfrm(NULL, val, 0); xfrmlen = strxfrm(NULL, val, 0);
#endif
#ifdef WIN32
/*
* On Windows, strxfrm returns INT_MAX when an error occurs. Instead of
* trying to allocate this much memory (and fail), just return the
* original string unmodified as if we were in the C locale.
*/
if (xfrmlen == INT_MAX)
return val;
#endif #endif
xfrmstr = (char *) palloc(xfrmlen + 1); xfrmstr = (char *) palloc(xfrmlen + 1);
xfrmlen2 = strxfrm(xfrmstr, val, xfrmlen + 1); xfrmlen2 = strxfrm(xfrmstr, val, xfrmlen + 1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment