From c37a465897c3bf6663140858ca82e9dd04f9c036 Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Sun, 10 Dec 2023 19:24:38 +0100 Subject: [PATCH] Fail when unmarshaling would produce non-canonical big integers Fixes: #148 --- caml_z.c | 12 ++++ tests/Makefile | 8 +++ tests/extern.data32 | Bin 0 -> 23522 bytes tests/extern.data64 | Bin 0 -> 21510 bytes tests/extern.ml | 14 +++++ tests/intern.ml | 24 ++++++++ tests/intern.output3232 | 127 ++++++++++++++++++++++++++++++++++++++++ tests/intern.output3264 | 127 ++++++++++++++++++++++++++++++++++++++++ tests/intern.output6432 | 127 ++++++++++++++++++++++++++++++++++++++++ tests/intern.output6464 | 127 ++++++++++++++++++++++++++++++++++++++++ 10 files changed, 566 insertions(+) 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 02e758d..c0b11c4 100644 --- a/caml_z.c +++ b/caml_z.c @@ -3398,6 +3398,10 @@ static void ml_z_custom_serialize(value v, /* 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). + YYY: serializing a large (i.e., > 2^31 and < 2^62) int on a + 32-bit machine and deserializing on a 64-bit machine must fail + (instead of returning a block containing a non-normalized big integer) + (issue #148). */ static uintnat ml_z_custom_deserialize(void * dst) { @@ -3444,6 +3448,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 760294b..80762cc 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..60d155d7ed0ac761c3dec73daeceb444125bc32b GIT binary patch literal 23522 zcmbW8L2e{96oxC4KxToIS+IZw>Y4=$PSGua1Ut9^oP$jl(p-Tna10b~5^fN7K?+m6 z=d|r-``P)bN=i?t_V4d~?RHhuPxeT2uQ$O@-pL=`{G)sJA8&$Rypun>`3Lvx-|pFyH|^OSdhee7>vHzmF2dEc zxP$$P{jtBf6JJg4>1lOOum0%u${qd2AARM|{m~!&(VzRqAARl5{p^o^_UC@`#FC$T>D81FiX>8{6k>?GF59%Jq#rbCbM&`GQhJ;te%n2tTheJ8Qr_ZUkjF`avi zUSeH34E!)M6$@DuWc&yelm zCuDp04A~xjLZ0v$vOWBSY!9Cy+rv-D6Fy_^B@R8tLoXpuM8=mgM&C`k5;tG`{Hy#k z=_{s(T7@T0?)%`_@MKg!NX6CQNOV8<@C%#sn$?tlE z*DAblI)ap!h1zkF}%OwUjWs+4IA4LO^Rbvco{CpAte~3n4j}Ys#>s zA0Tk^?0q2TDi|x+69@+`&L{poHW=3CUrGC53># zTMsah94H|IZ%QW@^W2T3E2S>LP>!jmv2&12m}YYe3L+SfQ0M- z3E4p|-=w7MAeV0v$PSQ@9Uvh)$mN@qlpW;qO#;~g60!p%WQUoRlpPK%kR2c)J3vBq zII)tl!;uBD10-YzNXQNgD=9miSs*(=LUw?J>>!tK^7hUS>sALy$PSQT9Mbp4!;jL& zfl23ekQ)Sfm5c);7>D#dHFdb=B`HS#r+T9UBk0un!9M&$2w`Nn$E~-#qyP{QA((Yw zgqPw2B7N^p*Wr$r^y0t>#(@!x!;DG_ftPhSpn%yAj9?rX!8n{yNyg!b0>*(6i~}PW zhXs{n9L^|U92mhkFoJPNU!KwZux@o=1mnO6*5M7gYM6CMeafM+qJ8WY^)A1grxhSO-L~4(~`w*5Qr>tOFug2Sl(AGbzbB97w=A zAcA#31nY1jC0U0f30Mb2unve|9TrlObvToNbwC8`5DD)EtLHzJpHD758vX85k1zBg zHX*_&QkI6^zI@(D{f8k%@tY|c+C)l53MWb`oG2-jrw@9VPQtJ}9h;m?H(?kmoG7VqqNGrsKImaO3&Zks zY;rQ)g<+_0qNKu!l0td6AMe!}3BXy?VKuF${(BG#L&^ zDxDxn0ePKrXJc4i2qmZ7-57>SCrB!tAgOek_q_KGEL1u{Qt1RqrPGO(7eZ;Bjx1C< zK~m`iNu|@m$}64DEL1u{Qt1RqrITE~w_o?xJx-8RIzdw9lsYBv7^<97kLLAI+PNzuRZgjsG9-miCZ%r5FjP4)QV4A& zRZgk1GAyrhO5K%VsB&VY%88LGrx|UH%ISbYl@lXXPK;DJoltp|(-DO#Cq}BA7^!kv zPmDaYs+<_9c8Z;vO-`{}GYp0D6n8lgsdhpn z1(^HO6gxM=@nM5>(-sdkE;oMCyjQ|#spL$wnk)lP_1JH^h(@QeN$JCZXC1 zk!q(%`dUiR=kzP|*mwF|%aSAXo%GA=bm&M@q6X6U%X$sGgoZSod>5^DLo_Y1pqXCO zu*?uN*LC~%F~eZvM~NZ0huAopj?u8x#?f?*hQY>>5*tTKY#dDoX;^CGXu3$lVB<)M zjUy#Cj{3$WTdHw1U8QY~l-M{@V&gdPbv(devyPP5I8ve%R$g;Xa$?sy9$~O?q{PON z5~Z-xagh_d9M3S=I8tKcNQqKd>8Q8RU5@KsM@noQDY13T9jf7_BLwZ;%JjpA!Db!J z-wC}Q+(T>~bH{2(Y#npgY8Y%CA+cRYNNgQ*2Wwbr>zKP(!(i(OiLE0fwvKYU+P5Eb zS8JmqB({!_*gDR89S-|NSX=>)EZ90iV(SQrt>eNj;Uhquj3c?Zjy8I*zHMHZ0X~OkK5M&~ao$$B_{o$9eBH z=YWEaBO^MFjOaL?P^r#39#PP7WJJf25go?`mFhU2QP6Q@M8}a49mmv>8*VGdaoy|4 zh>jy8dXBL}x7jgv>4rgP9n;^5y&f#@kLfSchC$CUcI;jcR>at~8wNc`MD*4X5k1G) z!5fz9y;oxwZy59(5z%u*M9(pH^oFH+j?vM&dV8jy|uwlTR;y?-u%v^53)kOtA^6 bzlTFdlX7+NyXxAyUV=la0(Mh1+))1q)^6Tx literal 0 HcmV?d00001 diff --git a/tests/extern.data64 b/tests/extern.data64 new file mode 100644 index 0000000000000000000000000000000000000000..096750b0952b63b33181f8220c1803e4f13a813a GIT binary patch literal 21510 zcmbuHL2fKH5Qck_JQ5_NWWnMsK+_wRoMBo533hOU$2r(^BfTqd1&)D+n+!JyyC8*_ zsq9tn6P%0} z#&dsx3m-bz-38bk@a%Aavv2V1177VoE=3tdyL6Zbfd@c6k&20dS8IA-QY1ih2#y+ z551#+3`q~1gOVOtAp@8p>46oJ9+)BNffX`<8Im4YA?bk`k{(zg1DGM{ffbS-m?7zb z6*7Psy{9;OjEkp`ftm5C%vqYtb9=VB`cN);h@X3 z+v(&jSIUZ=E)55DKqqVsx=gz+x?!b=bkJpL+F_;iYwEd7O+Ty@kq)}d-c`!Laf^9zm7>x?mpQmf88~e* z&#qEbI_NSdS1AMI7SmUXN(Vh={At(A6-Bz|DXaSDsbe0~(i2|^BHChFdSYde8^R5y zr6*RV^z?jMdSYcvPuHiVCswBP^q7{OSQ*pPWmyXlvX`m=CGlR)zf31HDlg zJ+abmZarp7PpnLXnAvY#2}j{+gEwfGEoB;xt_Os zfT)v2;ly#aRh&D3G}s)+l;ZgBz*A@=BhW3Fol*o76ojv25$(U1uXkxLKbPm)-s{7B z87=>o#Du28heVpsdy}Lg>>{l_Q6vp*AreI<4O|)>YMd^Q4aDpmTZjr<^074O#N1;8G56T(OD?T+-cldKQD1Vx++%M# zK9QH~Xdo)$nvVldG~q%#@xt6=12I3x2BL);1C+-pK4UI9oq0XSkr(D3r$*tjs|`d& zT+cC;t9Fl}G1NF+AJuZhMZS1!ASz(xF_xSgsgh;gKg69(iKnG1_H9Ej-3@#RvMzNV^`&bz*^rUJRcW3LNQ#KPl|7V5;+wK}v3uh;5{78d8o6AO<#QA1mKob)xd zt2%FWj-$S&goVecO?cf^o~VSC$5^hIOU{H>VrUE1X2%Eh%x}&fq5{?)tz7N#*cPf{ zQ=^H+wHgZ~9qNpe?^Ymb;c8c{TrtApTIGqQN1CYi*5_#DiV4+(E00#L7-8v=CYBy) zV(HQRGNG0ptz0p}(j!eQJ<`O|W3L@ds3u&U5(Ru9%-URw)SWRa*xNb*CS0VJ<`O=qn4{(9yJ6;Se~Q( zij@|w^3e(;Bdk1Xfux0NqLwR0Sb1cL)j6`n%A=MmCR7uyJ!-jPgq25@Sb1cLl}AlZ zCe+HKmMcbBd1Q%|N0wN5?8#6~xIV`tDXcuQ#L6Q}v{3b7Zi75wjzj0KezpqXL<%d9 zLyK^|t1MC0&uhm-5>2=!j-;^i$P%k_WQi84J}ga^+I5aWR$zpcM=g-FaJ{Q6QLSb7 z09vjXq6sr%OQ@<|8cDRx*+W!N?orCsK95qa7-4;mB(e5L5^IlAu9#3wnC+^RD@Is* zB#E_0l306`Q)NP}JxaM^gtbSKSbHRiwa1!Car3ZVXsG$SbHRiz~l0n8x8+I$KGJM&8g2( zN;0#nz#~Tl9+%JlX!Ur@hpO0X6cY8hF zGD75$A|j6z5qW%ILN#GtAHzK(L>?(3@<j}#Gkq=?Al#Dt1Gj*Jj_q=?AlO#E8H(Q*Cwo=?)>JAR=d lO6&E({^(Jk%uQ!&V?x$>+3(BseJBYx$qM;jWL=;l{|g9#Ikf-) literal 0 HcmV?d00001 diff --git a/tests/extern.ml b/tests/extern.ml new file mode 100644 index 0000000..33819a8 --- /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 = 2 to 128 do + let x = Z.shift_left Z.one nbits in + output_value oc x; + output_value oc (Z.pred x); + output_value oc (Z.neg x); + output_value oc (Z.neg (Z.pred x)) + done; + close_out oc + diff --git a/tests/intern.ml b/tests/intern.ml new file mode 100644 index 0000000..cd359c2 --- /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 = 2 to 128 do + printf "%d:" nbits; + let x = Z.shift_left Z.one nbits in + expect ic x; + expect ic (Z.pred x); + expect ic (Z.neg x); + expect ic (Z.neg (Z.pred x)); + print_newline() + done; + close_in ic diff --git a/tests/intern.output3232 b/tests/intern.output3232 new file mode 100644 index 0000000..b2c34a1 --- /dev/null +++ b/tests/intern.output3232 @@ -0,0 +1,127 @@ +2: OK OK OK OK +3: OK OK OK OK +4: OK OK OK OK +5: OK OK OK OK +6: OK OK OK OK +7: OK OK OK OK +8: OK OK OK OK +9: OK OK OK OK +10: OK OK OK OK +11: OK OK OK OK +12: OK OK OK OK +13: OK OK OK OK +14: OK OK OK OK +15: OK OK OK OK +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..5327d0a --- /dev/null +++ b/tests/intern.output3264 @@ -0,0 +1,127 @@ +2: OK OK OK OK +3: OK OK OK OK +4: OK OK OK OK +5: OK OK OK OK +6: OK OK OK OK +7: OK OK OK OK +8: OK OK OK OK +9: OK OK OK OK +10: OK OK OK OK +11: OK OK OK OK +12: OK OK OK OK +13: OK OK OK OK +14: OK OK OK OK +15: OK OK OK OK +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 OK +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 Fail +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..5327d0a --- /dev/null +++ b/tests/intern.output6432 @@ -0,0 +1,127 @@ +2: OK OK OK OK +3: OK OK OK OK +4: OK OK OK OK +5: OK OK OK OK +6: OK OK OK OK +7: OK OK OK OK +8: OK OK OK OK +9: OK OK OK OK +10: OK OK OK OK +11: OK OK OK OK +12: OK OK OK OK +13: OK OK OK OK +14: OK OK OK OK +15: OK OK OK OK +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 OK +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 Fail +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..b2c34a1 --- /dev/null +++ b/tests/intern.output6464 @@ -0,0 +1,127 @@ +2: OK OK OK OK +3: OK OK OK OK +4: OK OK OK OK +5: OK OK OK OK +6: OK OK OK OK +7: OK OK OK OK +8: OK OK OK OK +9: OK OK OK OK +10: OK OK OK OK +11: OK OK OK OK +12: OK OK OK OK +13: OK OK OK OK +14: OK OK OK OK +15: OK OK OK OK +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