ma1 pushed to branch tor-browser-115.20.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
-
e6ac6148
by Kershaw Chang at 2025-02-03T12:42:15+01:00
-
efa40325
by Dana Keeler at 2025-02-03T12:42:22+01:00
4 changed files:
- netwerk/dns/nsHostRecord.cpp
- netwerk/dns/nsHostRecord.h
- netwerk/dns/nsHostResolver.cpp
- security/manager/ssl/cert_storage/src/lib.rs
Changes:
... | ... | @@ -39,6 +39,15 @@ nsHostKey::nsHostKey(const nsACString& aHost, const nsACString& aTrrServer, |
39 | 39 | pb(aPb),
|
40 | 40 | originSuffix(aOriginsuffix) {}
|
41 | 41 | |
42 | +nsHostKey::nsHostKey(const nsHostKey& other)
|
|
43 | + : host(other.host),
|
|
44 | + mTrrServer(other.mTrrServer),
|
|
45 | + type(other.type),
|
|
46 | + flags(other.flags),
|
|
47 | + af(other.af),
|
|
48 | + pb(other.pb),
|
|
49 | + originSuffix(other.originSuffix) {}
|
|
50 | + |
|
42 | 51 | bool nsHostKey::operator==(const nsHostKey& other) const {
|
43 | 52 | return host == other.host && mTrrServer == other.mTrrServer &&
|
44 | 53 | type == other.type &&
|
... | ... | @@ -79,13 +79,15 @@ struct nsHostKey { |
79 | 79 | const nsCString host;
|
80 | 80 | const nsCString mTrrServer;
|
81 | 81 | uint16_t type = 0;
|
82 | - nsIDNSService::DNSFlags flags = nsIDNSService::RESOLVE_DEFAULT_FLAGS;
|
|
82 | + mozilla::Atomic<nsIDNSService::DNSFlags> flags{
|
|
83 | + nsIDNSService::RESOLVE_DEFAULT_FLAGS};
|
|
83 | 84 | uint16_t af = 0;
|
84 | 85 | bool pb = false;
|
85 | 86 | const nsCString originSuffix;
|
86 | 87 | explicit nsHostKey(const nsACString& host, const nsACString& aTrrServer,
|
87 | 88 | uint16_t type, nsIDNSService::DNSFlags flags, uint16_t af,
|
88 | 89 | bool pb, const nsACString& originSuffix);
|
90 | + explicit nsHostKey(const nsHostKey& other);
|
|
89 | 91 | bool operator==(const nsHostKey& other) const;
|
90 | 92 | size_t SizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const;
|
91 | 93 | PLDHashNumber Hash() const;
|
... | ... | @@ -1116,7 +1116,8 @@ nsresult nsHostResolver::NameLookup(nsHostRecord* rec, |
1116 | 1116 | }
|
1117 | 1117 | |
1118 | 1118 | LOG(("NameLookup: %s effectiveTRRmode: %d flags: %X", rec->host.get(),
|
1119 | - static_cast<nsIRequest::TRRMode>(rec->mEffectiveTRRMode), rec->flags));
|
|
1119 | + static_cast<nsIRequest::TRRMode>(rec->mEffectiveTRRMode),
|
|
1120 | + static_cast<uint32_t>(rec->flags)));
|
|
1120 | 1121 | |
1121 | 1122 | if (rec->flags & nsIDNSService::RESOLVE_DISABLE_TRR) {
|
1122 | 1123 | rec->RecordReason(TRRSkippedReason::TRR_DISABLED_FLAG);
|
... | ... | @@ -1900,8 +1901,9 @@ void nsHostResolver::GetDNSCacheEntries(nsTArray<DNSCacheEntries>* args) { |
1900 | 1901 | }
|
1901 | 1902 | |
1902 | 1903 | info.originAttributesSuffix = recordEntry.GetKey().originSuffix;
|
1903 | - info.flags = nsPrintfCString("%u|0x%x|%u|%d|%s", rec->type, rec->flags,
|
|
1904 | - rec->af, rec->pb, rec->mTrrServer.get());
|
|
1904 | + info.flags = nsPrintfCString("%u|0x%x|%u|%d|%s", rec->type,
|
|
1905 | + static_cast<uint32_t>(rec->flags), rec->af,
|
|
1906 | + rec->pb, rec->mTrrServer.get());
|
|
1905 | 1907 | |
1906 | 1908 | args->AppendElement(std::move(info));
|
1907 | 1909 | }
|
... | ... | @@ -40,6 +40,7 @@ use rkv::{StoreError, StoreOptions, Value}; |
40 | 40 | use rust_cascade::Cascade;
|
41 | 41 | use sha2::{Digest, Sha256};
|
42 | 42 | use std::collections::{HashMap, HashSet};
|
43 | +use std::convert::TryInto;
|
|
43 | 44 | use std::ffi::CString;
|
44 | 45 | use std::fmt::Display;
|
45 | 46 | use std::fs::{create_dir_all, remove_file, File, OpenOptions};
|
... | ... | @@ -266,10 +267,10 @@ impl SecurityState { |
266 | 267 | };
|
267 | 268 | let reader = env_and_store.env.read()?;
|
268 | 269 | match env_and_store.store.get(&reader, key) {
|
269 | - Ok(Some(Value::I64(i)))
|
|
270 | - if i <= (std::i16::MAX as i64) && i >= (std::i16::MIN as i64) =>
|
|
271 | - {
|
|
272 | - Ok(Some(i as i16))
|
|
270 | + Ok(Some(Value::I64(i))) => {
|
|
271 | + Ok(Some(i.try_into().map_err(|_| {
|
|
272 | + SecurityStateError::from("Stored value out of range for i16")
|
|
273 | + })?))
|
|
273 | 274 | }
|
274 | 275 | Ok(None) => Ok(None),
|
275 | 276 | Ok(_) => Err(SecurityStateError::from(
|
... | ... | @@ -893,10 +894,10 @@ struct Cert<'a> { |
893 | 894 | |
894 | 895 | impl<'a> Cert<'a> {
|
895 | 896 | fn new(der: &'a [u8], subject: &'a [u8], trust: i16) -> Result<Cert<'a>, SecurityStateError> {
|
896 | - if der.len() > u16::max as usize {
|
|
897 | + if der.len() > u16::MAX.into() {
|
|
897 | 898 | return Err(SecurityStateError::from("certificate is too long"));
|
898 | 899 | }
|
899 | - if subject.len() > u16::max as usize {
|
|
900 | + if subject.len() > u16::MAX.into() {
|
|
900 | 901 | return Err(SecurityStateError::from("subject is too long"));
|
901 | 902 | }
|
902 | 903 | Ok(Cert {
|
... | ... | @@ -920,7 +921,7 @@ impl<'a> Cert<'a> { |
920 | 921 | return Err(SecurityStateError::from("invalid Cert: no der len?"));
|
921 | 922 | }
|
922 | 923 | let (mut der_len, rest) = rest.split_at(size_of::<u16>());
|
923 | - let der_len = der_len.read_u16::<NetworkEndian>()? as usize;
|
|
924 | + let der_len = der_len.read_u16::<NetworkEndian>()?.into();
|
|
924 | 925 | if rest.len() < der_len {
|
925 | 926 | return Err(SecurityStateError::from("invalid Cert: no der?"));
|
926 | 927 | }
|
... | ... | @@ -930,7 +931,7 @@ impl<'a> Cert<'a> { |
930 | 931 | return Err(SecurityStateError::from("invalid Cert: no subject len?"));
|
931 | 932 | }
|
932 | 933 | let (mut subject_len, rest) = rest.split_at(size_of::<u16>());
|
933 | - let subject_len = subject_len.read_u16::<NetworkEndian>()? as usize;
|
|
934 | + let subject_len = subject_len.read_u16::<NetworkEndian>()?.into();
|
|
934 | 935 | if rest.len() < subject_len {
|
935 | 936 | return Err(SecurityStateError::from("invalid Cert: no subject?"));
|
936 | 937 | }
|
... | ... | @@ -961,15 +962,19 @@ impl<'a> Cert<'a> { |
961 | 962 | + size_of::<i16>(),
|
962 | 963 | );
|
963 | 964 | bytes.write_u8(CERT_SERIALIZATION_VERSION_1)?;
|
964 | - if self.der.len() > u16::max as usize {
|
|
965 | - return Err(SecurityStateError::from("certificate is too long"));
|
|
966 | - }
|
|
967 | - bytes.write_u16::<NetworkEndian>(self.der.len() as u16)?;
|
|
965 | + bytes.write_u16::<NetworkEndian>(
|
|
966 | + self.der
|
|
967 | + .len()
|
|
968 | + .try_into()
|
|
969 | + .map_err(|_| SecurityStateError::from("certificate is too long"))?,
|
|
970 | + )?;
|
|
968 | 971 | bytes.extend_from_slice(&self.der);
|
969 | - if self.subject.len() > u16::max as usize {
|
|
970 | - return Err(SecurityStateError::from("subject is too long"));
|
|
971 | - }
|
|
972 | - bytes.write_u16::<NetworkEndian>(self.subject.len() as u16)?;
|
|
972 | + bytes.write_u16::<NetworkEndian>(
|
|
973 | + self.subject
|
|
974 | + .len()
|
|
975 | + .try_into()
|
|
976 | + .map_err(|_| SecurityStateError::from("subject is too long"))?,
|
|
977 | + )?;
|
|
973 | 978 | bytes.extend_from_slice(&self.subject);
|
974 | 979 | bytes.write_i16::<NetworkEndian>(self.trust)?;
|
975 | 980 | Ok(bytes)
|
... | ... | @@ -1183,7 +1188,7 @@ fn load_crlite_stash_from_reader_into_map( |
1183 | 1188 | let issuer_spki_hash_len = reader.read_u8().map_err(|e| {
|
1184 | 1189 | SecurityStateError::from(format!("error reading stash issuer_spki_hash_len: {}", e))
|
1185 | 1190 | })?;
|
1186 | - let mut issuer_spki_hash = vec![0; issuer_spki_hash_len as usize];
|
|
1191 | + let mut issuer_spki_hash = vec![0; issuer_spki_hash_len.into()];
|
|
1187 | 1192 | reader.read_exact(&mut issuer_spki_hash).map_err(|e| {
|
1188 | 1193 | SecurityStateError::from(format!("error reading stash issuer_spki_hash: {}", e))
|
1189 | 1194 | })?;
|
... | ... | @@ -1192,7 +1197,7 @@ fn load_crlite_stash_from_reader_into_map( |
1192 | 1197 | let serial_len = reader.read_u8().map_err(|e| {
|
1193 | 1198 | SecurityStateError::from(format!("error reading stash serial_len: {}", e))
|
1194 | 1199 | })?;
|
1195 | - let mut serial = vec![0; serial_len as usize];
|
|
1200 | + let mut serial = vec![0; serial_len.into()];
|
|
1196 | 1201 | reader.read_exact(&mut serial).map_err(|e| {
|
1197 | 1202 | SecurityStateError::from(format!("error reading stash serial: {}", e))
|
1198 | 1203 | })?;
|