tst-iconv_prog.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. #!/bin/bash
  2. # Test for some known iconv(1) hangs from bug 19519, and miscellaneous
  3. # iconv(1) program error conditions.
  4. # Copyright (C) 2020-2026 Free Software Foundation, Inc.
  5. # This file is part of the GNU C Library.
  6. # The GNU C Library is free software; you can redistribute it and/or
  7. # modify it under the terms of the GNU Lesser General Public
  8. # License as published by the Free Software Foundation; either
  9. # version 2.1 of the License, or (at your option) any later version.
  10. # The GNU C Library is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. # Lesser General Public License for more details.
  14. # You should have received a copy of the GNU Lesser General Public
  15. # License along with the GNU C Library; if not, see
  16. # <https://www.gnu.org/licenses/>.
  17. codir=$1
  18. test_wrapper_env="$2"
  19. run_program_env="$3"
  20. # Remove the last space to allow concatenate extra paths.
  21. library_path="$(echo $4)"
  22. # We have to have some directories in the library path.
  23. LIBPATH=$codir:$codir/iconvdata
  24. # How the start the iconv(1) program. $from is not defined/expanded yet.
  25. ICONV='
  26. $codir/elf/ld.so --library-path $library_path:$LIBPATH --inhibit-rpath ${from}.so
  27. $codir/iconv/iconv_prog
  28. '
  29. ICONV="$test_wrapper_env $run_program_env $ICONV"
  30. TIMEOUTFACTOR=${TIMEOUTFACTOR:-1}
  31. # List of known hangs;
  32. # Gathered by running an exhaustive 2 byte input search against glibc-2.28
  33. hangarray=(
  34. "\x00\x23;-c;ANSI_X3.110;UTF-8//TRANSLIT//IGNORE"
  35. "\x00\xa1;-c;ARMSCII-8;UTF-8//TRANSLIT//IGNORE"
  36. "\x00\xa1;-c;ASMO_449;UTF-8//TRANSLIT//IGNORE"
  37. "\x00\x81;-c;BIG5;UTF-8//TRANSLIT//IGNORE"
  38. "\x00\xff;-c;BIG5HKSCS;UTF-8//TRANSLIT//IGNORE"
  39. "\x00\xff;-c;BRF;UTF-8//TRANSLIT//IGNORE"
  40. "\x00\xff;-c;BS_4730;UTF-8//TRANSLIT//IGNORE"
  41. "\x00\x81;-c;CP1250;UTF-8//TRANSLIT//IGNORE"
  42. "\x00\x98;-c;CP1251;UTF-8//TRANSLIT//IGNORE"
  43. "\x00\x81;-c;CP1252;UTF-8//TRANSLIT//IGNORE"
  44. "\x00\x81;-c;CP1253;UTF-8//TRANSLIT//IGNORE"
  45. "\x00\x81;-c;CP1254;UTF-8//TRANSLIT//IGNORE"
  46. "\x00\x81;-c;CP1255;UTF-8//TRANSLIT//IGNORE"
  47. "\x00\x81;-c;CP1257;UTF-8//TRANSLIT//IGNORE"
  48. "\x00\x81;-c;CP1258;UTF-8//TRANSLIT//IGNORE"
  49. "\xff\xff;-c;CP932;UTF-8//TRANSLIT//IGNORE"
  50. "\xff\xff;-c;CSA_Z243.4-1985-1;UTF-8//TRANSLIT//IGNORE"
  51. "\xff\xff;-c;CSA_Z243.4-1985-2;UTF-8//TRANSLIT//IGNORE"
  52. "\xff\xff;-c;DEC-MCS;UTF-8//TRANSLIT//IGNORE"
  53. "\xff\xff;-c;DIN_66003;UTF-8//TRANSLIT//IGNORE"
  54. "\xff\xff;-c;DS_2089;UTF-8//TRANSLIT//IGNORE"
  55. "\x00\x41;-c;EBCDIC-AT-DE;UTF-8//TRANSLIT//IGNORE"
  56. "\x00\x41;-c;EBCDIC-AT-DE-A;UTF-8//TRANSLIT//IGNORE"
  57. "\x00\x41;-c;EBCDIC-CA-FR;UTF-8//TRANSLIT//IGNORE"
  58. "\x00\x41;-c;EBCDIC-DK-NO;UTF-8//TRANSLIT//IGNORE"
  59. "\x00\x41;-c;EBCDIC-DK-NO-A;UTF-8//TRANSLIT//IGNORE"
  60. "\x00\x41;-c;EBCDIC-ES;UTF-8//TRANSLIT//IGNORE"
  61. "\x00\x41;-c;EBCDIC-ES-A;UTF-8//TRANSLIT//IGNORE"
  62. "\x00\x41;-c;EBCDIC-ES-S;UTF-8//TRANSLIT//IGNORE"
  63. "\x00\x41;-c;EBCDIC-FI-SE;UTF-8//TRANSLIT//IGNORE"
  64. "\x00\x41;-c;EBCDIC-FI-SE-A;UTF-8//TRANSLIT//IGNORE"
  65. "\x00\x41;-c;EBCDIC-FR;UTF-8//TRANSLIT//IGNORE"
  66. "\x00\x41;-c;EBCDIC-IS-FRISS;UTF-8//TRANSLIT//IGNORE"
  67. "\x00\x41;-c;EBCDIC-IT;UTF-8//TRANSLIT//IGNORE"
  68. "\x00\x41;-c;EBCDIC-PT;UTF-8//TRANSLIT//IGNORE"
  69. "\x00\x41;-c;EBCDIC-UK;UTF-8//TRANSLIT//IGNORE"
  70. "\x00\x41;-c;EBCDIC-US;UTF-8//TRANSLIT//IGNORE"
  71. "\xff\xff;-c;ES;UTF-8//TRANSLIT//IGNORE"
  72. "\xff\xff;-c;ES2;UTF-8//TRANSLIT//IGNORE"
  73. "\xff\xff;-c;EUC-CN;UTF-8//TRANSLIT//IGNORE"
  74. "\xff\xff;-c;EUC-JISX0213;UTF-8//TRANSLIT//IGNORE"
  75. "\xff\xff;-c;EUC-JP;UTF-8//TRANSLIT//IGNORE"
  76. "\xff\xff;-c;EUC-JP-MS;UTF-8//TRANSLIT//IGNORE"
  77. "\xff\xff;-c;EUC-KR;UTF-8//TRANSLIT//IGNORE"
  78. "\xff\xff;-c;EUC-TW;UTF-8//TRANSLIT//IGNORE"
  79. "\xff\xff;-c;GB18030;UTF-8//TRANSLIT//IGNORE"
  80. "\xff\xff;-c;GB_1988-80;UTF-8//TRANSLIT//IGNORE"
  81. "\xff\xff;-c;GBK;UTF-8//TRANSLIT//IGNORE"
  82. "\xff\xff;-c;GOST_19768-74;UTF-8//TRANSLIT//IGNORE"
  83. "\xff\xff;-c;GREEK7;UTF-8//TRANSLIT//IGNORE"
  84. "\xff\xff;-c;GREEK7-OLD;UTF-8//TRANSLIT//IGNORE"
  85. "\xff\xff;-c;GREEK-CCITT;UTF-8//TRANSLIT//IGNORE"
  86. "\xff\xff;-c;HP-GREEK8;UTF-8//TRANSLIT//IGNORE"
  87. "\xff\xff;-c;HP-ROMAN8;UTF-8//TRANSLIT//IGNORE"
  88. "\xff\xff;-c;HP-ROMAN9;UTF-8//TRANSLIT//IGNORE"
  89. "\xff\xff;-c;HP-THAI8;UTF-8//TRANSLIT//IGNORE"
  90. "\xff\xff;-c;HP-TURKISH8;UTF-8//TRANSLIT//IGNORE"
  91. "\x00\x41;-c;IBM038;UTF-8//TRANSLIT//IGNORE"
  92. "\x00\x80;-c;IBM1004;UTF-8//TRANSLIT//IGNORE"
  93. "\x00\xff;-c;IBM1008;UTF-8//TRANSLIT//IGNORE"
  94. "\xff\xff;-c;IBM1046;UTF-8//TRANSLIT//IGNORE"
  95. "\x00\x51;-c;IBM1132;UTF-8//TRANSLIT//IGNORE"
  96. "\x00\xa0;-c;IBM1133;UTF-8//TRANSLIT//IGNORE"
  97. "\x00\xce;-c;IBM1137;UTF-8//TRANSLIT//IGNORE"
  98. "\x00\x80;-c;IBM1161;UTF-8//TRANSLIT//IGNORE"
  99. "\x00\xdb;-c;IBM1162;UTF-8//TRANSLIT//IGNORE"
  100. "\x00\x70;-c;IBM12712;UTF-8//TRANSLIT//IGNORE"
  101. "\x00\x0f;-c;IBM1364;UTF-8"
  102. "\x0e\x0e;-c;IBM1364;UTF-8"
  103. "\x00\x0f;-c;IBM1371;UTF-8"
  104. "\x0e\x0e;-c;IBM1371;UTF-8"
  105. "\x00\x0f;-c;IBM1388;UTF-8"
  106. "\x0e\x0e;-c;IBM1388;UTF-8"
  107. "\x00\x0f;-c;IBM1390;UTF-8"
  108. "\x0e\x0e;-c;IBM1390;UTF-8"
  109. "\x00\x0f;-c;IBM1399;UTF-8"
  110. "\x0e\x0e;-c;IBM1399;UTF-8"
  111. "\x00\x53;-c;IBM16804;UTF-8//TRANSLIT//IGNORE"
  112. "\x00\x41;-c;IBM274;UTF-8//TRANSLIT//IGNORE"
  113. "\x00\x41;-c;IBM275;UTF-8//TRANSLIT//IGNORE"
  114. "\x00\x41;-c;IBM281;UTF-8//TRANSLIT//IGNORE"
  115. "\x00\x57;-c;IBM290;UTF-8//TRANSLIT//IGNORE"
  116. "\x00\x45;-c;IBM420;UTF-8//TRANSLIT//IGNORE"
  117. "\x00\x68;-c;IBM423;UTF-8//TRANSLIT//IGNORE"
  118. "\x00\x70;-c;IBM424;UTF-8//TRANSLIT//IGNORE"
  119. "\x00\x53;-c;IBM4517;UTF-8//TRANSLIT//IGNORE"
  120. "\x00\x53;-c;IBM4899;UTF-8//TRANSLIT//IGNORE"
  121. "\x00\xa5;-c;IBM4909;UTF-8//TRANSLIT//IGNORE"
  122. "\x00\xdc;-c;IBM4971;UTF-8//TRANSLIT//IGNORE"
  123. "\x00\x41;-c;IBM803;UTF-8//TRANSLIT//IGNORE"
  124. "\x00\x91;-c;IBM851;UTF-8//TRANSLIT//IGNORE"
  125. "\x00\x9b;-c;IBM856;UTF-8//TRANSLIT//IGNORE"
  126. "\x00\xd5;-c;IBM857;UTF-8//TRANSLIT//IGNORE"
  127. "\xff\xff;-c;IBM864;UTF-8//TRANSLIT//IGNORE"
  128. "\x00\x94;-c;IBM868;UTF-8//TRANSLIT//IGNORE"
  129. "\x00\x94;-c;IBM869;UTF-8//TRANSLIT//IGNORE"
  130. "\xff\xff;-c;IBM874;UTF-8//TRANSLIT//IGNORE"
  131. "\x00\x6a;-c;IBM875;UTF-8//TRANSLIT//IGNORE"
  132. "\x00\x41;-c;IBM880;UTF-8//TRANSLIT//IGNORE"
  133. "\x00\x80;-c;IBM891;UTF-8//TRANSLIT//IGNORE"
  134. "\xff\xff;-c;IBM903;UTF-8//TRANSLIT//IGNORE"
  135. "\xff\xff;-c;IBM904;UTF-8//TRANSLIT//IGNORE"
  136. "\x00\x41;-c;IBM905;UTF-8//TRANSLIT//IGNORE"
  137. "\x00\x80;-c;IBM9066;UTF-8//TRANSLIT//IGNORE"
  138. "\x00\x48;-c;IBM918;UTF-8//TRANSLIT//IGNORE"
  139. "\x00\x57;-c;IBM930;UTF-8//TRANSLIT//IGNORE"
  140. "\x00\x80;-c;IBM932;UTF-8//TRANSLIT//IGNORE"
  141. "\x00\x41;-c;IBM933;UTF-8//TRANSLIT//IGNORE"
  142. "\x00\x41;-c;IBM935;UTF-8//TRANSLIT//IGNORE"
  143. "\x00\x41;-c;IBM937;UTF-8//TRANSLIT//IGNORE"
  144. "\x00\x41;-c;IBM939;UTF-8//TRANSLIT//IGNORE"
  145. "\x00\x80;-c;IBM943;UTF-8//TRANSLIT//IGNORE"
  146. "\xff\xff;-c;INIS;UTF-8//TRANSLIT//IGNORE"
  147. "\xff\xff;-c;INIS-8;UTF-8//TRANSLIT//IGNORE"
  148. "\xff\xff;-c;INIS-CYRILLIC;UTF-8//TRANSLIT//IGNORE"
  149. "\x00\xec;-c;ISIRI-3342;UTF-8//TRANSLIT//IGNORE"
  150. "\x00\xec;-c;ISO_10367-BOX;UTF-8//TRANSLIT//IGNORE"
  151. "\xff\xff;-c;ISO-2022-CN;UTF-8//TRANSLIT//IGNORE"
  152. "\xff\xff;-c;ISO-2022-CN-EXT;UTF-8//TRANSLIT//IGNORE"
  153. "\xff\xff;-c;ISO-2022-JP;UTF-8//TRANSLIT//IGNORE"
  154. "\xff\xff;-c;ISO-2022-JP-2;UTF-8//TRANSLIT//IGNORE"
  155. "\xff\xff;-c;ISO-2022-JP-3;UTF-8//TRANSLIT//IGNORE"
  156. "\xff\xff;-c;ISO-2022-KR;UTF-8//TRANSLIT//IGNORE"
  157. "\xff\xff;-c;ISO_2033;UTF-8//TRANSLIT//IGNORE"
  158. "\xff\xff;-c;ISO_5427;UTF-8//TRANSLIT//IGNORE"
  159. "\xff\xff;-c;ISO_5427-EXT;UTF-8//TRANSLIT//IGNORE"
  160. "\xff\xff;-c;ISO_5428;UTF-8//TRANSLIT//IGNORE"
  161. "\x00\xa4;-c;ISO_6937;UTF-8//TRANSLIT//IGNORE"
  162. "\x00\xa0;-c;ISO_6937-2;UTF-8//TRANSLIT//IGNORE"
  163. "\xff\xff;-c;ISO-8859-11;UTF-8//TRANSLIT//IGNORE"
  164. "\x00\xa5;-c;ISO-8859-3;UTF-8//TRANSLIT//IGNORE"
  165. "\xff\xff;-c;ISO-8859-6;UTF-8//TRANSLIT//IGNORE"
  166. "\xff\xff;-c;ISO-8859-7;UTF-8//TRANSLIT//IGNORE"
  167. "\xff\xff;-c;ISO-8859-8;UTF-8//TRANSLIT//IGNORE"
  168. "\x00\x80;-c;ISO-IR-197;UTF-8//TRANSLIT//IGNORE"
  169. "\x00\x80;-c;ISO-IR-209;UTF-8//TRANSLIT//IGNORE"
  170. "\x00\x80;-c;IT;UTF-8//TRANSLIT//IGNORE"
  171. "\x00\x80;-c;JIS_C6220-1969-RO;UTF-8//TRANSLIT//IGNORE"
  172. "\x00\x80;-c;JIS_C6229-1984-B;UTF-8//TRANSLIT//IGNORE"
  173. "\x00\x80;-c;JOHAB;UTF-8//TRANSLIT//IGNORE"
  174. "\x00\x80;-c;JUS_I.B1.002;UTF-8//TRANSLIT//IGNORE"
  175. "\x00\x80;-c;KOI-8;UTF-8//TRANSLIT//IGNORE"
  176. "\x00\x88;-c;KOI8-T;UTF-8//TRANSLIT//IGNORE"
  177. "\xff\xff;-c;KSC5636;UTF-8//TRANSLIT//IGNORE"
  178. "\xff\xff;-c;LATIN-GREEK;UTF-8//TRANSLIT//IGNORE"
  179. "\xff\xff;-c;LATIN-GREEK-1;UTF-8//TRANSLIT//IGNORE"
  180. "\x00\xf6;-c;MAC-IS;UTF-8//TRANSLIT//IGNORE"
  181. "\xff\xff;-c;MSZ_7795.3;UTF-8//TRANSLIT//IGNORE"
  182. "\xff\xff;-c;NATS-DANO;UTF-8//TRANSLIT//IGNORE"
  183. "\xff\xff;-c;NATS-SEFI;UTF-8//TRANSLIT//IGNORE"
  184. "\xff\xff;-c;NC_NC00-10;UTF-8//TRANSLIT//IGNORE"
  185. "\xff\xff;-c;NF_Z_62-010;UTF-8//TRANSLIT//IGNORE"
  186. "\xff\xff;-c;NF_Z_62-010_1973;UTF-8//TRANSLIT//IGNORE"
  187. "\xff\xff;-c;NS_4551-1;UTF-8//TRANSLIT//IGNORE"
  188. "\xff\xff;-c;NS_4551-2;UTF-8//TRANSLIT//IGNORE"
  189. "\xff\xff;-c;PT;UTF-8//TRANSLIT//IGNORE"
  190. "\xff\xff;-c;PT2;UTF-8//TRANSLIT//IGNORE"
  191. "\x00\x98;-c;RK1048;UTF-8//TRANSLIT//IGNORE"
  192. "\x00\x98;-c;SEN_850200_B;UTF-8//TRANSLIT//IGNORE"
  193. "\x00\x98;-c;SEN_850200_C;UTF-8//TRANSLIT//IGNORE"
  194. "\x00\x80;-c;Shift_JISX0213;UTF-8//TRANSLIT//IGNORE"
  195. "\x00\x80;-c;SJIS;UTF-8//TRANSLIT//IGNORE"
  196. "\x00\x23;-c;T.61-8BIT;UTF-8//TRANSLIT//IGNORE"
  197. "\xff\xff;-c;TIS-620;UTF-8//TRANSLIT//IGNORE"
  198. "\xff\xff;-c;TSCII;UTF-8//TRANSLIT//IGNORE"
  199. "\xff\xff;-c;UHC;UTF-8//TRANSLIT//IGNORE"
  200. "\x00\xd8;-c;UNICODE;UTF-8//TRANSLIT//IGNORE"
  201. "\x00\xdc;-c;UTF-16;UTF-8//TRANSLIT//IGNORE"
  202. "\xdc\x00;-c;UTF-16BE;UTF-8//TRANSLIT//IGNORE"
  203. "\x00\xdc;-c;UTF-16LE;UTF-8//TRANSLIT//IGNORE"
  204. "\xff\xff;-c;UTF-7;UTF-8//TRANSLIT//IGNORE"
  205. "\x00\x81;-c;WIN-SAMI-2;UTF-8//TRANSLIT//IGNORE"
  206. )
  207. # List of option combinations with their expected return code
  208. testarray=(
  209. # Converting from/to invalid character sets should cause error
  210. "\x00\x00;;INVALID;INVALID;1"
  211. "\x00\x00;;INVALID;UTF-8;1"
  212. "\x00\x00;;UTF-8;INVALID;1"
  213. "\xc3\xa9;;UTF-8;ASCII//TRANSLIT;0"
  214. )
  215. # Requires $twobyte input, $c flag, $from, and $to to be set; sets $ret
  216. execute_test ()
  217. {
  218. eval PROG=\"$ICONV\"
  219. echo -en "$twobyte" \
  220. | timeout -k 4 $((3*$TIMEOUTFACTOR)) \
  221. $PROG $c -f $from -t "$to" &>/dev/null
  222. ret=$?
  223. }
  224. check_hangtest_result ()
  225. {
  226. if [ "$ret" -eq "124" ] || [ "$ret" -eq "137" ]; then # timeout/hang
  227. result="HANG"
  228. else
  229. if [ "$ret" -eq "139" ]; then # segfault
  230. result="SEGFAULT"
  231. else
  232. if [ "$ret" -gt "127" ]; then # unexpected error
  233. result="UNEXPECTED"
  234. else
  235. result="OK"
  236. fi
  237. fi
  238. fi
  239. echo -n "$result: from: \"$from\", to: \"$to\","
  240. echo " input \"$twobyte\", flags \"$c\""
  241. if [ "$result" != "OK" ]; then
  242. exit 1
  243. fi
  244. }
  245. for hangcommand in "${hangarray[@]}"; do
  246. twobyte="$(echo "$hangcommand" | cut -d";" -f 1)"
  247. c="$(echo "$hangcommand" | cut -d";" -f 2)"
  248. from="$(echo "$hangcommand" | cut -d";" -f 3)"
  249. to="$(echo "$hangcommand" | cut -d";" -f 4)"
  250. execute_test
  251. check_hangtest_result
  252. done
  253. check_errtest_result ()
  254. {
  255. if [ "$ret" -eq "$eret" ]; then # we got the expected return code
  256. result="PASS"
  257. else
  258. result="FAIL"
  259. fi
  260. echo -n "$result: from: \"$from\", to: \"$to\","
  261. echo " input \"$twobyte\", flags \"$c\", return code $ret"
  262. if [ "$result" != "PASS" ]; then
  263. exit 1
  264. fi
  265. }
  266. for testcommand in "${testarray[@]}"; do
  267. twobyte="$(echo "$testcommand" | cut -d";" -f 1)"
  268. c="$(echo "$testcommand" | cut -d";" -f 2)"
  269. from="$(echo "$testcommand" | cut -d";" -f 3)"
  270. to="$(echo "$testcommand" | cut -d";" -f 4)"
  271. eret="$(echo "$testcommand" | cut -d";" -f 5)"
  272. execute_test
  273. check_errtest_result
  274. done