From c37a465897c3bf6663140858ca82e9dd04f9c036 Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Sun, 10 Dec 2023 19:24:38 +0100 Subject: [PATCH 1/3] 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 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 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 From 8c6a5d7c42665e5ce8043bd489d657a65fa3f1e5 Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Wed, 3 Jan 2024 10:19:25 +0100 Subject: [PATCH 2/3] Reword comment about delicate points of unmarshaling --- caml_z.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/caml_z.c b/caml_z.c index c0b11c4..85563eb 100644 --- a/caml_z.c +++ b/caml_z.c @@ -3395,14 +3395,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). - 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). - */ +/* 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; From d1193ab562653b8b866558cdc757dfa68a60c52d Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Wed, 3 Jan 2024 14:08:42 +0100 Subject: [PATCH 3/3] Cleaned up the extern/intern test --- tests/extern.data32 | Bin 23522 -> 22300 bytes tests/extern.data64 | Bin 21510 -> 20292 bytes tests/extern.ml | 8 ++++---- tests/intern.ml | 8 ++++---- tests/intern.output3232 | 14 -------------- tests/intern.output3264 | 18 ++---------------- tests/intern.output6432 | 18 ++---------------- tests/intern.output6464 | 14 -------------- 8 files changed, 12 insertions(+), 68 deletions(-) diff --git a/tests/extern.data32 b/tests/extern.data32 index 60d155d7ed0ac761c3dec73daeceb444125bc32b..003164380b9f39c6d2c612ee7d827f049868dfd1 100644 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 23522 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 bzlTFdlX7+NyXxAyUV=la0(Mh1+))1q)^6Tx diff --git a/tests/extern.data64 b/tests/extern.data64 index 096750b0952b63b33181f8220c1803e4f13a813a..6d0c104c5f689800432dc3c101c5d765f9111664 100644 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 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-) diff --git a/tests/extern.ml b/tests/extern.ml index 33819a8..247677b 100644 --- a/tests/extern.ml +++ b/tests/extern.ml @@ -3,12 +3,12 @@ let _ = let file = Sys.argv.(1) in let oc = open_out_bin file in - for nbits = 2 to 128 do + for nbits = 16 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.pred (Z.neg x)); output_value oc (Z.neg x); - output_value oc (Z.neg (Z.pred 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 index cd359c2..c7940ae 100644 --- a/tests/intern.ml +++ b/tests/intern.ml @@ -12,13 +12,13 @@ let expect ic n = let _ = let file = Sys.argv.(1) in let ic = open_in_bin file in - for nbits = 2 to 128 do + for nbits = 16 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.pred (Z.neg x)); expect ic (Z.neg x); - expect ic (Z.neg (Z.pred 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 index b2c34a1..9029dd2 100644 --- a/tests/intern.output3232 +++ b/tests/intern.output3232 @@ -1,17 +1,3 @@ -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 diff --git a/tests/intern.output3264 b/tests/intern.output3264 index 5327d0a..bcacdfb 100644 --- a/tests/intern.output3264 +++ b/tests/intern.output3264 @@ -1,17 +1,3 @@ -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 @@ -26,7 +12,7 @@ 27: OK OK OK OK 28: OK OK OK OK 29: OK OK OK OK -30: Fail OK OK OK +30: Fail OK OK Fail 31: Fail Fail Fail Fail 32: Fail Fail Fail Fail 33: Fail Fail Fail Fail @@ -58,7 +44,7 @@ 59: Fail Fail Fail Fail 60: Fail Fail Fail Fail 61: Fail Fail Fail Fail -62: OK Fail Fail Fail +62: OK Fail Fail OK 63: OK OK OK OK 64: OK OK OK OK 65: OK OK OK OK diff --git a/tests/intern.output6432 b/tests/intern.output6432 index 5327d0a..bcacdfb 100644 --- a/tests/intern.output6432 +++ b/tests/intern.output6432 @@ -1,17 +1,3 @@ -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 @@ -26,7 +12,7 @@ 27: OK OK OK OK 28: OK OK OK OK 29: OK OK OK OK -30: Fail OK OK OK +30: Fail OK OK Fail 31: Fail Fail Fail Fail 32: Fail Fail Fail Fail 33: Fail Fail Fail Fail @@ -58,7 +44,7 @@ 59: Fail Fail Fail Fail 60: Fail Fail Fail Fail 61: Fail Fail Fail Fail -62: OK Fail Fail Fail +62: OK Fail Fail OK 63: OK OK OK OK 64: OK OK OK OK 65: OK OK OK OK diff --git a/tests/intern.output6464 b/tests/intern.output6464 index b2c34a1..9029dd2 100644 --- a/tests/intern.output6464 +++ b/tests/intern.output6464 @@ -1,17 +1,3 @@ -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