diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2001-03-08 00:24:34 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2001-03-08 00:24:34 +0000 |
commit | 572fda27118f7e54c7e4ebb75b48d33896e5f776 (patch) | |
tree | 744a314265185c7d65b9e7ebfca3c28c608409d7 /src/backend/utils/mb/mbutils.c | |
parent | b109b03feaec96aab6c635137b5a668389df8d31 (diff) | |
download | postgresql-572fda27118f7e54c7e4ebb75b48d33896e5f776.tar.gz postgresql-572fda27118f7e54c7e4ebb75b48d33896e5f776.zip |
Modify wchar conversion routines to not fetch the next byte past the end
of a counted input string. Marinos Yannikos' recent crash report turns
out to be due to applying pg_ascii2wchar_with_len to a TEXT object that
is smack up against the end of memory. This is the second just-barely-
reproducible bug report I have seen that traces to some bit of code
fetching one more byte than it is allowed to. Let's be more careful
out there, boys and girls.
While at it, I changed the code to not risk a similar crash when there
is a truncated multibyte character at the end of an input string. The
output in this case might not be the most reasonable output possible;
if anyone wants to improve it further, step right up...
Diffstat (limited to 'src/backend/utils/mb/mbutils.c')
-rw-r--r-- | src/backend/utils/mb/mbutils.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c index 0d3d8cb69bd..2abae59d62b 100644 --- a/src/backend/utils/mb/mbutils.c +++ b/src/backend/utils/mb/mbutils.c @@ -3,7 +3,7 @@ * client encoding and server internal encoding. * (currently mule internal code (mic) is used) * Tatsuo Ishii - * $Id: mbutils.c,v 1.15 2001/02/10 02:31:27 tgl Exp $ + * $Id: mbutils.c,v 1.16 2001/03/08 00:24:34 tgl Exp $ */ #include "postgres.h" @@ -230,7 +230,7 @@ pg_mbstrlen_with_len(const unsigned char *mbstr, int limit) int len = 0; int l; - while (*mbstr && limit > 0) + while (limit > 0 && *mbstr) { l = pg_mblen(mbstr); limit -= l; @@ -252,7 +252,7 @@ pg_mbcliplen(const unsigned char *mbstr, int len, int limit) int clen = 0; int l; - while (*mbstr && len > 0) + while (len > 0 && *mbstr) { l = pg_mblen(mbstr); if ((clen + l) > limit) @@ -267,7 +267,7 @@ pg_mbcliplen(const unsigned char *mbstr, int len, int limit) } /* - * fuctions for utils/init + * functions for utils/init */ static int DatabaseEncoding = MULTIBYTE; |