|
|
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; \
|