tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 4b630e5abdec61c484ed955029585427015650e2
parent a9112dba70fdded5f20b9f1448c284c49996c254
Author: Erich Gubler <erichdongubler@gmail.com>
Date:   Tue,  4 Nov 2025 18:14:20 +0000

Bug 1998036 - chore(midi): upgrade `midir` fork base 0.10.1 → 0.10.3 r=gsvelto,supply-chain-reviewers

Differential Revision: https://phabricator.services.mozilla.com/D271155

Diffstat:
M.cargo/config.toml.in | 4++--
MCargo.lock | 4++--
MCargo.toml | 2+-
Mdom/midi/midir_impl/Cargo.toml | 2+-
Msupply-chain/audits.toml | 11+++++------
Mthird_party/rust/midir/.cargo-checksum.json | 4++--
Mthird_party/rust/midir/CHANGELOG.md | 7+++++++
Mthird_party/rust/midir/Cargo.toml | 3++-
Mthird_party/rust/midir/README.md | 2+-
Mthird_party/rust/midir/src/backend/alsa/mod.rs | 46++++++++++++++++++++++++++++++----------------
Mthird_party/rust/midir/src/backend/coremidi/mod.rs | 28++++++++++++++++------------
Mthird_party/rust/midir/src/backend/winmm/mod.rs | 8++++----
12 files changed, 73 insertions(+), 48 deletions(-)

