[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[tor-commits] [tor-browser-build/master] Bug 40208: Mitigate uniffi non-deterministic code generation



commit da8e19806b810860dc40a9dd02abd6cff6888b2b
Author: Matthew Finkel <sysrqb@xxxxxxxxxxxxxx>
Date:   Thu Jan 21 00:08:36 2021 +0000

    Bug 40208: Mitigate uniffi non-deterministic code generation
---
 projects/uniffi-rs/btreeset.patch | 31 +++++++++++++++++++++++++++++++
 projects/uniffi-rs/build          |  8 ++++++++
 projects/uniffi-rs/config         |  1 +
 3 files changed, 40 insertions(+)

diff --git a/projects/uniffi-rs/btreeset.patch b/projects/uniffi-rs/btreeset.patch
new file mode 100644
index 0000000..cb81a00
--- /dev/null
+++ b/projects/uniffi-rs/btreeset.patch
@@ -0,0 +1,31 @@
+diff --git a/uniffi_bindgen/src/interface/types.rs b/uniffi_bindgen/src/interface/types.rs
+index 6448d58..b7efd22 100644
+--- a/uniffi_bindgen/src/interface/types.rs
++++ b/uniffi_bindgen/src/interface/types.rs
+@@ -26,7 +26,7 @@
+ use anyhow::bail;
+ use anyhow::Result;
+ use std::convert::TryFrom;
+-use std::{collections::hash_map::Entry, collections::HashMap, collections::HashSet};
++use std::{collections::hash_map::Entry, collections::HashMap, collections::BTreeSet};
+ 
+ use super::Attributes;
+ 
+@@ -71,7 +71,7 @@ pub enum FFIType {
+ /// Represents all the different high-level types that can be used in a component interface.
+ /// At this level we identify user-defined types by name, without knowing any details
+ /// of their internal structure apart from what type of thing they are (record, enum, etc).
+-#[derive(Debug, Clone, Eq, PartialEq, Hash)]
++#[derive(Debug, Clone, Eq, PartialEq, Hash, PartialOrd, Ord)]
+ pub enum Type {
+     // Primitive types.
+     UInt8,
+@@ -195,7 +195,7 @@ pub(crate) struct TypeUniverse {
+     // Named type definitions (including aliases).
+     type_definitions: HashMap<String, Type>,
+     // All the types in the universe, by canonical type name.
+-    all_known_types: HashSet<Type>,
++    all_known_types: BTreeSet<Type>,
+ }
+ 
+ impl TypeUniverse {
diff --git a/projects/uniffi-rs/build b/projects/uniffi-rs/build
index 60ba1b1..1663071 100644
--- a/projects/uniffi-rs/build
+++ b/projects/uniffi-rs/build
@@ -22,6 +22,14 @@ replace-with = "vendored-sources"
 directory = "/var/tmp/build/uniffi-rs/vendor"
 EOF
 
+# We change the data type of the `all_known_types` Set from HashSet to BTreeSet.
+# Uniffi iterates over the elements of this set, and iteration over a HashSet occurs
+# in an arbitrary order, while iteration over a BTreeSet orders in a defined (and
+# deterministic) order. This patch solves a build reproducibility issue, see
+# tor-browser-build#40208.
+#
+# Upstream bug: https://github.com/mozilla/uniffi-rs/issues/374
+patch -p1 < $rootdir/btreeset.patch
 # We usually use --frozen but there is no Cargo.lock file available. Thus resort
 # to --offline.
 cargo build --release --offline --target x86_64-unknown-linux-gnu
diff --git a/projects/uniffi-rs/config b/projects/uniffi-rs/config
index 5dda990..7d89cc2 100644
--- a/projects/uniffi-rs/config
+++ b/projects/uniffi-rs/config
@@ -15,3 +15,4 @@ input_files:
   # `cargo vendor vendor` in the `uniffi-rs` directory has vendored the sources.
   - URL: https://people.torproject.org/~gk/mirrors/sources/uniffi-rs-vendor-[% c('version') %].tar.bz2
     sha256sum: 71d912237208c35a762b3c812afe0a758823792dd745c1253314bcccc1694b7f
+  - filename: btreeset.patch

_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits