]> granicus.if.org Git - postgresql/commitdiff
Tighten up SJIS byte sequence check. Now we reject invalid SJIS byte
authorTatsuo Ishii <ishii@postgresql.org>
Sat, 4 Mar 2006 11:10:44 +0000 (11:10 +0000)
committerTatsuo Ishii <ishii@postgresql.org>
Sat, 4 Mar 2006 11:10:44 +0000 (11:10 +0000)
sequence such as "0x95 0x27". Patches from Akio Ishida.

src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c

index 3b215b2c4fb8e023b0ef0fa08060a79003047dc1..6948d19618b4d6a895ba6aebc41de011555644c9 100644 (file)
@@ -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)
                        {