##// END OF EJS Templates
hg-core: check data integrity in `Revlog`...
Antoine Cezar -
r46102:b0d6309f default
parent child Browse files
Show More
@@ -202,6 +202,16 b' dependencies = ['
202 ]
202 ]
203
203
204 [[package]]
204 [[package]]
205 name = "fuchsia-cprng"
206 version = "0.1.1"
207 source = "registry+https://github.com/rust-lang/crates.io-index"
208
209 [[package]]
210 name = "gcc"
211 version = "0.3.55"
212 source = "registry+https://github.com/rust-lang/crates.io-index"
213
214 [[package]]
205 name = "getrandom"
215 name = "getrandom"
206 version = "0.1.15"
216 version = "0.1.15"
207 source = "registry+https://github.com/rust-lang/crates.io-index"
217 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -249,6 +259,7 b' dependencies = ['
249 "rand_pcg 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
259 "rand_pcg 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
250 "rayon 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
260 "rayon 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
251 "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
261 "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
262 "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
252 "same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
263 "same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
253 "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
264 "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
254 "twox-hash 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
265 "twox-hash 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -461,6 +472,27 b' dependencies = ['
461
472
462 [[package]]
473 [[package]]
463 name = "rand"
474 name = "rand"
475 version = "0.3.23"
476 source = "registry+https://github.com/rust-lang/crates.io-index"
477 dependencies = [
478 "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)",
479 "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
480 ]
481
482 [[package]]
483 name = "rand"
484 version = "0.4.6"
485 source = "registry+https://github.com/rust-lang/crates.io-index"
486 dependencies = [
487 "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
488 "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)",
489 "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
490 "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
491 "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
492 ]
493
494 [[package]]
495 name = "rand"
464 version = "0.7.3"
496 version = "0.7.3"
465 source = "registry+https://github.com/rust-lang/crates.io-index"
497 source = "registry+https://github.com/rust-lang/crates.io-index"
466 dependencies = [
498 dependencies = [
@@ -482,6 +514,19 b' dependencies = ['
482
514
483 [[package]]
515 [[package]]
484 name = "rand_core"
516 name = "rand_core"
517 version = "0.3.1"
518 source = "registry+https://github.com/rust-lang/crates.io-index"
519 dependencies = [
520 "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
521 ]
522
523 [[package]]
524 name = "rand_core"
525 version = "0.4.2"
526 source = "registry+https://github.com/rust-lang/crates.io-index"
527
528 [[package]]
529 name = "rand_core"
485 version = "0.5.1"
530 version = "0.5.1"
486 source = "registry+https://github.com/rust-lang/crates.io-index"
531 source = "registry+https://github.com/rust-lang/crates.io-index"
487 dependencies = [
532 dependencies = [
@@ -536,6 +581,14 b' dependencies = ['
536 ]
581 ]
537
582
538 [[package]]
583 [[package]]
584 name = "rdrand"
585 version = "0.4.0"
586 source = "registry+https://github.com/rust-lang/crates.io-index"
587 dependencies = [
588 "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
589 ]
590
591 [[package]]
539 name = "redox_syscall"
592 name = "redox_syscall"
540 version = "0.1.57"
593 version = "0.1.57"
541 source = "registry+https://github.com/rust-lang/crates.io-index"
594 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -576,6 +629,23 b' dependencies = ['
576 ]
629 ]
577
630
578 [[package]]
631 [[package]]
632 name = "rust-crypto"
633 version = "0.2.36"
634 source = "registry+https://github.com/rust-lang/crates.io-index"
635 dependencies = [
636 "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)",
637 "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)",
638 "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)",
639 "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
640 "time 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
641 ]
642
643 [[package]]
644 name = "rustc-serialize"
645 version = "0.3.24"
646 source = "registry+https://github.com/rust-lang/crates.io-index"
647
648 [[package]]
579 name = "same-file"
649 name = "same-file"
580 version = "1.0.6"
650 version = "1.0.6"
581 source = "registry+https://github.com/rust-lang/crates.io-index"
651 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -752,6 +822,8 b' dependencies = ['
752 "checksum either 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
822 "checksum either 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
753 "checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
823 "checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
754 "checksum flate2 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "766d0e77a2c1502169d4a93ff3b8c15a71fd946cd0126309752104e5f3c46d94"
824 "checksum flate2 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "766d0e77a2c1502169d4a93ff3b8c15a71fd946cd0126309752104e5f3c46d94"
825 "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
826 "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2"
755 "checksum getrandom 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
827 "checksum getrandom 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
756 "checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
828 "checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
757 "checksum hermit-abi 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c30f6d0bc6b00693347368a67d41b58f2fb851215ff1da49e90fe2c5c667151"
829 "checksum hermit-abi 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c30f6d0bc6b00693347368a67d41b58f2fb851215ff1da49e90fe2c5c667151"
@@ -781,18 +853,25 b' dependencies = ['
781 "checksum python3-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90af11779515a1e530af60782d273b59ac79d33b0e253c071a728563957c76d4"
853 "checksum python3-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90af11779515a1e530af60782d273b59ac79d33b0e253c071a728563957c76d4"
782 "checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
854 "checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
783 "checksum quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
855 "checksum quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
856 "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c"
857 "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
784 "checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
858 "checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
785 "checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
859 "checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
860 "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
861 "checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
786 "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
862 "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
787 "checksum rand_distr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96977acbdd3a6576fb1d27391900035bf3863d4a16422973a409b488cf29ffb2"
863 "checksum rand_distr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96977acbdd3a6576fb1d27391900035bf3863d4a16422973a409b488cf29ffb2"
788 "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
864 "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
789 "checksum rand_pcg 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
865 "checksum rand_pcg 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
790 "checksum rayon 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd016f0c045ad38b5251be2c9c0ab806917f82da4d36b2a327e5166adad9270"
866 "checksum rayon 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd016f0c045ad38b5251be2c9c0ab806917f82da4d36b2a327e5166adad9270"
791 "checksum rayon-core 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e8c4fec834fb6e6d2dd5eece3c7b432a52f0ba887cf40e595190c4107edc08bf"
867 "checksum rayon-core 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e8c4fec834fb6e6d2dd5eece3c7b432a52f0ba887cf40e595190c4107edc08bf"
868 "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
792 "checksum redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)" = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
869 "checksum redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)" = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
793 "checksum regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6"
870 "checksum regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6"
794 "checksum regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)" = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8"
871 "checksum regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)" = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8"
795 "checksum remove_dir_all 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
872 "checksum remove_dir_all 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
873 "checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a"
874 "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
796 "checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
875 "checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
797 "checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
876 "checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
798 "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
877 "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
@@ -25,6 +25,7 b' micro-timer = "0.3.0"'
25 log = "0.4.8"
25 log = "0.4.8"
26 memmap = "0.7.0"
26 memmap = "0.7.0"
27 zstd = "0.5.3"
27 zstd = "0.5.3"
28 rust-crypto = "0.2.36"
28
29
29 # We don't use the `miniz-oxide` backend because its minimum Rust version is
30 # We don't use the `miniz-oxide` backend because its minimum Rust version is
30 # `1.36`. However, this PR (https://github.com/Frommi/miniz_oxide/pull/84/files)
31 # `1.36`. However, this PR (https://github.com/Frommi/miniz_oxide/pull/84/files)
@@ -5,6 +5,7 b''
5 // This software may be used and distributed according to the terms of the
5 // This software may be used and distributed according to the terms of the
6 // GNU General Public License version 2 or any later version.
6 // GNU General Public License version 2 or any later version.
7
7
8 use crate::revlog::node::NULL_NODE_ID;
8 use crate::{
9 use crate::{
9 dirstate::{parsers::PARENT_SIZE, EntryState, SIZE_FROM_OTHER_PARENT},
10 dirstate::{parsers::PARENT_SIZE, EntryState, SIZE_FROM_OTHER_PARENT},
10 pack_dirstate, parse_dirstate,
11 pack_dirstate, parse_dirstate,
@@ -24,7 +25,6 b' use std::time::Duration;'
24
25
25 pub type FileFoldMap = FastHashMap<HgPathBuf, HgPathBuf>;
26 pub type FileFoldMap = FastHashMap<HgPathBuf, HgPathBuf>;
26
27
27 const NULL_ID: [u8; 20] = [0; 20];
28 const MTIME_UNSET: i32 = -1;
28 const MTIME_UNSET: i32 = -1;
29
29
30 #[derive(Default)]
30 #[derive(Default)]
@@ -72,8 +72,8 b' impl DirstateMap {'
72 self.non_normal_set = None;
72 self.non_normal_set = None;
73 self.other_parent_set = None;
73 self.other_parent_set = None;
74 self.set_parents(&DirstateParents {
74 self.set_parents(&DirstateParents {
75 p1: NULL_ID,
75 p1: NULL_NODE_ID,
76 p2: NULL_ID,
76 p2: NULL_NODE_ID,
77 })
77 })
78 }
78 }
79
79
@@ -340,8 +340,8 b' impl DirstateMap {'
340 };
340 };
341 } else if file_contents.is_empty() {
341 } else if file_contents.is_empty() {
342 parents = DirstateParents {
342 parents = DirstateParents {
343 p1: NULL_ID,
343 p1: NULL_NODE_ID,
344 p2: NULL_ID,
344 p2: NULL_NODE_ID,
345 };
345 };
346 } else {
346 } else {
347 return Err(DirstateError::Parse(DirstateParseError::Damaged));
347 return Err(DirstateError::Parse(DirstateParseError::Damaged));
@@ -1,5 +1,6 b''
1 use byteorder::{BigEndian, ByteOrder};
2
1 use crate::revlog::{Revision, NULL_REVISION};
3 use crate::revlog::{Revision, NULL_REVISION};
2 use byteorder::{BigEndian, ByteOrder};
3
4
4 pub const INDEX_ENTRY_SIZE: usize = 64;
5 pub const INDEX_ENTRY_SIZE: usize = 64;
5
6
@@ -141,6 +142,22 b" impl<'a> IndexEntry<'a> {"
141
142
142 BigEndian::read_i32(&self.bytes[16..])
143 BigEndian::read_i32(&self.bytes[16..])
143 }
144 }
145
146 pub fn p1(&self) -> Revision {
147 BigEndian::read_i32(&self.bytes[24..])
148 }
149
150 pub fn p2(&self) -> Revision {
151 BigEndian::read_i32(&self.bytes[28..])
152 }
153
154 /// Return the hash of revision's full text.
155 ///
156 /// Currently, SHA-1 is used and only the first 20 bytes of this field
157 /// are used.
158 pub fn hash(&self) -> &[u8] {
159 &self.bytes[32..52]
160 }
144 }
161 }
145
162
146 #[cfg(test)]
163 #[cfg(test)]
@@ -16,7 +16,12 b' use hex::{self, FromHex, FromHexError};'
16 /// are private so that calling code does not expect all nodes have
16 /// are private so that calling code does not expect all nodes have
17 /// the same size, should we support several formats concurrently in
17 /// the same size, should we support several formats concurrently in
18 /// the future.
18 /// the future.
19 const NODE_BYTES_LENGTH: usize = 20;
19 pub const NODE_BYTES_LENGTH: usize = 20;
20
21 /// Id of the null node.
22 ///
23 /// Used to indicate the absence of node.
24 pub const NULL_NODE_ID: [u8; NODE_BYTES_LENGTH] = [0u8; NODE_BYTES_LENGTH];
20
25
21 /// The length in bytes of a `Node`
26 /// The length in bytes of a `Node`
22 ///
27 ///
@@ -5,12 +5,15 b' use std::ops::Deref;'
5 use std::path::Path;
5 use std::path::Path;
6
6
7 use byteorder::{BigEndian, ByteOrder};
7 use byteorder::{BigEndian, ByteOrder};
8 use crypto::digest::Digest;
9 use crypto::sha1::Sha1;
8 use flate2::read::ZlibDecoder;
10 use flate2::read::ZlibDecoder;
9 use memmap::{Mmap, MmapOptions};
11 use memmap::{Mmap, MmapOptions};
10 use micro_timer::timed;
12 use micro_timer::timed;
11 use zstd;
13 use zstd;
12
14
13 use super::index::Index;
15 use super::index::Index;
16 use super::node::{NODE_BYTES_LENGTH, NULL_NODE_ID};
14 use super::patch;
17 use super::patch;
15 use crate::revlog::Revision;
18 use crate::revlog::Revision;
16
19
@@ -93,11 +96,50 b' impl Revlog {'
93 .map_err(|_| RevlogError::Corrupted)?;
96 .map_err(|_| RevlogError::Corrupted)?;
94 }
97 }
95
98
96 if delta_chain.is_empty() {
99 // TODO do not look twice in the index
97 Ok(entry.data()?.into())
100 let index = self.index();
101 let index_entry =
102 index.get_entry(rev).ok_or(RevlogError::InvalidRevision)?;
103
104 let data: Vec<u8> = if delta_chain.is_empty() {
105 entry.data()?.into()
106 } else {
107 Revlog::build_data_from_deltas(entry, &delta_chain)?
108 };
109
110 if self.check_hash(
111 index_entry.p1(),
112 index_entry.p2(),
113 index_entry.hash(),
114 &data,
115 ) {
116 Ok(data)
98 } else {
117 } else {
99 Revlog::build_data_from_deltas(entry, &delta_chain)
118 Err(RevlogError::Corrupted)
119 }
100 }
120 }
121
122 /// Check the hash of some given data against the recorded hash.
123 pub fn check_hash(
124 &self,
125 p1: Revision,
126 p2: Revision,
127 expected: &[u8],
128 data: &[u8],
129 ) -> bool {
130 let index = self.index();
131 let e1 = index.get_entry(p1);
132 let h1 = match e1 {
133 Some(ref entry) => entry.hash(),
134 None => &NULL_NODE_ID,
135 };
136 let e2 = index.get_entry(p2);
137 let h2 = match e2 {
138 Some(ref entry) => entry.hash(),
139 None => &NULL_NODE_ID,
140 };
141
142 hash(data, &h1, &h2).as_slice() == expected
101 }
143 }
102
144
103 /// Build the full data of a revision out its snapshot
145 /// Build the full data of a revision out its snapshot
@@ -234,6 +276,23 b' pub fn get_version(index_bytes: &[u8]) -'
234 BigEndian::read_u16(&index_bytes[2..=3])
276 BigEndian::read_u16(&index_bytes[2..=3])
235 }
277 }
236
278
279 /// Calculate the hash of a revision given its data and its parents.
280 fn hash(data: &[u8], p1_hash: &[u8], p2_hash: &[u8]) -> Vec<u8> {
281 let mut hasher = Sha1::new();
282 let (a, b) = (p1_hash, p2_hash);
283 if a > b {
284 hasher.input(b);
285 hasher.input(a);
286 } else {
287 hasher.input(a);
288 hasher.input(b);
289 }
290 hasher.input(data);
291 let mut hash = vec![0; NODE_BYTES_LENGTH];
292 hasher.result(&mut hash);
293 hash
294 }
295
237 #[cfg(test)]
296 #[cfg(test)]
238 mod tests {
297 mod tests {
239 use super::*;
298 use super::*;
General Comments 0
You need to be logged in to leave comments. Login now