aboutsummaryrefslogtreecommitdiffhomepage
path: root/checker/check.ml
diff options
context:
space:
mode:
authorGravatar Maxime Dénès <mail@maximedenes.fr>2017-12-05 10:38:36 +0100
committerGravatar Maxime Dénès <mail@maximedenes.fr>2017-12-05 10:38:36 +0100
commitd403b2200ef32afd1eb1087a1f0ef2e6b8bb93f6 (patch)
tree1fdf7b431f2351f9cc569011b06d458b3cfc25ee /checker/check.ml
parent423b7298535c88b14926e92a8763420c69f89f6d (diff)
parent8f47273f118808373649a3a084e4a3c99167edd3 (diff)
Merge PR #6266: Safe unmarshalling in the checker
Diffstat (limited to 'checker/check.ml')
-rw-r--r--checker/check.ml21
1 files changed, 15 insertions, 6 deletions
diff --git a/checker/check.ml b/checker/check.ml
index 21fdba1fa..44105aa72 100644
--- a/checker/check.ml
+++ b/checker/check.ml
@@ -308,18 +308,27 @@ let name_clash_message dir mdir f =
(* Dependency graph *)
let depgraph = ref LibraryMap.empty
+let marshal_in_segment f ch =
+ try
+ let stop = input_binary_int ch in
+ let v = Analyze.instantiate (Analyze.parse_channel ch) in
+ let digest = Digest.input ch in
+ Obj.obj v, stop, digest
+ with _ ->
+ user_err (str "Corrupted file " ++ quote (str f))
+
let intern_from_file (dir, f) =
Flags.if_verbose chk_pp (str"[intern "++str f++str" ...");
let (sd,md,table,opaque_csts,digest) =
try
let ch = System.with_magic_number_check raw_intern_library f in
- let (sd:Cic.summary_disk), _, digest = System.marshal_in_segment f ch in
- let (md:Cic.library_disk), _, digest = System.marshal_in_segment f ch in
- let (opaque_csts:'a option), _, udg = System.marshal_in_segment f ch in
- let (discharging:'a option), _, _ = System.marshal_in_segment f ch in
- let (tasks:'a option), _, _ = System.marshal_in_segment f ch in
+ let (sd:Cic.summary_disk), _, digest = marshal_in_segment f ch in
+ let (md:Cic.library_disk), _, digest = marshal_in_segment f ch in
+ let (opaque_csts:'a option), _, udg = marshal_in_segment f ch in
+ let (discharging:'a option), _, _ = marshal_in_segment f ch in
+ let (tasks:'a option), _, _ = marshal_in_segment f ch in
let (table:Cic.opaque_table), pos, checksum =
- System.marshal_in_segment f ch in
+ marshal_in_segment f ch in
(* Verification of the final checksum *)
let () = close_in ch in
let ch = open_in_bin f in