From d0a89ee751dcd00977272ae278083900956fb505 Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Wed, 3 Jan 2024 14:17:14 +0100 Subject: [PATCH] Fail when unmarshaling would produce non-canonical big integers (#149) This can happen with numbers marshaled on a 32-bit platform (including from JS-of-OCaml) and unmarshaled on a 64-bit platform. Fixes: #148 --- caml_z.c | 23 ++++++-- tests/Makefile | 8 +++ tests/extern.data32 | Bin 0 -> 22300 bytes tests/extern.data64 | Bin 0 -> 20292 bytes tests/extern.ml | 14 +++++ tests/intern.ml | 24 +++++++++ tests/intern.output3232 | 113 ++++++++++++++++++++++++++++++++++++++++ tests/intern.output3264 | 113 ++++++++++++++++++++++++++++++++++++++++ tests/intern.output6432 | 113 ++++++++++++++++++++++++++++++++++++++++ tests/intern.output6464 | 113 ++++++++++++++++++++++++++++++++++++++++ 10 files changed, 517 insertions(+), 4 deletions(-) create mode 100644 tests/extern.data32 create mode 100644 tests/extern.data64 create mode 100644 tests/extern.ml create mode 100644 tests/intern.ml create mode 100644 tests/intern.output3232 create mode 100644 tests/intern.output3264 create mode 100644 tests/intern.output6432 create mode 100644 tests/intern.output6464 diff --git a/caml_z.c b/caml_z.c index 040bb90..a60637c 100644 --- a/caml_z.c +++ b/caml_z.c @@ -3390,10 +3390,17 @@ static void ml_z_custom_serialize(value v, #endif } -/* XXX: serializing a large (i.e., > 2^31) int on a 64-bit machine and - deserializing on a 32-bit machine will fail (instead of returning a - block). - */ +/* There are two issues with integers that are tagged ints on a 64-bit + machine but boxed bigints on a 32-bit machine, namely integers in the + [2^30, 2^62) and [-2^62, -2^30) ranges: + - Serializing such an integer on a 64-bit machine and + deserializing on a 32-bit machine will fail in the generic unmarshaler. + The correct behavior would be to return a boxed integer. + - Serializing such an integer on a 32-bit machine and + deserializing on a 64-bit machine must fail. + The wrong behavior would be to return a block containing a + non-normalized, boxed integer (issue #148). +*/ static uintnat ml_z_custom_deserialize(void * dst) { mp_limb_t* d = ((mp_limb_t*)dst) + 1; @@ -3439,6 +3446,14 @@ static uintnat ml_z_custom_deserialize(void * dst) #if Z_PERFORM_CHECK d[szw] = 0xDEADBEEF ^ szw; szw++; +#endif +#if Z_USE_NATINT + if (i == 0 || + (i == 1 && (d[0] <= Z_MAX_INT || (d[0] == -Z_MIN_INT && sign)))) { + /* Issue #148: this is not a canonical representation, + so we raise a Failure */ + caml_deserialize_error("Z.t value produced on a 32-bit platform cannot be read on a 64-bit platform"); + } #endif return (szw+1) * sizeof(mp_limb_t); } diff --git a/tests/Makefile b/tests/Makefile index f06bcb1..73ee2cb 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -50,6 +50,14 @@ test:: tst_extract.exe @echo "Testing extract..." @if ./tst_extract.exe; then echo "tst_extract: passed"; else echo "tst_extract: FAILED"; exit 2; fi +test:: intern.exe + @echo "Testing unmarshaling..." + @if ./intern.exe extern.data32 | cmp -s intern.output32$(WORDSIZE) -; then echo "intern 32: passed"; else echo "intern 32: failed"; exit 2; fi + @if ./intern.exe extern.data64 | cmp -s intern.output64$(WORDSIZE) -; then echo "intern 64: passed"; else echo "intern 64: failed"; exit 2; fi + +extern.data$(WORDSIZE): extern.exe + ./extern.exe extern.data$(WORDSIZE) + tofloat.exe: tofloat.ml setround.o ../zarith.cmxa ocamlopt -I .. -ccopt "-L.." zarith.cmxa -o tofloat.exe \ setround.o tofloat.ml diff --git a/tests/extern.data32 b/tests/extern.data32 new file mode 100644 index 0000000000000000000000000000000000000000..003164380b9f39c6d2c612ee7d827f049868dfd1 GIT binary patch literal 22300 zcmbW9Pm7_wzKR1Z&mj*GtHi&6%5ZgZ+#P(BznBE%1v^0qATZ7ov1~IjWsYTf3(YQXQRz{1k z%cFip+2v8su*;)P*yT|t?DD7+c6rnZyFBWIT^@D9E{{54mq(qj%cD-%@~9Jb zdDIEJJnDp99(BSlk2>*li}M7e4A-N9)t>pk-EVB0eq?9;F*esR{zKH0XKe}B*V zRImHq9|J-I&=u9#C!2dZm%4k`U_Z8D?_EISeE#7Aehesv0vh|Q`O_&mppGVFhj4>n z4ixYy$>D=-k)!N@I+~Cj!VQQyP{5}ohmW>3er!9S53_9Tu379VlS?y*a$W1P9bD_9D{RVI2W%>_h>L_2cl(HprA5P`BEP z0NFwJdJHIm0vhTL_IDf=tPQk%Zvzgc8DWU_fyAfD(cOO9&3nC?Pm7AUJ$P z3BiFS1cw)t5F8i~96qCj;J^}s!;BJw0|SD?D@q6sEFm~7C?Pm7AUM3Cgy6sug2Rdu zf&&AB!#9)=99TkdnBI{)UvOYRaM(s2SVDAoKk9&h=zzYZa2zI-5FMUI9S{&5K9Gdy zfD)p^Gf9Z&5(1*bN0Ja7P(pNgAqmj|0ny*KYJEQ|*gB_@quv?{|-{ z_aEDk0JQ);o|-=!u#Ti?=cz^#Qyx!EQ&O{MJL5hSQoyI=6TXD*^c+&BMw7Jje2naA z(zp|aG^^|s>J;3GCheR;aiE*zkmjgHA&t#Wp>EMla!8#TP1-r>3L|Iv&WS>rRdxz> z4DLjec24sZCkolVi<3RJLf@W4>eOa?;jdg`YKy%vBtUJk7lAZ3A18Z^#UYVui@iwF z?l`R@kd5`WT2GQRI6K*6Ee?rPTkS=Xc1~IWFr*Z35YpJ}WRJN}l0)je!KA&DtpMXr z5YnuQ6P%ty?xPMS?VW4|7v`PPRaeJHe#Alie0b(%uO|dna3E-)gsmpYeG^=vogGriq{`-^ub1E`DhZJ{f4AR(g z?%4uGk{r6FsAowBr(7KAetQQe2Kn^Lamsa@ZjwXlZjB`!oN}?Gn{;qukY*K*Q?BE5 zlN`GFsAowBrx~3Q2PX#k^vZF{b)69>mUM7ht~fF1;FRk;BTg*o;Iv+GV$i`U*L_Bu zSkl2M7hAeX4rz|}mdYVrNMpnGlLl!`G!P6*PhqEo69b(0*r`{)fN9i38frkmtYNJ5atN2gRb>LxifnsjtZ#hPx? z(Fs9Er&LGkCLNtn($Q%qzp)&h5Oj1(b)_LElyr1jt~ep+=#=VALry5^=(JvOLeSAE z)t!c%QqrGnZ<@NEyQkXI4@$7+wI~0_FSnm>Bkx|1!361D5#$Te*m$o!6EYV6K2)UCRS4ysFyCY~I1#$UP?DX1Cl977#z%#kLZ9OtW!6tw;C z9qq9p`c@rOm)dL__;5%xwZ%3tm>|6`_9CFh?vA59M&zLA)E3(yiKpYZj(|2cx7D^t zqJW*FJyztP=+su*Ac-eOt#KGkY5opDjomrgV@8zdpt{^(;@QzwookK|)C~8IaHy0|H#ERo`)scY} z$6V(db!3SZ$Mvcs11pZX?lXzz;-9!h~g@zJqj;TP`O{_U0P%}Ip$5cn`COR1W{O617<1}ONkcdE^+Tl2+y5g`S zN~|5n<*FkBYmTYTIP8cLYmVzxM+DX!Q{8dcF(v-l_9_*XK)%2KySFb&vNr33AJoOB fpYNWJ;RtFwz>lYVIA>EGvYV=qR6EtSH>Lg`$wjaX literal 0 HcmV?d00001 diff --git a/tests/extern.data64 b/tests/extern.data64 new file mode 100644 index 0000000000000000000000000000000000000000..6d0c104c5f689800432dc3c101c5d765f9111664 GIT binary patch literal 20292 zcmbW9O>*Q!5QR0i2b%~Y>;;QiK(sb2IYa9v+=Gp^;0j!UV=%sneFNA*1TZ3BX6mP^ zGTX1ZBBmsF)u&farR*mYVSf4bx8H|h_$dFjcC&n0mS4hwWf;PNVMvJKLqaV7CB*V2 zA%+hLG2A4?@=ro6|0cw6n-IfYLM(qJ#PWAS4EG5!JS4>OM?x%rCdBZV5W`bKEUyW% zyd}hNN{C@hh~;xaEH4Q$oD*W05@LByh-FTQAtQ#2kn%|CW5_fzLdqkqC@GIvL&_s2 zq m$|EMEJYqu1BPOIgVnWIzCZs%KLdqj1q m$|EMEJYqu1BPOIgVnWIzCSEh* zEhA1DG490Ia=JC#T$D(>vKN^be)pbtqP!d~Jnd9DC=g0z)oKUljFit&GBJt4S^oJ- zo6DkfViE(OLlOfiDPt(3m=p@7lxm`!Vp2XwNyVfLqO4+4Ae2^2%I7Grn3T`;DadXD z$}A@3vM9Aw6Xh0@@;OQ_CS?$17n1^^^kPyzNBPC1e2x-~Nf|^L#-u>6DJcVQDJcV| zl$60SC58H&k}~j;k}_~kNg13{QmE&Ylz}-VWgsVIFeewh_(=<&KKUGy@vg|{IqBsY zlU|;grj}<+dU?jAmuF0RdB&udXH0r|#^ivP#Ow}vdB)^|m&J_q@{CC@&v><7o-yg= z8IxX~G3n(QlU|-N>E#)dUY;@OE#)dUY;@OGg+;rXF^(fCZwfjLRxwzq@`ydS3L>dS4mT79|ANPW4@NPW4@NPW4@$XB7z!gsJYq0qv? zlX3|;Dz}l}%a3@h@ZbIJKK=AFM!!KP?Fj=9{?JXK)C=ZG3kT2TIxb4#BI_2cQWt^a z+Gdx3AApQB3c$n%xA4p;D1c7ds_=uHW2yJ@@1x(}Z{-~A69)7q<0rq*gDbrc0z#|6 zi#GxDS5NDcbx{ex`k2;A7s0|?^(FE?2wAiq5c8jWzn1EzTvSvL9a@iK;j#MCx~Qn2 z>8-yjY&CQd1haX(^(!z>jDkLYef{Adwe@bU70M_U9(zDt>bj4p8#G1{^R{QTN3qz) z^$Lt);jstQrLG{p;~j?W*a4zTbz_kuoueR-uG05F@!=MF^$eSVi>;c-nJ=B^g|*aPZP z*Ltj8(BJ<;UOo0GmL5HI`aO1lrAO#XV-zuO`_5Sdk^xJP9*{H$S#2F4=5NpH;sMDh zDyVAcIuuKfo;r-8f}3Io2xj-_0m&#Tc#UG|(H{jyvGmvhmL5GI8O73Lhhph*wA;ie zmL5AmUF!Co;{nMiDrgIoezY?NEIm%0piP&)0|c`_s~(WdQWZp}ZL$LcmLBI$(56e@ z0fN~*dO$KuRS=!F*$xa?di2zxLDNBx>vTlG_N;n9GKvt`v!g??@@P57C@Kh9Ydnbg z`#$<_kc^^&riPwZtUOxkFp8B&9@M4o`)C2lC@P4~8n0M+w47rUD~~*g6(07{0+LZw z(EOq26)TVSyfccGM;_Fr?)zu~$tWs_&Kj>+c^s8z6f2KB2!+EwT0k<23Zk<%>VW|( zk5eD0v$f+vOh0(EfMk}cAUbQ49vHClIQM}%TRR@a^n*tWNM@-DqO&&ZfdMOzmO3=( zayZ~Z{I5uRJz79AiV!&DBd=I{)YM@V6@;ue8pQm=K3YIBiVC_K4zyzJQB#LetUc18 zF7>dF8jy^lg6O=_inT{g9Y(SCNP}46aUV4x8AS!%9}cu)?NJ|iMzQutgSyniK59TR ziVC9hMl04HM_hnWtUb~o1djWt0m&#Th|b%HBLmhRr!Ekay-heWikNrwr~yfXpuJ5v zGGOg-?gBB{+l(Wlho z$SO7-kvfcGme51CPT8=9@h5$bq`l zavzs#J#vbX$D3h{h0wHk0T9MiWI0ztM>84C@Of3 zV&rjR6r+8lz{um7QH(rNijl{eQH(rNVB~TAd&iEyeXtE(6@Qc;u_F9`f4=g+d;HF( s3?l~gk01R5J>Ww$_xk*4Y$bH&1?QB*4A0IJcnE(I) literal 0 HcmV?d00001 diff --git a/tests/extern.ml b/tests/extern.ml new file mode 100644 index 0000000..247677b --- /dev/null +++ b/tests/extern.ml @@ -0,0 +1,14 @@ +(* Marshal some interesting big integers to the given file *) + +let _ = + let file = Sys.argv.(1) in + let oc = open_out_bin file in + for nbits = 16 to 128 do + let x = Z.shift_left Z.one nbits in + output_value oc (Z.pred (Z.neg x)); + output_value oc (Z.neg x); + output_value oc (Z.pred x); + output_value oc x + done; + close_out oc + diff --git a/tests/intern.ml b/tests/intern.ml new file mode 100644 index 0000000..c7940ae --- /dev/null +++ b/tests/intern.ml @@ -0,0 +1,24 @@ +(* Unmarshal big integers from the given file, and report errors *) + +open Printf + +let expect ic n = + try + let m = (input_value ic : Z.t) in + if Z.equal m n then printf " OK" else printf " Wrong" + with Failure _ -> + printf " Fail" + +let _ = + let file = Sys.argv.(1) in + let ic = open_in_bin file in + for nbits = 16 to 128 do + printf "%d:" nbits; + let x = Z.shift_left Z.one nbits in + expect ic (Z.pred (Z.neg x)); + expect ic (Z.neg x); + expect ic (Z.pred x); + expect ic x; + print_newline() + done; + close_in ic diff --git a/tests/intern.output3232 b/tests/intern.output3232 new file mode 100644 index 0000000..9029dd2 --- /dev/null +++ b/tests/intern.output3232 @@ -0,0 +1,113 @@ +16: OK OK OK OK +17: OK OK OK OK +18: OK OK OK OK +19: OK OK OK OK +20: OK OK OK OK +21: OK OK OK OK +22: OK OK OK OK +23: OK OK OK OK +24: OK OK OK OK +25: OK OK OK OK +26: OK OK OK OK +27: OK OK OK OK +28: OK OK OK OK +29: OK OK OK OK +30: OK OK OK OK +31: OK OK OK OK +32: OK OK OK OK +33: OK OK OK OK +34: OK OK OK OK +35: OK OK OK OK +36: OK OK OK OK +37: OK OK OK OK +38: OK OK OK OK +39: OK OK OK OK +40: OK OK OK OK +41: OK OK OK OK +42: OK OK OK OK +43: OK OK OK OK +44: OK OK OK OK +45: OK OK OK OK +46: OK OK OK OK +47: OK OK OK OK +48: OK OK OK OK +49: OK OK OK OK +50: OK OK OK OK +51: OK OK OK OK +52: OK OK OK OK +53: OK OK OK OK +54: OK OK OK OK +55: OK OK OK OK +56: OK OK OK OK +57: OK OK OK OK +58: OK OK OK OK +59: OK OK OK OK +60: OK OK OK OK +61: OK OK OK OK +62: OK OK OK OK +63: OK OK OK OK +64: OK OK OK OK +65: OK OK OK OK +66: OK OK OK OK +67: OK OK OK OK +68: OK OK OK OK +69: OK OK OK OK +70: OK OK OK OK +71: OK OK OK OK +72: OK OK OK OK +73: OK OK OK OK +74: OK OK OK OK +75: OK OK OK OK +76: OK OK OK OK +77: OK OK OK OK +78: OK OK OK OK +79: OK OK OK OK +80: OK OK OK OK +81: OK OK OK OK +82: OK OK OK OK +83: OK OK OK OK +84: OK OK OK OK +85: OK OK OK OK +86: OK OK OK OK +87: OK OK OK OK +88: OK OK OK OK +89: OK OK OK OK +90: OK OK OK OK +91: OK OK OK OK +92: OK OK OK OK +93: OK OK OK OK +94: OK OK OK OK +95: OK OK OK OK +96: OK OK OK OK +97: OK OK OK OK +98: OK OK OK OK +99: OK OK OK OK +100: OK OK OK OK +101: OK OK OK OK +102: OK OK OK OK +103: OK OK OK OK +104: OK OK OK OK +105: OK OK OK OK +106: OK OK OK OK +107: OK OK OK OK +108: OK OK OK OK +109: OK OK OK OK +110: OK OK OK OK +111: OK OK OK OK +112: OK OK OK OK +113: OK OK OK OK +114: OK OK OK OK +115: OK OK OK OK +116: OK OK OK OK +117: OK OK OK OK +118: OK OK OK OK +119: OK OK OK OK +120: OK OK OK OK +121: OK OK OK OK +122: OK OK OK OK +123: OK OK OK OK +124: OK OK OK OK +125: OK OK OK OK +126: OK OK OK OK +127: OK OK OK OK +128: OK OK OK OK diff --git a/tests/intern.output3264 b/tests/intern.output3264 new file mode 100644 index 0000000..bcacdfb --- /dev/null +++ b/tests/intern.output3264 @@ -0,0 +1,113 @@ +16: OK OK OK OK +17: OK OK OK OK +18: OK OK OK OK +19: OK OK OK OK +20: OK OK OK OK +21: OK OK OK OK +22: OK OK OK OK +23: OK OK OK OK +24: OK OK OK OK +25: OK OK OK OK +26: OK OK OK OK +27: OK OK OK OK +28: OK OK OK OK +29: OK OK OK OK +30: Fail OK OK Fail +31: Fail Fail Fail Fail +32: Fail Fail Fail Fail +33: Fail Fail Fail Fail +34: Fail Fail Fail Fail +35: Fail Fail Fail Fail +36: Fail Fail Fail Fail +37: Fail Fail Fail Fail +38: Fail Fail Fail Fail +39: Fail Fail Fail Fail +40: Fail Fail Fail Fail +41: Fail Fail Fail Fail +42: Fail Fail Fail Fail +43: Fail Fail Fail Fail +44: Fail Fail Fail Fail +45: Fail Fail Fail Fail +46: Fail Fail Fail Fail +47: Fail Fail Fail Fail +48: Fail Fail Fail Fail +49: Fail Fail Fail Fail +50: Fail Fail Fail Fail +51: Fail Fail Fail Fail +52: Fail Fail Fail Fail +53: Fail Fail Fail Fail +54: Fail Fail Fail Fail +55: Fail Fail Fail Fail +56: Fail Fail Fail Fail +57: Fail Fail Fail Fail +58: Fail Fail Fail Fail +59: Fail Fail Fail Fail +60: Fail Fail Fail Fail +61: Fail Fail Fail Fail +62: OK Fail Fail OK +63: OK OK OK OK +64: OK OK OK OK +65: OK OK OK OK +66: OK OK OK OK +67: OK OK OK OK +68: OK OK OK OK +69: OK OK OK OK +70: OK OK OK OK +71: OK OK OK OK +72: OK OK OK OK +73: OK OK OK OK +74: OK OK OK OK +75: OK OK OK OK +76: OK OK OK OK +77: OK OK OK OK +78: OK OK OK OK +79: OK OK OK OK +80: OK OK OK OK +81: OK OK OK OK +82: OK OK OK OK +83: OK OK OK OK +84: OK OK OK OK +85: OK OK OK OK +86: OK OK OK OK +87: OK OK OK OK +88: OK OK OK OK +89: OK OK OK OK +90: OK OK OK OK +91: OK OK OK OK +92: OK OK OK OK +93: OK OK OK OK +94: OK OK OK OK +95: OK OK OK OK +96: OK OK OK OK +97: OK OK OK OK +98: OK OK OK OK +99: OK OK OK OK +100: OK OK OK OK +101: OK OK OK OK +102: OK OK OK OK +103: OK OK OK OK +104: OK OK OK OK +105: OK OK OK OK +106: OK OK OK OK +107: OK OK OK OK +108: OK OK OK OK +109: OK OK OK OK +110: OK OK OK OK +111: OK OK OK OK +112: OK OK OK OK +113: OK OK OK OK +114: OK OK OK OK +115: OK OK OK OK +116: OK OK OK OK +117: OK OK OK OK +118: OK OK OK OK +119: OK OK OK OK +120: OK OK OK OK +121: OK OK OK OK +122: OK OK OK OK +123: OK OK OK OK +124: OK OK OK OK +125: OK OK OK OK +126: OK OK OK OK +127: OK OK OK OK +128: OK OK OK OK diff --git a/tests/intern.output6432 b/tests/intern.output6432 new file mode 100644 index 0000000..bcacdfb --- /dev/null +++ b/tests/intern.output6432 @@ -0,0 +1,113 @@ +16: OK OK OK OK +17: OK OK OK OK +18: OK OK OK OK +19: OK OK OK OK +20: OK OK OK OK +21: OK OK OK OK +22: OK OK OK OK +23: OK OK OK OK +24: OK OK OK OK +25: OK OK OK OK +26: OK OK OK OK +27: OK OK OK OK +28: OK OK OK OK +29: OK OK OK OK +30: Fail OK OK Fail +31: Fail Fail Fail Fail +32: Fail Fail Fail Fail +33: Fail Fail Fail Fail +34: Fail Fail Fail Fail +35: Fail Fail Fail Fail +36: Fail Fail Fail Fail +37: Fail Fail Fail Fail +38: Fail Fail Fail Fail +39: Fail Fail Fail Fail +40: Fail Fail Fail Fail +41: Fail Fail Fail Fail +42: Fail Fail Fail Fail +43: Fail Fail Fail Fail +44: Fail Fail Fail Fail +45: Fail Fail Fail Fail +46: Fail Fail Fail Fail +47: Fail Fail Fail Fail +48: Fail Fail Fail Fail +49: Fail Fail Fail Fail +50: Fail Fail Fail Fail +51: Fail Fail Fail Fail +52: Fail Fail Fail Fail +53: Fail Fail Fail Fail +54: Fail Fail Fail Fail +55: Fail Fail Fail Fail +56: Fail Fail Fail Fail +57: Fail Fail Fail Fail +58: Fail Fail Fail Fail +59: Fail Fail Fail Fail +60: Fail Fail Fail Fail +61: Fail Fail Fail Fail +62: OK Fail Fail OK +63: OK OK OK OK +64: OK OK OK OK +65: OK OK OK OK +66: OK OK OK OK +67: OK OK OK OK +68: OK OK OK OK +69: OK OK OK OK +70: OK OK OK OK +71: OK OK OK OK +72: OK OK OK OK +73: OK OK OK OK +74: OK OK OK OK +75: OK OK OK OK +76: OK OK OK OK +77: OK OK OK OK +78: OK OK OK OK +79: OK OK OK OK +80: OK OK OK OK +81: OK OK OK OK +82: OK OK OK OK +83: OK OK OK OK +84: OK OK OK OK +85: OK OK OK OK +86: OK OK OK OK +87: OK OK OK OK +88: OK OK OK OK +89: OK OK OK OK +90: OK OK OK OK +91: OK OK OK OK +92: OK OK OK OK +93: OK OK OK OK +94: OK OK OK OK +95: OK OK OK OK +96: OK OK OK OK +97: OK OK OK OK +98: OK OK OK OK +99: OK OK OK OK +100: OK OK OK OK +101: OK OK OK OK +102: OK OK OK OK +103: OK OK OK OK +104: OK OK OK OK +105: OK OK OK OK +106: OK OK OK OK +107: OK OK OK OK +108: OK OK OK OK +109: OK OK OK OK +110: OK OK OK OK +111: OK OK OK OK +112: OK OK OK OK +113: OK OK OK OK +114: OK OK OK OK +115: OK OK OK OK +116: OK OK OK OK +117: OK OK OK OK +118: OK OK OK OK +119: OK OK OK OK +120: OK OK OK OK +121: OK OK OK OK +122: OK OK OK OK +123: OK OK OK OK +124: OK OK OK OK +125: OK OK OK OK +126: OK OK OK OK +127: OK OK OK OK +128: OK OK OK OK diff --git a/tests/intern.output6464 b/tests/intern.output6464 new file mode 100644 index 0000000..9029dd2 --- /dev/null +++ b/tests/intern.output6464 @@ -0,0 +1,113 @@ +16: OK OK OK OK +17: OK OK OK OK +18: OK OK OK OK +19: OK OK OK OK +20: OK OK OK OK +21: OK OK OK OK +22: OK OK OK OK +23: OK OK OK OK +24: OK OK OK OK +25: OK OK OK OK +26: OK OK OK OK +27: OK OK OK OK +28: OK OK OK OK +29: OK OK OK OK +30: OK OK OK OK +31: OK OK OK OK +32: OK OK OK OK +33: OK OK OK OK +34: OK OK OK OK +35: OK OK OK OK +36: OK OK OK OK +37: OK OK OK OK +38: OK OK OK OK +39: OK OK OK OK +40: OK OK OK OK +41: OK OK OK OK +42: OK OK OK OK +43: OK OK OK OK +44: OK OK OK OK +45: OK OK OK OK +46: OK OK OK OK +47: OK OK OK OK +48: OK OK OK OK +49: OK OK OK OK +50: OK OK OK OK +51: OK OK OK OK +52: OK OK OK OK +53: OK OK OK OK +54: OK OK OK OK +55: OK OK OK OK +56: OK OK OK OK +57: OK OK OK OK +58: OK OK OK OK +59: OK OK OK OK +60: OK OK OK OK +61: OK OK OK OK +62: OK OK OK OK +63: OK OK OK OK +64: OK OK OK OK +65: OK OK OK OK +66: OK OK OK OK +67: OK OK OK OK +68: OK OK OK OK +69: OK OK OK OK +70: OK OK OK OK +71: OK OK OK OK +72: OK OK OK OK +73: OK OK OK OK +74: OK OK OK OK +75: OK OK OK OK +76: OK OK OK OK +77: OK OK OK OK +78: OK OK OK OK +79: OK OK OK OK +80: OK OK OK OK +81: OK OK OK OK +82: OK OK OK OK +83: OK OK OK OK +84: OK OK OK OK +85: OK OK OK OK +86: OK OK OK OK +87: OK OK OK OK +88: OK OK OK OK +89: OK OK OK OK +90: OK OK OK OK +91: OK OK OK OK +92: OK OK OK OK +93: OK OK OK OK +94: OK OK OK OK +95: OK OK OK OK +96: OK OK OK OK +97: OK OK OK OK +98: OK OK OK OK +99: OK OK OK OK +100: OK OK OK OK +101: OK OK OK OK +102: OK OK OK OK +103: OK OK OK OK +104: OK OK OK OK +105: OK OK OK OK +106: OK OK OK OK +107: OK OK OK OK +108: OK OK OK OK +109: OK OK OK OK +110: OK OK OK OK +111: OK OK OK OK +112: OK OK OK OK +113: OK OK OK OK +114: OK OK OK OK +115: OK OK OK OK +116: OK OK OK OK +117: OK OK OK OK +118: OK OK OK OK +119: OK OK OK OK +120: OK OK OK OK +121: OK OK OK OK +122: OK OK OK OK +123: OK OK OK OK +124: OK OK OK OK +125: OK OK OK OK +126: OK OK OK OK +127: OK OK OK OK +128: OK OK OK OK