diff --git a/.cargo/config.toml.in b/.cargo/config.toml.in @@ -100,9 +100,9 @@ git = "https://github.com/mozilla/cubeb-pulse-rs" rev = "4e3ea4bbc582705a4e7d9220679525283c035a7e" replace-with = "vendored-sources" -[source."git+https://github.com/mozilla/midir.git?rev=37ad39de3382c2aad0758dab49ba545331a2257d"] +[source."git+https://github.com/mozilla/midir.git?rev=0cc61b81b26088bb8d6e593caf96879879ab814b"] git = "https://github.com/mozilla/midir.git" -rev = "37ad39de3382c2aad0758dab49ba545331a2257d" +rev = "0cc61b81b26088bb8d6e593caf96879879ab814b" replace-with = "vendored-sources" [source."git+https://github.com/mozilla/mp4parse-rust?rev=f955be5d2a04a631c0f1777d6f35370ea1a99e2d"] diff --git a/Cargo.lock b/Cargo.lock @@ -4130,8 +4130,8 @@ dependencies = [ [[package]] name = "midir" -version = "0.10.1" -source = "git+https://github.com/mozilla/midir.git?rev=37ad39de3382c2aad0758dab49ba545331a2257d#37ad39de3382c2aad0758dab49ba545331a2257d" +version = "0.10.3" +source = "git+https://github.com/mozilla/midir.git?rev=0cc61b81b26088bb8d6e593caf96879879ab814b#0cc61b81b26088bb8d6e593caf96879879ab814b" dependencies = [ "alsa", "coremidi", diff --git a/Cargo.toml b/Cargo.toml @@ -251,7 +251,7 @@ firefox-on-glean = { path = "toolkit/components/glean/api" } icu_capi = { path = "intl/icu_capi" } icu_segmenter_data = { path = "intl/icu_segmenter_data" } libudev-sys = { path = "dom/webauthn/libudev-sys" } -midir = { git = "https://github.com/mozilla/midir.git", rev = "37ad39de3382c2aad0758dab49ba545331a2257d" } +midir = { git = "https://github.com/mozilla/midir.git", rev = "0cc61b81b26088bb8d6e593caf96879879ab814b" } # Allow webrender to have a versioned dependency on the older crate on crates.io # in order to build standalone. malloc_size_of_derive = { path = "xpcom/rust/malloc_size_of_derive" } diff --git a/dom/midi/midir_impl/Cargo.toml b/dom/midi/midir_impl/Cargo.toml @@ -8,7 +8,7 @@ license = "MPL-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -midir = "0.10.1" +midir = "0.10.3" nsstring = { path = "../../../xpcom/rust/nsstring/" } uuid = { version = "1.0", features = ["v4"] } thin-vec = { version = "0.2.1", features = ["gecko-ffi"] } diff --git a/supply-chain/audits.toml b/supply-chain/audits.toml @@ -3954,21 +3954,20 @@ delta = "0.7.0 -> 0.10.1" notes = "Large formatting changes and some safe additions, the very few modified unsafe blocks deal with explicit memory management and appear to be sound." [[audits.midir]] -who = "Gabriele Svelto <gsvelto@mozilla.com>" +who = "Erich Gubler <erichdongubler@gmail.com>" criteria = "safe-to-deploy" -delta = "0.10.1 -> 0.10.1@git:37ad39de3382c2aad0758dab49ba545331a2257d" -importable = false -notes = "Minimal changes to enable vendoring the crate" +delta = "0.10.1 -> 0.10.2" [[audits.midir]] who = "Erich Gubler <erichdongubler@gmail.com>" criteria = "safe-to-deploy" -delta = "0.10.1 -> 0.10.2" +delta = "0.10.2 -> 0.10.3" [[audits.midir]] who = "Erich Gubler <erichdongubler@gmail.com>" criteria = "safe-to-deploy" -delta = "0.10.2 -> 0.10.3" +delta = "0.10.3 -> 0.10.3@git:0cc61b81b26088bb8d6e593caf96879879ab814b" +importable = false [[audits.minidump-common]] who = "Gabriele Svelto <gsvelto@mozilla.com>" diff --git a/third_party/rust/midir/.cargo-checksum.json b/third_party/rust/midir/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"29bae7d0207bc72cf3343d1dbc1ee2ee683e0582731f1fc59d4e91de2ff48d97","Cargo.toml":"8929aaf0b683ffc1e1334f1f377c2de43b2d0bac6ec0ec30303e2f20e9da13c3","LICENSE":"6fe6f623b1fa80e90679aee2f917d8978a184988ebb995ebc254cc9633903cac","README.md":"4131b953217e77a4463fde307ba3262b4df11732c1ff209668df12dff3c73ffc","azure-pipelines-template.yml":"a14f85524c2a89be59f9297b70bff5e2fb5aff4a2658edcaf5d4454cc7257764","azure-pipelines.yml":"702b4833da4052d9ddca1a162eb5ea99495d94b26c47b6d4e598acb370785452","examples/test_forward.rs":"fbc58f0b9a4c902c55d9e48ae02107ef8ffebef7c52c0f7ae55d9803460fd011","examples/test_list_ports.rs":"d535790cf2e3c35797acf1dad25f9327a9dabb242284068993588b719e65005f","examples/test_play.rs":"89722e004b9e8202cb2215f8f9b90478afbd29fe6f7bc9e9685ef9db444d654d","examples/test_read_input.rs":"d0bb090bf31ee2381940a00ebffc276b29cd3f0e8bd5d38baa27b3a23dd38d8c","examples/test_reuse.rs":"8cf3c46373f15cb10b7837912974d2bc14a4623510e06388d966ac39c140f794","examples/test_sysex.rs":"88e8cba16a6f5c6deea6c1021c4698114a0ed1003a66d0bb3a1359c378834229","src/backend/alsa/mod.rs":"f6a46b414d4e031d4993506db597296783892109d3ffab6e8133b2aa571fc2de","src/backend/coremidi/mod.rs":"fed3081c8e7982939c477195abb924e3ee684a31b346325f3eb7b4ad274e5d8f","src/backend/dummy/mod.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/backend/jack/mod.rs":"c7e5b78caa1eb614f0e89c5b481339a72a6c72f6ef7b4ada1296b7326c8105fc","src/backend/jack/wrappers.rs":"fee48deb0070e4c63b1dbc3739449c67cdfb93daced4d7003bc1cc08e0e3bef5","src/backend/mod.rs":"6794c7abe8c79a1c00ad6d87887bcdd644e697501f435c9c0bfa7f43aa586306","src/backend/webmidi/mod.rs":"0528d69c3ca9e33379b1c92b6ed72a63367281ffa0e325fb843229dd5bac0e10","src/backend/winmm/handler.rs":"828a3ea6e890b0d13b200022c4c0a9e11c318dd2b6bf93e262b39e3ab4efbfad","src/backend/winmm/mod.rs":"0fa1c21a1c2a2359be889bd4c4195fc7d41b596af00d77c9a7c643f5ac360e25","src/backend/winrt/mod.rs":"8366f044d1a7a9ba790c96b6d0acaa0d4a579cc9129b10a95cd4277a2e7dca2f","src/common.rs":"0bd4500ea9fffe59cb6260964ff0765f92cbcb44a515bb16490c7d8ecdc4e1b8","src/errors.rs":"85823c6b2c8a8b7d3545cf9724ac72af29c44dc884176553b4f91a20b58eb4ab","src/lib.rs":"506d579534d30d80543f6386458ebaf8bb8e860888f889305184e64fc37cb907","src/os/mod.rs":"4b2bd865bbfae91272c7582792a19d55b450623688d271b2f866598813f4bcde","src/os/unix.rs":"04375f23353fa38de08150af3b25342f9b8dd7fefb14652053998977b1c1d114","tests/virtual.rs":"559ed012016e1020077b3784cff3a7f694f950e97cd4fa49dc42a52afcfeabff"},"package":null} -\ No newline at end of file +{"files":{"CHANGELOG.md":"7a7cdac7475e588c4f13ac7eaa019ec87cee3046895dd71024ba3556a99e9e95","Cargo.toml":"1029e787d240f805940964c1beed988c40a23c490f92e30a438bc231d2228439","LICENSE":"6fe6f623b1fa80e90679aee2f917d8978a184988ebb995ebc254cc9633903cac","README.md":"bdcbd5633c687c6fbaed22ee158776ecd56718813a36558c0ee0868bc2a6609e","azure-pipelines-template.yml":"a14f85524c2a89be59f9297b70bff5e2fb5aff4a2658edcaf5d4454cc7257764","azure-pipelines.yml":"702b4833da4052d9ddca1a162eb5ea99495d94b26c47b6d4e598acb370785452","examples/test_forward.rs":"fbc58f0b9a4c902c55d9e48ae02107ef8ffebef7c52c0f7ae55d9803460fd011","examples/test_list_ports.rs":"d535790cf2e3c35797acf1dad25f9327a9dabb242284068993588b719e65005f","examples/test_play.rs":"89722e004b9e8202cb2215f8f9b90478afbd29fe6f7bc9e9685ef9db444d654d","examples/test_read_input.rs":"d0bb090bf31ee2381940a00ebffc276b29cd3f0e8bd5d38baa27b3a23dd38d8c","examples/test_reuse.rs":"8cf3c46373f15cb10b7837912974d2bc14a4623510e06388d966ac39c140f794","examples/test_sysex.rs":"88e8cba16a6f5c6deea6c1021c4698114a0ed1003a66d0bb3a1359c378834229","src/backend/alsa/mod.rs":"62b601cb8a7c231cedaf3c0c9819190d4fbe9609fae0dd7b925167cf1f3ce9b7","src/backend/coremidi/mod.rs":"66f075da1511c1580c809d076400551799e463b026e6b2df3dafeb911e1e22af","src/backend/dummy/mod.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/backend/jack/mod.rs":"c7e5b78caa1eb614f0e89c5b481339a72a6c72f6ef7b4ada1296b7326c8105fc","src/backend/jack/wrappers.rs":"fee48deb0070e4c63b1dbc3739449c67cdfb93daced4d7003bc1cc08e0e3bef5","src/backend/mod.rs":"6794c7abe8c79a1c00ad6d87887bcdd644e697501f435c9c0bfa7f43aa586306","src/backend/webmidi/mod.rs":"0528d69c3ca9e33379b1c92b6ed72a63367281ffa0e325fb843229dd5bac0e10","src/backend/winmm/handler.rs":"828a3ea6e890b0d13b200022c4c0a9e11c318dd2b6bf93e262b39e3ab4efbfad","src/backend/winmm/mod.rs":"c4a29df2f5ba3312b54e3434c3327096a07c7808beae52a0e421a2d8deae2ab3","src/backend/winrt/mod.rs":"8366f044d1a7a9ba790c96b6d0acaa0d4a579cc9129b10a95cd4277a2e7dca2f","src/common.rs":"0bd4500ea9fffe59cb6260964ff0765f92cbcb44a515bb16490c7d8ecdc4e1b8","src/errors.rs":"85823c6b2c8a8b7d3545cf9724ac72af29c44dc884176553b4f91a20b58eb4ab","src/lib.rs":"506d579534d30d80543f6386458ebaf8bb8e860888f889305184e64fc37cb907","src/os/mod.rs":"4b2bd865bbfae91272c7582792a19d55b450623688d271b2f866598813f4bcde","src/os/unix.rs":"04375f23353fa38de08150af3b25342f9b8dd7fefb14652053998977b1c1d114","tests/virtual.rs":"559ed012016e1020077b3784cff3a7f694f950e97cd4fa49dc42a52afcfeabff"},"package":null} +\ No newline at end of file diff --git a/third_party/rust/midir/CHANGELOG.md b/third_party/rust/midir/CHANGELOG.md @@ -2,6 +2,13 @@ All major changes to this project will be documented in this file. +## [0.10.3] 2025-10-27 +- Fix UB in WinMM backend ([#137](https://github.com/Boddlnagg/midir/issues/137) - thanks @barafael) +- Fix file descriptor leak in ALSA backend ([#175](https://github.com/Boddlnagg/midir/pull/175) - thanks @abique) + +## [0.10.2] 2025-08-07 +- Support iOS by disabling timestamping there ([#170](https://github.com/Boddlnagg/midir/pull/170) - thanks @joe-noel-dev) + ## [0.10.1] 2024-11-20 - Add `id()` and `find_port_by_id()` to `MidiInputPort` and `MidiOutputPort` ([#157](https://github.com/Boddlnagg/midir/pull/157) - thanks @oscartbeaumont) diff --git a/third_party/rust/midir/Cargo.toml b/third_party/rust/midir/Cargo.toml @@ -12,7 +12,7 @@ [package] edition = "2021" name = "midir" -version = "0.10.1" +version = "0.10.3" authors = ["Patrick Reisert"] build = false autolib = false @@ -42,6 +42,7 @@ default = [] jack = [ "jack-sys", "libc", + "bitflags", ] winrt = [ "windows/Foundation", diff --git a/third_party/rust/midir/README.md b/third_party/rust/midir/README.md @@ -12,7 +12,7 @@ soon as we will be able to vendor the upstream crate. **midir** currently supports the following platforms/backends: - [x] ALSA (Linux) - [x] WinMM (Windows) -- [x] CoreMIDI (macOS, iOS (untested)) +- [x] CoreMIDI (macOS, iOS) - [x] WinRT (Windows 8+), enable the `winrt` feature - [x] Jack (Linux, macOS), enable the `jack` feature - [x] Web MIDI (Chrome, Opera, perhaps others browsers) diff --git a/third_party/rust/midir/src/backend/alsa/mod.rs b/third_party/rust/midir/src/backend/alsa/mod.rs @@ -153,17 +153,32 @@ pub struct MidiInputConnection<T: 'static> { subscription: Option<PortSubscribe>, thread: Option<JoinHandle<(HandlerData<T>, T)>>, vport: i32, // TODO: probably port numbers are only u8, therefore could use Option<u8> - trigger_send_fd: i32, + trigger_send_fd: Option<PipeFd>, } struct HandlerData<T: 'static> { ignore_flags: Ignore, seq: Seq, - trigger_rcv_fd: i32, + trigger_rcv_fd: Option<PipeFd>, callback: Box<dyn FnMut(u64, &[u8], &mut T) + Send>, queue_id: i32, // an input queue is needed to get timestamped events } +#[repr(transparent)] +struct PipeFd(i32); + +impl PipeFd { + fn get(&self) -> i32 { + self.0 + } +} + +impl Drop for PipeFd { + fn drop(&mut self) { + unsafe { libc::close(self.0); } + } +} + impl MidiInput { pub fn new(client_name: &str) -> Result<Self, InitError> { let seq = match Seq::open(None, None, true) { @@ -226,13 +241,14 @@ impl MidiInput { queue_id } - fn init_trigger(&mut self) -> Result<[i32; 2], ()> { + fn init_trigger(&mut self) -> Result<(PipeFd, PipeFd), ()> { let mut trigger_fds = [-1, -1]; if unsafe { libc::pipe(trigger_fds.as_mut_ptr()) } == -1 { Err(()) } else { - Ok(trigger_fds) + // first element: receiver, second element: sender + Ok((PipeFd(trigger_fds[0]), PipeFd(trigger_fds[1]))) } } @@ -335,7 +351,7 @@ impl MidiInput { let handler_data = HandlerData { ignore_flags: self.ignore_flags, seq: self.seq.take().unwrap(), - trigger_rcv_fd: trigger_fds[0], + trigger_rcv_fd: Some(trigger_fds.0), callback: Box::new(callback), queue_id: queue_id, }; @@ -362,7 +378,7 @@ impl MidiInput { subscription: Some(subscription), thread: Some(thread), vport: vport, - trigger_send_fd: trigger_fds[1], + trigger_send_fd: Some(trigger_fds.1), }) } @@ -414,7 +430,7 @@ impl MidiInput { let handler_data = HandlerData { ignore_flags: self.ignore_flags, seq: self.seq.take().unwrap(), - trigger_rcv_fd: trigger_fds[0], + trigger_rcv_fd: Some(trigger_fds.0), callback: Box::new(callback), queue_id: queue_id, }; @@ -439,7 +455,7 @@ impl MidiInput { subscription: None, thread: Some(thread), vport: vport, - trigger_send_fd: trigger_fds[1], + trigger_send_fd: Some(trigger_fds.1), }) } } @@ -462,7 +478,7 @@ impl<T> MidiInputConnection<T> { // Request the thread to stop. let _res = unsafe { libc::write( - self.trigger_send_fd, + self.trigger_send_fd.as_ref().expect("send_fd already taken").get(), &false as *const bool as *const _, mem::size_of::<bool>() as libc::size_t, ) @@ -470,7 +486,7 @@ impl<T> MidiInputConnection<T> { let thread = self.thread.take().unwrap(); // Join the thread to get the handler_data back - let (handler_data, user_data) = match thread.join() { + let (mut handler_data, user_data) = match thread.join() { Ok(data) => data, // TODO: handle this more gracefully? Err(e) => { @@ -489,11 +505,9 @@ impl<T> MidiInputConnection<T> { .unsubscribe_port(subscription.get_sender(), subscription.get_dest()); } - // Close the trigger fds (TODO: make sure that these are closed even in the presence of panic in thread) - unsafe { - libc::close(handler_data.trigger_rcv_fd); - libc::close(self.trigger_send_fd); - } + // Close the trigger fds + handler_data.trigger_rcv_fd = None; + self.trigger_send_fd = None; // Stop and free the input queue if !cfg!(feature = "avoid_timestamping") { @@ -755,7 +769,7 @@ fn handle_input<T>(mut data: HandlerData<T>, user_data: &mut T) -> HandlerData<T let poll_desc_info = (&data.seq, Some(Direction::Capture)); let mut poll_fds = vec![INVALID_POLLFD; poll_desc_info.count() + 1]; poll_fds[0] = pollfd { - fd: data.trigger_rcv_fd, + fd: data.trigger_rcv_fd.as_ref().unwrap().get(), events: libc::POLLIN, revents: 0, }; diff --git a/third_party/rust/midir/src/backend/coremidi/mod.rs b/third_party/rust/midir/src/backend/coremidi/mod.rs @@ -93,14 +93,17 @@ impl MidiInput { } let mut timestamp = p.timestamp(); - if timestamp == 0 { - // this might happen for asnychronous sysex messages (?) - timestamp = unsafe { external::AudioGetCurrentHostTime() }; - } - if !*continue_sysex { - message.timestamp = - unsafe { external::AudioConvertHostTimeToNanos(timestamp) } as u64 / 1000; + if cfg!(not(target_os = "ios")) { + if timestamp == 0 { + // this might happen for asnychronous sysex messages (?) + timestamp = unsafe { external::AudioGetCurrentHostTime() }; + } + + if !*continue_sysex { + message.timestamp = + unsafe { external::AudioConvertHostTimeToNanos(timestamp) } as u64 / 1000; + } } let mut cur_byte = 0; @@ -404,11 +407,12 @@ impl MidiOutputConnection { } pub fn send(&mut self, message: &[u8]) -> Result<(), SendError> { - let send_time = if cfg!(feature = "coremidi_send_timestamped") { - unsafe { external::AudioGetCurrentHostTime() } - } else { - 0 - }; + let send_time = + if cfg!(feature = "coremidi_send_timestamped") && cfg!(not(target_os = "ios")) { + unsafe { external::AudioGetCurrentHostTime() } + } else { + 0 + }; let packets = PacketBuffer::new(send_time, message); match self.details { OutputConnectionDetails::Explicit(ref port, ref dest) => port diff --git a/third_party/rust/midir/src/backend/winmm/mod.rs b/third_party/rust/midir/src/backend/winmm/mod.rs @@ -654,10 +654,10 @@ impl MidiOutputConnection { } // Pack MIDI bytes into double word. - let packet: u32 = 0; - let ptr = &packet as *const u32 as *mut u8; - for i in 0..nbytes { - unsafe { *ptr.offset(i as isize) = message[i] }; + let mut packet: u32 = 0; + let ptr = std::ptr::addr_of_mut!(packet).cast::<u8>(); + for (i, item) in message.iter().enumerate().take(nbytes) { + unsafe { *ptr.add(i) = *item }; } // Send the message immediately.