diff --git a/.cargo/config.in b/.cargo/config.in index 542017d59a97..f4157cdc1c3f 100644 --- a/.cargo/config.in +++ b/.cargo/config.in @@ -20,7 +20,7 @@ rev = "4af6c367603869a30fddb5ffb0aba2b9477ba92e" [source."https://github.com/msirringhaus/minidump_writer_linux.git"] git = "https://github.com/msirringhaus/minidump_writer_linux.git" replace-with = "vendored-sources" -rev = "4ea371049a9cca212cc13c19b7952c1c014085c6" +rev = "43c33ea35e9d97259a3877c115cbd3527c10b33a" [source."https://github.com/mozilla/neqo"] git = "https://github.com/mozilla/neqo" diff --git a/Cargo.lock b/Cargo.lock index b5d223c6c8cc..609bbc250ec5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3124,7 +3124,7 @@ dependencies = [ [[package]] name = "minidump_writer_linux" version = "0.1.0" -source = "git+https://github.com/msirringhaus/minidump_writer_linux.git?rev=4ea371049a9cca212cc13c19b7952c1c014085c6#4ea371049a9cca212cc13c19b7952c1c014085c6" +source = "git+https://github.com/msirringhaus/minidump_writer_linux.git?rev=43c33ea35e9d97259a3877c115cbd3527c10b33a#43c33ea35e9d97259a3877c115cbd3527c10b33a" dependencies = [ "byteorder", "goblin", diff --git a/Cargo.toml b/Cargo.toml index ef57b309fc2b..24d3586eaff1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -81,7 +81,7 @@ spirv_cross = { git = "https://github.com/kvark/spirv_cross", branch = "wgpu4" } # failure's backtrace feature might break our builds, see bug 1608157. failure = { git = "https://github.com/badboy/failure", rev = "64af847bc5fdcb6d2438bec8a6030812a80519a5" } failure_derive = { git = "https://github.com/badboy/failure", rev = "64af847bc5fdcb6d2438bec8a6030812a80519a5" } -minidump_writer_linux = { git = "https://github.com/msirringhaus/minidump_writer_linux.git", rev = "4ea371049a9cca212cc13c19b7952c1c014085c6" } +minidump_writer_linux = { git = "https://github.com/msirringhaus/minidump_writer_linux.git", rev = "43c33ea35e9d97259a3877c115cbd3527c10b33a" } [patch.crates-io.cranelift-codegen] git = "https://github.com/mozilla-spidermonkey/wasmtime" diff --git a/third_party/rust/minidump_writer_linux/.cargo-checksum.json b/third_party/rust/minidump_writer_linux/.cargo-checksum.json index 7d5bbf58d0db..46b1b610252b 100644 --- a/third_party/rust/minidump_writer_linux/.cargo-checksum.json +++ b/third_party/rust/minidump_writer_linux/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"d83f06b41499b1f763f31498c5412b946a09b93454555140f37b0edd66959e4b","LICENSE":"1ecdd8e8977af83c07c5f97bec87b47d27059b7ea323ca3160fbfa2314f5d99c","src/app_memory.rs":"909676c916c0ffaa3a813632c162f5b1207f8502408b6b3bab48a5f842948c71","src/auxv_reader.rs":"6aff2c1ef3ad0942b93445f5098b07789afbce512f6b4055e9c195df307aea27","src/bin/test.rs":"2278080fd4a13ec5423cb99d7e97a677ea6d73e29c7a99038175ee7a9dfe9c4f","src/cpu_set.rs":"7094f972a7217bf20eeb5b504802177b7aa5dd6cf220235e858fc42259c52f59","src/crash_context/crash_context_aarch64.rs":"97da8a6a66a53ebee4e329c4b01c0a68e74d707adbfb6f2e3ed6fd4318289d0f","src/crash_context/crash_context_arm.rs":"ddf1be0f67e4f43dfae8373d1b902065c671435bbeb7cf4428b2bcb218a1c25a","src/crash_context/crash_context_mips.rs":"3e263d547a3f13ee81d1557a13db6bbd446133821986c2ded94d361634ec1f3a","src/crash_context/crash_context_x86.rs":"8c8566be3c103ec65c83e8f9b2ad4f7a6f19f17656be4b4deed50d7723cc57d8","src/crash_context/crash_context_x86_64.rs":"c658a81a31d66a38c52ffbe816e3945301173f9e6e98c795a822a06be40968bc","src/crash_context/mod.rs":"1578792d46480a79982943ee3b820958ea335a847bbb6b74f44bead6edf17078","src/dso_debug.rs":"c11c6c4d64974042051f000818ac4c3a8895ed2757076612f9209e885d2d5d33","src/dumper_cpu_info/cpu_info_arm.rs":"137953f8424ffb38f89f8fc436a462a64b42583ab36d00d897a81e297736d2d9","src/dumper_cpu_info/cpu_info_x86_mips.rs":"c42db73377cee066f9d4ddca13a77a0692eef513fcefde1f2b91dacce6778f89","src/dumper_cpu_info/mod.rs":"320b629c23ffa30eaead762a74e500f0bc029793234461ef2959681b7650b1e9","src/lib.rs":"87375f3a4cfadb91fd366cb75e1959a08e654e5225955ed56e15d6fc9d208aa0","src/linux_ptrace_dumper.rs":"7095c6adc0d94283a90bdd97a9458df29a7bf2685624e568bc1be8fb1a223baf","src/maps_reader.rs":"7333d74e635b1b7653df25411e23f133c2025e835339f38bf44d7ae5c29e001a","src/minidump_cpu/minidump_cpu_aarch64.rs":"18524f8a3a3d3eda7d0fafb1c168ff06dee1886da0f4278f3c2a54147ef79bc9","src/minidump_cpu/minidump_cpu_amd64.rs":"c4b3cef86ea53864c026d7c598d8a7f59ca6b1ad7e881f94ce34f39dd6b72e33","src/minidump_cpu/minidump_cpu_arm.rs":"2b95ecef302de39a0c105011392dc1419dd3f62762482038318f564d5ed3797a","src/minidump_cpu/minidump_cpu_mips.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_ppc.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_ppc64.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_sparc.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_x86.rs":"3dcb2aa4264d76f0727b9750ffce0032738bea97be95fde92089a9d11926c63c","src/minidump_cpu/mod.rs":"50e8df5e294e9d162c97dacb9448bba0ffc1e4bf992f8a2b9cc718f12b92a370","src/minidump_format.rs":"56f737bd95fbbd5b4b3d7773dc491e267887d78b12916645bccbcef16acf2cfc","src/minidump_writer.rs":"5e5cf95b9efa7f8a8ad48c43c03e8a4101efee4206a4a14f92a5cdb676d5e6b6","src/sections/app_memory.rs":"13074b16ffbd144e0cc209ad2cb64571dbb74ba987f65026338645d440e3cd89","src/sections/exception_stream.rs":"08562fcd73e48ce5d251080504526f4f7e65f536325da816f69ff0d8354f4bc4","src/sections/mappings.rs":"15d489a3d053627c793a6794c85bc9d38d72a7299e496142cc38afa2c2a8d54c","src/sections/memory_list_stream.rs":"c15ec66f844122f98d553be501e881837275709d0d8e5ec4ecf4d076fcaf79d7","src/sections/mod.rs":"71911a6265365b75e74b87a83754ae60af7f17bf1faf539450e3cd1dc9a9f0c0","src/sections/systeminfo_stream.rs":"70f8d62a86a874536edfeb9ad0a47916fe90934ae0b29b61ed871335ac2f776f","src/sections/thread_list_stream.rs":"f69de2e50c033d5a1c6a597b942025a6442e71158f376c6afcfe6f3ac929dad7","src/thread_info/mod.rs":"d86206025f4a9612caa90391231403c9bc6512a85309eb4f53b95826ad837215","src/thread_info/thread_info_aarch64.rs":"941bcf68a03d647b946bda2e1542d8965b827e392eb3e4fb4e0193f7e300e12c","src/thread_info/thread_info_arm.rs":"60a9008a4e4d156777b7a3b3d0ef28ec4f97fda217759cdf211e604f9dc9bbd6","src/thread_info/thread_info_mips.rs":"203d1219e81da1f33ac06f36d94eb1452ab9a57cb3ca5258a1a60a0f2c5706d0","src/thread_info/thread_info_x86.rs":"ee9669fd29b295dbded39b1010be5bf9d4100462bb611e2065eb744919197874","tests/common/mod.rs":"19479260f662649f9cdf001c4076614c1e943ae72bce702ef1eed1f48b3beefe","tests/minidump_writer.rs":"dbccfe2a720cee6db6cc16457982c82c1e1ffd0d0d025eaab183befe9925294e","tests/ptrace_dumper.rs":"5d3438f82a9966cd316ec204b977cc674b9dec2f482ecf9f75f92184d39ed58c"},"package":null} \ No newline at end of file +{"files":{"Cargo.toml":"d83f06b41499b1f763f31498c5412b946a09b93454555140f37b0edd66959e4b","LICENSE":"1ecdd8e8977af83c07c5f97bec87b47d27059b7ea323ca3160fbfa2314f5d99c","src/app_memory.rs":"909676c916c0ffaa3a813632c162f5b1207f8502408b6b3bab48a5f842948c71","src/auxv_reader.rs":"6aff2c1ef3ad0942b93445f5098b07789afbce512f6b4055e9c195df307aea27","src/bin/test.rs":"2278080fd4a13ec5423cb99d7e97a677ea6d73e29c7a99038175ee7a9dfe9c4f","src/cpu_set.rs":"7094f972a7217bf20eeb5b504802177b7aa5dd6cf220235e858fc42259c52f59","src/crash_context/crash_context_aarch64.rs":"97da8a6a66a53ebee4e329c4b01c0a68e74d707adbfb6f2e3ed6fd4318289d0f","src/crash_context/crash_context_arm.rs":"ddf1be0f67e4f43dfae8373d1b902065c671435bbeb7cf4428b2bcb218a1c25a","src/crash_context/crash_context_mips.rs":"3e263d547a3f13ee81d1557a13db6bbd446133821986c2ded94d361634ec1f3a","src/crash_context/crash_context_x86.rs":"8c8566be3c103ec65c83e8f9b2ad4f7a6f19f17656be4b4deed50d7723cc57d8","src/crash_context/crash_context_x86_64.rs":"c658a81a31d66a38c52ffbe816e3945301173f9e6e98c795a822a06be40968bc","src/crash_context/mod.rs":"1578792d46480a79982943ee3b820958ea335a847bbb6b74f44bead6edf17078","src/dso_debug.rs":"c11c6c4d64974042051f000818ac4c3a8895ed2757076612f9209e885d2d5d33","src/dumper_cpu_info/cpu_info_arm.rs":"137953f8424ffb38f89f8fc436a462a64b42583ab36d00d897a81e297736d2d9","src/dumper_cpu_info/cpu_info_x86_mips.rs":"c42db73377cee066f9d4ddca13a77a0692eef513fcefde1f2b91dacce6778f89","src/dumper_cpu_info/mod.rs":"320b629c23ffa30eaead762a74e500f0bc029793234461ef2959681b7650b1e9","src/lib.rs":"87375f3a4cfadb91fd366cb75e1959a08e654e5225955ed56e15d6fc9d208aa0","src/linux_ptrace_dumper.rs":"792532413e1ff5455aef4dd886889339f7bca1ef6654aad5b12585bff0d00bbd","src/maps_reader.rs":"7333d74e635b1b7653df25411e23f133c2025e835339f38bf44d7ae5c29e001a","src/minidump_cpu/minidump_cpu_aarch64.rs":"18524f8a3a3d3eda7d0fafb1c168ff06dee1886da0f4278f3c2a54147ef79bc9","src/minidump_cpu/minidump_cpu_amd64.rs":"c4b3cef86ea53864c026d7c598d8a7f59ca6b1ad7e881f94ce34f39dd6b72e33","src/minidump_cpu/minidump_cpu_arm.rs":"2b95ecef302de39a0c105011392dc1419dd3f62762482038318f564d5ed3797a","src/minidump_cpu/minidump_cpu_mips.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_ppc.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_ppc64.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_sparc.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_x86.rs":"3dcb2aa4264d76f0727b9750ffce0032738bea97be95fde92089a9d11926c63c","src/minidump_cpu/mod.rs":"50e8df5e294e9d162c97dacb9448bba0ffc1e4bf992f8a2b9cc718f12b92a370","src/minidump_format.rs":"56f737bd95fbbd5b4b3d7773dc491e267887d78b12916645bccbcef16acf2cfc","src/minidump_writer.rs":"5e5cf95b9efa7f8a8ad48c43c03e8a4101efee4206a4a14f92a5cdb676d5e6b6","src/sections/app_memory.rs":"13074b16ffbd144e0cc209ad2cb64571dbb74ba987f65026338645d440e3cd89","src/sections/exception_stream.rs":"08562fcd73e48ce5d251080504526f4f7e65f536325da816f69ff0d8354f4bc4","src/sections/mappings.rs":"15d489a3d053627c793a6794c85bc9d38d72a7299e496142cc38afa2c2a8d54c","src/sections/memory_list_stream.rs":"c15ec66f844122f98d553be501e881837275709d0d8e5ec4ecf4d076fcaf79d7","src/sections/mod.rs":"71911a6265365b75e74b87a83754ae60af7f17bf1faf539450e3cd1dc9a9f0c0","src/sections/systeminfo_stream.rs":"70f8d62a86a874536edfeb9ad0a47916fe90934ae0b29b61ed871335ac2f776f","src/sections/thread_list_stream.rs":"f69de2e50c033d5a1c6a597b942025a6442e71158f376c6afcfe6f3ac929dad7","src/thread_info/mod.rs":"d86206025f4a9612caa90391231403c9bc6512a85309eb4f53b95826ad837215","src/thread_info/thread_info_aarch64.rs":"941bcf68a03d647b946bda2e1542d8965b827e392eb3e4fb4e0193f7e300e12c","src/thread_info/thread_info_arm.rs":"60a9008a4e4d156777b7a3b3d0ef28ec4f97fda217759cdf211e604f9dc9bbd6","src/thread_info/thread_info_mips.rs":"203d1219e81da1f33ac06f36d94eb1452ab9a57cb3ca5258a1a60a0f2c5706d0","src/thread_info/thread_info_x86.rs":"ee9669fd29b295dbded39b1010be5bf9d4100462bb611e2065eb744919197874","tests/common/mod.rs":"19479260f662649f9cdf001c4076614c1e943ae72bce702ef1eed1f48b3beefe","tests/minidump_writer.rs":"c933d3cd951ac9c2c7fee7a8a55bfc9550cca7ebdeb9e4f25623002a4e643239","tests/ptrace_dumper.rs":"5d3438f82a9966cd316ec204b977cc674b9dec2f482ecf9f75f92184d39ed58c"},"package":null} \ No newline at end of file diff --git a/third_party/rust/minidump_writer_linux/src/linux_ptrace_dumper.rs b/third_party/rust/minidump_writer_linux/src/linux_ptrace_dumper.rs index 2c0347370213..b592ec48d33d 100644 --- a/third_party/rust/minidump_writer_linux/src/linux_ptrace_dumper.rs +++ b/third_party/rust/minidump_writer_linux/src/linux_ptrace_dumper.rs @@ -1,4 +1,6 @@ // use libc::c_void; +#[cfg(target_os = "android")] +use crate::android::late_process_mappings; use crate::auxv_reader::{AuxvType, ProcfsAuxvIter}; use crate::maps_reader::{MappingInfo, MappingInfoParsingResult, DELETED_SUFFIX}; use crate::minidump_format::MDGUID; @@ -165,16 +167,17 @@ impl LinuxPtraceDumper { fn enumerate_threads(&mut self) -> Result<()> { let task_path = path::PathBuf::from(format!("/proc/{}/task", self.pid)); if task_path.is_dir() { - for entry in std::fs::read_dir(task_path)? { - let name = entry? - .file_name() - .to_str() - .ok_or("Unparsable filename")? - .parse::(); - if let Ok(tid) = name { - self.threads.push(tid); - } - } + std::fs::read_dir(task_path)? + .into_iter() + .filter_map(|entry| entry.ok()) // Filter out bad entries + .filter_map(|entry| { + entry + .file_name() // Parse name to Pid, filter out those that are unparsable + .to_str() + .and_then(|name| name.parse::().ok()) + }) + .map(|tid| self.threads.push(tid)) // Push the resulting Pids + .count(); // Execute iterator } Ok(()) } @@ -184,11 +187,16 @@ impl LinuxPtraceDumper { let auxv_file = std::fs::File::open(auxv_path)?; let input = BufReader::new(auxv_file); let reader = ProcfsAuxvIter::new(input); - for item in reader { - let item = item?; - self.auxv.insert(item.key, item.value); + self.auxv = reader + .filter_map(Result::ok) + .map(|x| (x.key, x.value)) + .collect(); + + if self.auxv.is_empty() { + Err("Found no auxv entry".into()) + } else { + Ok(()) } - Ok(()) } fn enumerate_mappings(&mut self) -> Result<()> { @@ -205,10 +213,10 @@ impl LinuxPtraceDumper { // actual entry point to find the mapping. let entry_point_loc = *self.auxv.get(&libc::AT_ENTRY).unwrap_or(&0); - let auxv_path = path::PathBuf::from(format!("/proc/{}/maps", self.pid)); - let auxv_file = std::fs::File::open(auxv_path)?; + let maps_path = path::PathBuf::from(format!("/proc/{}/maps", self.pid)); + let maps_file = std::fs::File::open(maps_path)?; - for line in BufReader::new(auxv_file).lines() { + for line in BufReader::new(maps_file).lines() { // /proc//maps looks like this // 7fe34a863000-7fe34a864000 rw-p 00009000 00:31 4746408 /usr/lib64/libogg.so.0.8.4 let line = line?; @@ -454,29 +462,23 @@ impl LinuxPtraceDumper { } if section.sh_flags & u64::from(elf::section_header::SHF_ALLOC) != 0 { if section.sh_flags & u64::from(elf::section_header::SHF_EXECINSTR) != 0 { - unsafe { - let ptr = mem_slice.as_ptr().offset(section.sh_offset.try_into()?); - let text_section = std::slice::from_raw_parts( - ptr as *const u8, - section.sh_size.try_into()?, - ); - - // Only provide mem::size_of(MDGUID) bytes to keep identifiers produced by this - // function backwards-compatible. - let max_len = std::cmp::min(text_section.len(), 4096); - let mut result = vec![0u8; std::mem::size_of::()]; - let mut offset = 0; - while offset < max_len { - for idx in 0..std::mem::size_of::() { - if offset + idx >= text_section.len() { - break; - } - result[idx] ^= text_section[offset + idx]; + let text_section = &mem_slice[section.sh_offset as usize..] + [..section.sh_size as usize]; + // Only provide mem::size_of(MDGUID) bytes to keep identifiers produced by this + // function backwards-compatible. + let max_len = std::cmp::min(text_section.len(), 4096); + let mut result = vec![0u8; std::mem::size_of::()]; + let mut offset = 0; + while offset < max_len { + for idx in 0..std::mem::size_of::() { + if offset + idx >= text_section.len() { + break; } - offset += std::mem::size_of::(); + result[idx] ^= text_section[offset + idx]; } - return Ok(result); + offset += std::mem::size_of::(); } + return Ok(result); } } } diff --git a/third_party/rust/minidump_writer_linux/tests/minidump_writer.rs b/third_party/rust/minidump_writer_linux/tests/minidump_writer.rs index f31dc5bcaf6a..0f4007098aba 100644 --- a/third_party/rust/minidump_writer_linux/tests/minidump_writer.rs +++ b/third_party/rust/minidump_writer_linux/tests/minidump_writer.rs @@ -581,3 +581,66 @@ fn test_sanitized_stacks() { fn test_sanitized_stacks_with_context() { test_sanitized_stacks_helper(Context::Without) } + +fn test_write_early_abort_helper(context: Context) { + let mut child = start_child_and_return("spawn_alloc_wait"); + let pid = child.id() as i32; + + let mut tmpfile = tempfile::Builder::new() + .prefix("additional_memory") + .tempfile() + .unwrap(); + + let mut f = BufReader::new(child.stdout.as_mut().expect("Can't open stdout")); + let mut buf = String::new(); + let _ = f + .read_line(&mut buf) + .expect("Couldn't read address provided by child"); + let mut output = buf.split_whitespace(); + let memory_addr = usize::from_str_radix(output.next().unwrap().trim_start_matches("0x"), 16) + .expect("unable to parse mmap_addr"); + + // We do not read the actual memory_size, but use something that does not fit into an "isize", + // and should thus create an error during dumping, which should lead to a truncated minidump. + let memory_size = usize::MAX; + + let app_memory = AppMemory { + ptr: memory_addr, + length: memory_size, + }; + + let mut tmp = MinidumpWriter::new(pid, pid); + if context == Context::With { + let crash_context = get_crash_context(pid); + tmp.set_crash_context(crash_context); + } + + // This should fail, because during the dump an error is detected (try_from fails) + tmp.set_app_memory(vec![app_memory]) + .dump(&mut tmpfile) + .expect_err("Could not write minidump"); + + child.kill().expect("Failed to kill process"); + // Reap child + let waitres = child.wait().expect("Failed to wait for child"); + let status = waitres.signal().expect("Child did not die due to signal"); + assert_eq!(waitres.code(), None); + assert_eq!(status, Signal::SIGKILL as i32); + + // Read dump file and check its contents. There should be a truncated minidump available + let dump = Minidump::read_path(tmpfile.path()).expect("Failed to read minidump"); + // Should be there + let _: MinidumpThreadList = dump.get_stream().expect("Couldn't find MinidumpThreadList"); + let _: MinidumpModuleList = dump.get_stream().expect("Couldn't find MinidumpThreadList"); + + // Should be missing: + assert!(dump.get_stream::().is_err()); +} +#[test] +fn test_write_early_abort() { + test_write_early_abort_helper(Context::Without) +} +#[test] +fn test_write_early_abort_with_context() { + test_write_early_abort_helper(Context::With) +} diff --git a/toolkit/crashreporter/breakpad-client/linux/crash_generation/crash_generation_server.cc b/toolkit/crashreporter/breakpad-client/linux/crash_generation/crash_generation_server.cc index 0dc52f9c1d6f..45e4d2f03711 100644 --- a/toolkit/crashreporter/breakpad-client/linux/crash_generation/crash_generation_server.cc +++ b/toolkit/crashreporter/breakpad-client/linux/crash_generation/crash_generation_server.cc @@ -271,11 +271,11 @@ CrashGenerationServer::ClientEvent(short revents) return true; #if defined(MOZ_OXIDIZED_BREAKPAD) - if (!write_minidump_linux_with_context(minidump_filename.c_str(), - crashing_pid, crash_context)) { - close(signal_fd); - return true; - } + // Ignoring the return-value here for now. + // The function always creates an empty minidump file even in case of an error. + // So we'll report that as well via the callback-functions. + write_minidump_linux_with_context(minidump_filename.c_str(), + crashing_pid, crash_context); #else if (!google_breakpad::WriteMinidump(minidump_filename.c_str(), crashing_pid, crash_context, diff --git a/toolkit/moz.configure b/toolkit/moz.configure index e231d55de4c9..1a6065ad9512 100644 --- a/toolkit/moz.configure +++ b/toolkit/moz.configure @@ -2488,7 +2488,9 @@ set_define("MOZ_USE_NATIVE_POPUP_WINDOWS", True, when="MOZ_USE_NATIVE_POPUP_WIND # ============================================================== @depends(target) def oxidized_breakpad(target): - return False # Disabled pending further testing + if target.kernel == "Linux" and target.os != "Android": + return target.cpu in ("x86", "x86_64") + return False set_config("MOZ_OXIDIZED_BREAKPAD", True, when=oxidized_breakpad)