From 8ccc7dfaf1719a9a48fc8aefe064fd1dbfa36eac Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Sat, 4 Mar 2006 11:10:44 +0000 Subject: [PATCH] Tighten up SJIS byte sequence check. Now we reject invalid SJIS byte sequence such as "0x95 0x27". Patches from Akio Ishida. --- .../euc_jp_and_sjis/euc_jp_and_sjis.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c b/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c index 3b215b2c4fb..6948d19618b 100644 --- a/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c +++ b/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c,v 1.13 2005/10/15 02:49:34 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c,v 1.13.2.1 2006/03/04 11:10:44 ishii Exp $ * *------------------------------------------------------------------------- */ @@ -22,6 +22,9 @@ #define PGSJISALTCODE 0x81ac #define PGEUCALTCODE 0xa2ae +#define ISSJISHEAD(c) ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)) +#define ISSJISTAIL(c) ((c >= 0x40 && c <= 0x7e) || (c >= 0x80 && c <= 0xfc)) + /* * conversion table between SJIS UDC (IBM kanji) and EUC_JP */ @@ -186,6 +189,11 @@ sjis2mic(unsigned char *sjis, unsigned char *p, int len) * JIS X0208, X0212, user defined extended characters */ c2 = *sjis++; + if (!ISSJISHEAD(c1) || !ISSJISTAIL(c2)) + ereport(ERROR, + (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), + errmsg("invalid byte sequence for encoding \"SJIS\": 0x%02x%02x", + c1, c2))); k = (c1 << 8) + c2; /* Eiji Tokuya patched begin */ if (k >= 0xed40 && k < 0xf040) @@ -561,6 +569,11 @@ sjis2euc_jp(unsigned char *sjis, unsigned char *p, int len) * JIS X0208, X0212, user defined extended characters */ c2 = *sjis++; + if (!ISSJISHEAD(c1) || !ISSJISTAIL(c2)) + ereport(ERROR, + (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), + errmsg("invalid byte sequence for encoding \"SJIS\": 0x%02x%02x", + c1, c2))); k = (c1 << 8) + c2; if (k >= 0xed40 && k < 0xf040) {