diff options
author | Maxime Dénès <mail@maximedenes.fr> | 2017-12-05 10:38:36 +0100 |
---|---|---|
committer | Maxime Dénès <mail@maximedenes.fr> | 2017-12-05 10:38:36 +0100 |
commit | d403b2200ef32afd1eb1087a1f0ef2e6b8bb93f6 (patch) | |
tree | 1fdf7b431f2351f9cc569011b06d458b3cfc25ee /checker/check.ml | |
parent | 423b7298535c88b14926e92a8763420c69f89f6d (diff) | |
parent | 8f47273f118808373649a3a084e4a3c99167edd3 (diff) |
Merge PR #6266: Safe unmarshalling in the checker
Diffstat (limited to 'checker/check.ml')
-rw-r--r-- | checker/check.ml | 21 |
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 |