446cf2
commit 9a99c682144bdbd40792ebf822fe9264e0376fb5
446cf2
Author: Arjun Shankar <arjun@redhat.com>
446cf2
Date:   Wed Nov 4 12:19:38 2020 +0100
446cf2
446cf2
    iconv: Accept redundant shift sequences in IBM1364 [BZ #26224]
446cf2
    
446cf2
    The IBM1364, IBM1371, IBM1388, IBM1390 and IBM1399 character sets
446cf2
    share converter logic (iconvdata/ibm1364.c) which would reject
446cf2
    redundant shift sequences when processing input in these character
446cf2
    sets.  This led to a hang in the iconv program (CVE-2020-27618).
446cf2
    
446cf2
    This commit adjusts the converter to ignore redundant shift sequences
446cf2
    and adds test cases for iconv_prog hangs that would be triggered upon
446cf2
    their rejection.  This brings the implementation in line with other
446cf2
    converters that also ignore redundant shift sequences (e.g. IBM930
446cf2
    etc., fixed in commit 692de4b3960d).
446cf2
    
446cf2
    Reviewed-by: Carlos O'Donell <carlos@redhat.com>
446cf2
446cf2
diff --git a/iconv/tst-iconv_prog.sh b/iconv/tst-iconv_prog.sh
446cf2
index 8298136b7f45d855..d8db7b335c1fcca2 100644
446cf2
--- a/iconv/tst-iconv_prog.sh
446cf2
+++ b/iconv/tst-iconv_prog.sh
446cf2
@@ -102,12 +102,16 @@ hangarray=(
446cf2
 "\x00\x80;-c;IBM1161;UTF-8//TRANSLIT//IGNORE"
446cf2
 "\x00\xdb;-c;IBM1162;UTF-8//TRANSLIT//IGNORE"
446cf2
 "\x00\x70;-c;IBM12712;UTF-8//TRANSLIT//IGNORE"
446cf2
-# These are known hangs that are yet to be fixed:
446cf2
-# "\x00\x0f;-c;IBM1364;UTF-8"
446cf2
-# "\x00\x0f;-c;IBM1371;UTF-8"
446cf2
-# "\x00\x0f;-c;IBM1388;UTF-8"
446cf2
-# "\x00\x0f;-c;IBM1390;UTF-8"
446cf2
-# "\x00\x0f;-c;IBM1399;UTF-8"
446cf2
+"\x00\x0f;-c;IBM1364;UTF-8"
446cf2
+"\x0e\x0e;-c;IBM1364;UTF-8"
446cf2
+"\x00\x0f;-c;IBM1371;UTF-8"
446cf2
+"\x0e\x0e;-c;IBM1371;UTF-8"
446cf2
+"\x00\x0f;-c;IBM1388;UTF-8"
446cf2
+"\x0e\x0e;-c;IBM1388;UTF-8"
446cf2
+"\x00\x0f;-c;IBM1390;UTF-8"
446cf2
+"\x0e\x0e;-c;IBM1390;UTF-8"
446cf2
+"\x00\x0f;-c;IBM1399;UTF-8"
446cf2
+"\x0e\x0e;-c;IBM1399;UTF-8"
446cf2
 "\x00\x53;-c;IBM16804;UTF-8//TRANSLIT//IGNORE"
446cf2
 "\x00\x41;-c;IBM274;UTF-8//TRANSLIT//IGNORE"
446cf2
 "\x00\x41;-c;IBM275;UTF-8//TRANSLIT//IGNORE"
446cf2
diff --git a/iconvdata/ibm1364.c b/iconvdata/ibm1364.c
446cf2
index 517fe60813be0472..ecc3f8ddddbdbc8c 100644
446cf2
--- a/iconvdata/ibm1364.c
446cf2
+++ b/iconvdata/ibm1364.c
446cf2
@@ -158,24 +158,14 @@ enum
446cf2
 									      \
446cf2
     if (__builtin_expect (ch, 0) == SO)					      \
446cf2
       {									      \
446cf2
-	/* Shift OUT, change to DBCS converter.  */			      \
446cf2
-	if (curcs == db)						      \
446cf2
-	  {								      \
446cf2
-	    result = __GCONV_ILLEGAL_INPUT;				      \
446cf2
-	    break;							      \
446cf2
-	  }								      \
446cf2
+	/* Shift OUT, change to DBCS converter (redundant escape okay).  */   \
446cf2
 	curcs = db;							      \
446cf2
 	++inptr;							      \
446cf2
 	continue;							      \
446cf2
       }									      \
446cf2
     if (__builtin_expect (ch, 0) == SI)					      \
446cf2
       {									      \
446cf2
-	/* Shift IN, change to SBCS converter.  */			      \
446cf2
-	if (curcs == sb)						      \
446cf2
-	  {								      \
446cf2
-	    result = __GCONV_ILLEGAL_INPUT;				      \
446cf2
-	    break;							      \
446cf2
-	  }								      \
446cf2
+	/* Shift IN, change to SBCS converter (redundant escape okay).  */    \
446cf2
 	curcs = sb;							      \
446cf2
 	++inptr;							      \
446cf2
 	continue;							      \