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:
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.