CVE-2026-16350
Overview
Background
- `cubeb`
- Firefox’s cross-platform audio input/output abstraction library that content and parent code drive to create and run audio streams.
- `audioipc2`
- The IPC layer that proxies
cubebcalls from the browser to a sandboxed audio server process, split intoaudioipc2-clientandaudioipc2-servercrates. - `StreamParams`
- A
cubebdescriptor carrying a stream’s sampleformat, channel count, and samplerate, used to size audio buffers and shared-memory regions. - `StreamCreateParams` / `StreamInitParams`
- IPC message payloads that ferry the caller-supplied
StreamParams(and, formerly, device and latency fields) across the client/server boundary during stream setup.
Root Cause Analysis
The audio server’s stream-creation path in audioipc2-server accepted a client-supplied StreamParams (format, channels, rate) and used it to compute frame sizes and shared-memory area sizes without validating that those fields fell within sane bounds. Because the server trusts a lower-privileged sender across IPC, an out-of-range channel count or sample rate, or an unrecognized format, violated the invariant that buffer- and SHM-size arithmetic operate on bounded, well-formed parameters, producing incorrect boundary conditions in subsequent size calculations.
The fix adds validate_stream_params, which rejects any StreamParams whose format is not one of the four known enum values, whose channel count exceeds MAX_CHANNELS (u8::MAX), or whose rate is outside MIN_RATE..MAX_RATE (1,000..768,000). The client side is refactored so all stream parameters travel in a single StreamCreate message (renaming StreamInitParams to StreamCreateParams), letting the server validate the complete parameter set once, up front, before any allocation, while StreamInit now carries only the returned token. This works because the server no longer performs size arithmetic on attacker-controlled StreamParams until they have passed the explicit bounds checks.
StreamParams as trusted and fed them into buffer/shared-memory sizing without bounds checking; the fix consolidates the parameters into one StreamCreate message and gates them behind validate_stream_params, enforcing format, channel, and rate limits before any memory is sized or allocated.Attack Path
- Reach the audio IPC
A compromised or malicious client (a lower-privileged process that speaks
audioipc2) initiates stream creation against the audio server. - Craft malformed `StreamParams`
The client sets an out-of-bounds channel count, an extreme sample
rate, or an unrecognizedformatin theStreamParamsit sends. - Bypass server validation
Before the fix, the server accepted these fields directly, with no
validate_stream_paramscheck on the create path. - Trigger bad size arithmetic The server derives frame sizes and shared-memory area sizes from the unchecked fields, producing incorrect boundary conditions in the size computation.
- Corrupt memory state The resulting mis-sized buffers or SHM region drive out-of-range memory behavior in the audio server process.
Impact Assessment
audioipc2 client interface can supply malformed stream parameters that cause incorrect size computations in the audio server process, undermining memory safety there. The affected context is the cubeb/audioipc2 audio server; the precondition is the ability to send a stream-create request with attacker-chosen StreamParams. The vendor rates this high impact, consistent with a memory-safety consequence in the audio process rather than a mere denial of service.Files Changed
.cargo/config.toml.inCargo.lockthird_party/rust/audioipc2-client/.cargo-checksum.jsonthird_party/rust/audioipc2-client/src/context.rsthird_party/rust/audioipc2-client/src/stream.rsthird_party/rust/audioipc2-server/.cargo-checksum.jsonthird_party/rust/audioipc2-server/src/server.rsthird_party/rust/audioipc2/.cargo-checksum.jsonthird_party/rust/audioipc2/src/messages.rstoolkit/library/rust/shared/Cargo.toml
Audit Directions
- Cross-process size arithmeticAudit every IPC handler that computes buffer or shared-memory sizes from a peer-supplied count,
rate, orformat, and confirm each field is bounds-checked before the arithmetic runs. - Trust boundary on `StreamParams`-like descriptorsWherever a struct crossing a privilege boundary carries variable dimensions, verify a single up-front validation gate exists rather than scattered or absent checks along the create/init sequence.
- Enum and range validation of deserialized fieldsLook for deserialized enum-typed fields (like
format) matched or indexed without an exhaustive known-value check, and for numeric fields used without explicit min/max clamping.
Patch
diff --git a/.cargo/config.toml.in b/.cargo/config.toml.in
index 57e58ed55db..2f0a7b9fe08 100644
--- a/.cargo/config.toml.in
+++ b/.cargo/config.toml.in
@@ -65,9 +65,9 @@ git = "https://github.com/martinthomson/ohttp"
rev = "600931b5a1e947776cbaad931ed78f1e89005352"
replace-with = "vendored-sources"
-[source."git+https://github.com/mozilla/audioipc?rev=042d48dc5932ced772c2bf20a2aef2845fd6ec85"]
+[source."git+https://github.com/mozilla/audioipc?rev=c9dcbaee1624daad2fa6b1445fd047efde4f1ec0"]
git = "https://github.com/mozilla/audioipc"
-rev = "042d48dc5932ced772c2bf20a2aef2845fd6ec85"
+rev = "c9dcbaee1624daad2fa6b1445fd047efde4f1ec0"
replace-with = "vendored-sources"
[source."git+https://github.com/mozilla/authenticator-rs?tag=v0.6.0"]
diff --git a/Cargo.lock b/Cargo.lock
index ca556fa40c6..b643010d068 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -365,7 +365,7 @@ dependencies = [
[[package]]
name = "audioipc2"
version = "0.6.0"
-source = "git+https://github.com/mozilla/audioipc?rev=042d48dc5932ced772c2bf20a2aef2845fd6ec85#042d48dc5932ced772c2bf20a2aef2845fd6ec85"
+source = "git+https://github.com/mozilla/audioipc?rev=c9dcbaee1624daad2fa6b1445fd047efde4f1ec0#c9dcbaee1624daad2fa6b1445fd047efde4f1ec0"
dependencies = [
"arrayvec",
"ashmem",
@@ -391,7 +391,7 @@ dependencies = [
[[package]]
name = "audioipc2-client"
version = "0.6.0"
-source = "git+https://github.com/mozilla/audioipc?rev=042d48dc5932ced772c2bf20a2aef2845fd6ec85#042d48dc5932ced772c2bf20a2aef2845fd6ec85"
+source = "git+https://github.com/mozilla/audioipc?rev=c9dcbaee1624daad2fa6b1445fd047efde4f1ec0#c9dcbaee1624daad2fa6b1445fd047efde4f1ec0"
dependencies = [
"audio_thread_priority",
"audioipc2",
@@ -402,7 +402,7 @@ dependencies = [
[[package]]
name = "audioipc2-server"
version = "0.6.0"
-source = "git+https://github.com/mozilla/audioipc?rev=042d48dc5932ced772c2bf20a2aef2845fd6ec85#042d48dc5932ced772c2bf20a2aef2845fd6ec85"
+source = "git+https://github.com/mozilla/audioipc?rev=c9dcbaee1624daad2fa6b1445fd047efde4f1ec0#c9dcbaee1624daad2fa6b1445fd047efde4f1ec0"
dependencies = [
"audio_thread_priority",
"audioipc2",
diff --git a/third_party/rust/audioipc2-client/.cargo-checksum.json b/third_party/rust/audioipc2-client/.cargo-checksum.json
index 7661d4ed4cc..5b8ce76ed95 100644
--- a/third_party/rust/audioipc2-client/.cargo-checksum.json
+++ b/third_party/rust/audioipc2-client/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"8041e238fb1492f52e6f6c34ba43496208ebbf2acc3dd87faaac0c7f0af1dc01","cbindgen.toml":"fb6abe1671497f432a06e40b1db7ed7cd2cceecbd9a2382193ad7534e8855e34","src/context.rs":"241233793a343f930f868327a62903f0ab845a17ae44b0afa809dcd245641a16","src/lib.rs":"0322bba9529c81c891bc2c033d402590058014da0df0730dbf9532380c2dabe8","src/send_recv.rs":"cd396a704f205d4ef680f484461a065aa29f624603d5031f9973779826fb3c19","src/stream.rs":"4f08831749d5cb393db6bfbf0c66cdc71e9a06418927929dadce4737a391c4b2"},"package":null}
\ No newline at end of file
+{"files":{"Cargo.toml":"8041e238fb1492f52e6f6c34ba43496208ebbf2acc3dd87faaac0c7f0af1dc01","cbindgen.toml":"fb6abe1671497f432a06e40b1db7ed7cd2cceecbd9a2382193ad7534e8855e34","src/context.rs":"c351b782e9bb83a1fbc5127e07a4d06c59978256bb0dc265df256eb948a6cf4e","src/lib.rs":"0322bba9529c81c891bc2c033d402590058014da0df0730dbf9532380c2dabe8","src/send_recv.rs":"cd396a704f205d4ef680f484461a065aa29f624603d5031f9973779826fb3c19","src/stream.rs":"d7d4967c8ef760a58592aff23157357646528c1c83c9de394e1f9c8043f72a81"},"package":null}
\ No newline at end of file
diff --git a/third_party/rust/audioipc2-client/src/context.rs b/third_party/rust/audioipc2-client/src/context.rs
index 7025ee2c630..40790965bab 100644
--- a/third_party/rust/audioipc2-client/src/context.rs
+++ b/third_party/rust/audioipc2-client/src/context.rs
@@ -297,7 +297,7 @@ impl ContextOps for ClientContext {
let input_stream_params = input_stream_params.map(messages::StreamParams::from);
let output_stream_params = output_stream_params.map(messages::StreamParams::from);
- let init_params = messages::StreamInitParams {
+ let params = messages::StreamCreateParams {
stream_name,
input_device: input_device as usize,
input_stream_params,
@@ -305,7 +305,7 @@ impl ContextOps for ClientContext {
output_stream_params,
latency_frames,
};
- stream::init(self, init_params, data_callback, state_callback, user_ptr)
+ stream::init(self, params, data_callback, state_callback, user_ptr)
}
fn register_device_collection_changed(
diff --git a/third_party/rust/audioipc2-client/src/stream.rs b/third_party/rust/audioipc2-client/src/stream.rs
index bfa9c9613d9..07378c060f4 100644
--- a/third_party/rust/audioipc2-client/src/stream.rs
+++ b/third_party/rust/audioipc2-client/src/stream.rs
@@ -5,7 +5,6 @@
use crate::ClientContext;
use crate::{assert_not_in_callback, run_in_callback};
-use audioipc::messages::StreamCreateParams;
use audioipc::messages::{self, CallbackReq, CallbackResp, ClientMessage, ServerMessage};
use audioipc::shm::SharedMem;
use audioipc::{rpccore, sys};
@@ -166,27 +165,25 @@ impl rpccore::Server for CallbackServer {
impl<'ctx> ClientStream<'ctx> {
fn init(
ctx: &'ctx ClientContext,
- init_params: messages::StreamInitParams,
+ params: messages::StreamCreateParams,
data_callback: ffi::cubeb_data_callback,
state_callback: ffi::cubeb_state_callback,
user_ptr: *mut c_void,
) -> Result<Stream> {
assert_not_in_callback();
- let input_frame_size = init_params
+ let has_input = params.input_stream_params.is_some();
+ let has_output = params.output_stream_params.is_some();
+ let input_frame_size = params
.input_stream_params
.as_ref()
.map(messages::StreamParams::frame_size_in_bytes);
- let output_frame_size = init_params
+ let output_frame_size = params
.output_stream_params
.as_ref()
.map(messages::StreamParams::frame_size_in_bytes);
let rpc = ctx.rpc();
- let create_params = StreamCreateParams {
- input_stream_params: init_params.input_stream_params,
- output_stream_params: init_params.output_stream_params,
- };
- let mut data = send_recv!(rpc, StreamCreate(create_params) => StreamCreated())?;
+ let mut data = send_recv!(rpc, StreamCreate(params) => StreamCreated())?;
debug!(
"token = {}, handle = {:?} area_size = {:?}",
@@ -205,10 +202,7 @@ impl<'ctx> ClientStream<'ctx> {
}
};
- let duplex_input = if let (Some(_), Some(_)) = (
- init_params.input_stream_params,
- init_params.output_stream_params,
- ) {
+ let duplex_input = if has_input && has_output {
let mut duplex_input = Vec::new();
match duplex_input.try_reserve_exact(data.shm_area_size) {
Ok(()) => Some(duplex_input),
@@ -224,8 +218,7 @@ impl<'ctx> ClientStream<'ctx> {
None
};
- let mut stream =
- send_recv!(rpc, StreamInit(data.token, init_params) => StreamInitialized())?;
+ let mut stream = send_recv!(rpc, StreamInit(data.token) => StreamInitialized())?;
let stream = unsafe { sys::Pipe::from_raw_handle(stream.take_handle()) };
let user_data = user_ptr as usize;
@@ -367,12 +360,12 @@ impl StreamOps for ClientStream<'_> {
pub fn init(
ctx: &ClientContext,
- init_params: messages::StreamInitParams,
+ params: messages::StreamCreateParams,
data_callback: ffi::cubeb_data_callback,
state_callback: ffi::cubeb_state_callback,
user_ptr: *mut c_void,
) -> Result<Stream> {
- let stm = ClientStream::init(ctx, init_params, data_callback, state_callback, user_ptr)?;
+ let stm = ClientStream::init(ctx, params, data_callback, state_callback, user_ptr)?;
debug_assert_eq!(stm.user_ptr(), user_ptr);
Ok(stm)
}
diff --git a/third_party/rust/audioipc2-server/.cargo-checksum.json b/third_party/rust/audioipc2-server/.cargo-checksum.json
index a5aa180bae6..640ba1b6f06 100644
--- a/third_party/rust/audioipc2-server/.cargo-checksum.json
+++ b/third_party/rust/audioipc2-server/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"cb7cde50cf3ed08b5cd40d8f118d7101ec863942d506eebc26595662a7cc5b58","cbindgen.toml":"fb6abe1671497f432a06e40b1db7ed7cd2cceecbd9a2382193ad7534e8855e34","src/lib.rs":"a19c1bad94e16a0cfcd1e93c25b97bf58cc00e9666b5c31652d8a2242decb36c","src/server.rs":"1a8c83c67f4bb834646b55279e4a6d473d0b1ad1033108bc3a8399471e6e0652"},"package":null}
\ No newline at end of file
+{"files":{"Cargo.toml":"cb7cde50cf3ed08b5cd40d8f118d7101ec863942d506eebc26595662a7cc5b58","cbindgen.toml":"fb6abe1671497f432a06e40b1db7ed7cd2cceecbd9a2382193ad7534e8855e34","src/lib.rs":"a19c1bad94e16a0cfcd1e93c25b97bf58cc00e9666b5c31652d8a2242decb36c","src/server.rs":"28d494e2d4a6ad673f77912578179eb7b1b8b927d7fd63048d099284d03aeda7"},"package":null}
\ No newline at end of file
diff --git a/third_party/rust/audioipc2-server/src/server.rs b/third_party/rust/audioipc2-server/src/server.rs
index 90337418abf..eb550c83d07 100644
--- a/third_party/rust/audioipc2-server/src/server.rs
+++ b/third_party/rust/audioipc2-server/src/server.rs
@@ -9,7 +9,7 @@ use audioipc::messages::SerializableHandle;
use audioipc::messages::{
CallbackReq, CallbackResp, ClientMessage, Device, DeviceCollectionReq, DeviceCollectionResp,
DeviceInfo, RegisterDeviceCollectionChanged, ServerMessage, StreamCreate, StreamCreateParams,
- StreamInitParams, StreamParams,
+ StreamParams,
};
use audioipc::shm::SharedMem;
use audioipc::{ipccore, rpccore, sys, PlatformHandle};
@@ -356,10 +356,61 @@ fn get_shm_id() -> String {
)
}
+fn validate_stream_params(p: &StreamParams) -> cubeb::Result<()> {
+ const MAX_CHANNELS: u32 = u8::MAX as u32;
+ const MIN_RATE: u32 = 1_000;
+ const MAX_RATE: u32 = 768_000;
+
+ let valid_format = matches!(
+ p.format,
+ ffi::CUBEB_SAMPLE_S16LE
+ | ffi::CUBEB_SAMPLE_S16BE
+ | ffi::CUBEB_SAMPLE_FLOAT32LE
+ | ffi::CUBEB_SAMPLE_FLOAT32BE
+ );
+
+ if valid_format
+ && p.channels >= 1
+ && p.channels <= MAX_CHANNELS
+ && p.rate >= MIN_RATE
+ && p.rate <= MAX_RATE
+ {
+ Ok(())
+ } else {
+ Err(cubeb::Error::InvalidParameter)
+ }
+}
+
+fn validate_stream_create_params(params: &StreamCreateParams) -> cubeb::Result<()> {
+ if params.input_stream_params.is_none() && params.output_stream_params.is_none() {
+ return Err(cubeb::Error::InvalidParameter);
+ }
+
+ if let Some(input_params) = ¶ms.input_stream_params {
+ validate_stream_params(input_params)?;
+ }
+
+ if let Some(output_params) = ¶ms.output_stream_params {
+ validate_stream_params(output_params)?;
+ }
+
+ // Rate and sample format must match for input and output of a duplex stream.
+ if let (Some(input_params), Some(output_params)) =
+ (¶ms.input_stream_params, ¶ms.output_stream_params)
+ {
+ if input_params.rate != output_params.rate || input_params.format != output_params.format {
+ return Err(cubeb::Error::InvalidParameter);
+ }
+ }
+
+ Ok(())
+}
+
struct ServerStream {
stream: Option<cubeb::Stream>,
cbs: Box<ServerStreamCallbacks>,
client_pipe: Option<PlatformHandle>,
+ params: Option<StreamCreateParams>,
}
impl Drop for ServerStream {
@@ -551,8 +602,8 @@ impl CubebServer {
.process_stream_create(params)
.unwrap_or_else(|_| error(cubeb::Error::Error)),
- ServerMessage::StreamInit(stm_tok, ref params) => self
- .process_stream_init(context, stm_tok, params)
+ ServerMessage::StreamInit(stm_tok) => self
+ .process_stream_init(context, stm_tok)
.unwrap_or_else(|_| error(cubeb::Error::Error)),
ServerMessage::StreamDestroy(stm_tok) => {
@@ -726,6 +777,8 @@ impl CubebServer {
// Stream create is special, so it's been separated from process_msg.
fn process_stream_create(&mut self, params: &StreamCreateParams) -> Result<ClientMessage> {
+ validate_stream_create_params(params)?;
+
// Create the callback handling struct which is attached the cubeb stream.
let input_frame_size = params
.input_stream_params
@@ -783,6 +836,7 @@ impl CubebServer {
stream: None,
cbs,
client_pipe: Some(client_pipe),
+ params: Some(params.clone()),
});
Ok(ClientMessage::StreamCreated(StreamCreate {
@@ -797,29 +851,24 @@ impl CubebServer {
&mut self,
context: &cubeb::Context,
stm_tok: usize,
- params: &StreamInitParams,
) -> Result<ClientMessage> {
- fn valid_stream_params(p: &StreamParams) -> bool {
- const MAX_CHANNELS: u32 = 64;
- const MIN_RATE: u32 = 1_000;
- const MAX_RATE: u32 = 768_000;
- p.channels >= 1
- && p.channels <= MAX_CHANNELS
- && p.rate >= MIN_RATE
- && p.rate <= MAX_RATE
+ if !self.streams.contains(stm_tok) {
+ return Err(cubeb::Error::InvalidParameter.into());
}
- for p in params
- .input_stream_params
- .iter()
- .chain(params.output_stream_params.iter())
- {
- if !valid_stream_params(p) {
- self.streams.remove(stm_tok);
+
+ let params = {
+ let server_stream = &mut self.streams[stm_tok];
+ if server_stream.stream.is_some() {
+ error!("StreamInit({stm_tok}): stream already initialized");
return Err(cubeb::Error::InvalidParameter.into());
}
- }
+ server_stream.params.take().ok_or_else(|| {
+ error!("StreamInit({stm_tok}): missing stream params");
+ cubeb::Error::InvalidParameter
+ })?
+ };
- // Create cubeb stream from params
+ // Create cubeb stream from the stored params.
let stream_name = params
.stream_name
.as_ref()
@@ -858,7 +907,7 @@ impl CubebServer {
latency
);
- let server_stream = &mut self.streams[stm_tok];
+ let server_stream = &self.streams[stm_tok];
assert!(size_of::<Box<ServerStreamCallbacks>>() == size_of::<usize>());
let user_ptr = server_stream.cbs.as_ref() as *const ServerStreamCallbacks as *mut c_void;
@@ -884,6 +933,7 @@ impl CubebServer {
}
};
+ let server_stream = &mut self.streams[stm_tok];
server_stream.stream = Some(stream);
let client_pipe = server_stream
diff --git a/third_party/rust/audioipc2/.cargo-checksum.json b/third_party/rust/audioipc2/.cargo-checksum.json
index c9526fff7ee..170de3d7bc2 100644
--- a/third_party/rust/audioipc2/.cargo-checksum.json
+++ b/third_party/rust/audioipc2/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"8a0b821de1bc37927948f99804e3cc950d0d757f92bf14122f07bfe4a809f16e","benches/serialization.rs":"495e9128fb7892c3460bf55c6dc56a3d9e8853331f566d43231e30fad2c00ff4","src/codec.rs":"49120cd77f09e4acace1629936157fc9afa0a846c9018ad2dd021b5f0e6577fd","src/errors.rs":"36fe5299aee55761366ddc5dcf2f6fb5d81d8a718c59394b6baeb4075fdfc1a7","src/ipccore.rs":"a06cf09aa600df1280538e7946223ab979f088848213fc9c1a394af312f81fbd","src/lib.rs":"98ba1fe514326d2ef374c9ccc3a7125836cdcc3abe62abcf9a4af0084205538a","src/messages.rs":"f9406e0fe46b4758e0cf74c6689522e7bee560cb87e7cb761dfbc0df2c523059","src/rpccore.rs":"058477df2304b4d8c5d1a347663301bcdea3f772762f806963e63a0c8df9ea73","src/shm.rs":"61c9f5d158914cb0ed34d7ce898d1ab24d1a892c68ee0406ff03d01e5c172d32","src/sys/mod.rs":"e6fa1d260abf093e1f7b50185195e2d3aee0eb8c9774c6f253953b5896d838f3","src/sys/unix/cmsg.rs":"e7b7154d55ce57e16ba93d4982630077bf6c70fa56e572956f14ae15aa43cb4c","src/sys/unix/mod.rs":"de0cd5c7a44cfd7c1f5b8cd0260089dc7245373ff9baa0ce44acfdc2d407a9d1","src/sys/unix/msg.rs":"25244de3eba920fa42e032f8fa4ea4913a9fdeb5124ade61e707f6cc6dd946b0","src/sys/windows/mod.rs":"7eaabb76e62c6962b636320e2bbf79a78fce61659c799a798f7dd6d56b0be8a1"},"package":null}
\ No newline at end of file
+{"files":{"Cargo.toml":"8a0b821de1bc37927948f99804e3cc950d0d757f92bf14122f07bfe4a809f16e","benches/serialization.rs":"495e9128fb7892c3460bf55c6dc56a3d9e8853331f566d43231e30fad2c00ff4","src/codec.rs":"49120cd77f09e4acace1629936157fc9afa0a846c9018ad2dd021b5f0e6577fd","src/errors.rs":"36fe5299aee55761366ddc5dcf2f6fb5d81d8a718c59394b6baeb4075fdfc1a7","src/ipccore.rs":"a06cf09aa600df1280538e7946223ab979f088848213fc9c1a394af312f81fbd","src/lib.rs":"98ba1fe514326d2ef374c9ccc3a7125836cdcc3abe62abcf9a4af0084205538a","src/messages.rs":"d294f24ce018603d2e141af3a06a983421a8da191275937bd2cfa8523064def1","src/rpccore.rs":"058477df2304b4d8c5d1a347663301bcdea3f772762f806963e63a0c8df9ea73","src/shm.rs":"61c9f5d158914cb0ed34d7ce898d1ab24d1a892c68ee0406ff03d01e5c172d32","src/sys/mod.rs":"e6fa1d260abf093e1f7b50185195e2d3aee0eb8c9774c6f253953b5896d838f3","src/sys/unix/cmsg.rs":"e7b7154d55ce57e16ba93d4982630077bf6c70fa56e572956f14ae15aa43cb4c","src/sys/unix/mod.rs":"de0cd5c7a44cfd7c1f5b8cd0260089dc7245373ff9baa0ce44acfdc2d407a9d1","src/sys/unix/msg.rs":"25244de3eba920fa42e032f8fa4ea4913a9fdeb5124ade61e707f6cc6dd946b0","src/sys/windows/mod.rs":"7eaabb76e62c6962b636320e2bbf79a78fce61659c799a798f7dd6d56b0be8a1"},"package":null}
\ No newline at end of file
diff --git a/third_party/rust/audioipc2/src/messages.rs b/third_party/rust/audioipc2/src/messages.rs
index fb97e0f388a..3904fc40265 100644
--- a/third_party/rust/audioipc2/src/messages.rs
+++ b/third_party/rust/audioipc2/src/messages.rs
@@ -163,14 +163,8 @@ impl StreamParams {
}
}
-#[derive(Debug, Serialize, Deserialize)]
+#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct StreamCreateParams {
- pub input_stream_params: Option<StreamParams>,
- pub output_stream_params: Option<StreamParams>,
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-pub struct StreamInitParams {
#[serde(with = "serde_bytes")]
pub stream_name: Option<Vec<u8>>,
pub input_device: usize,
@@ -232,7 +226,7 @@ pub enum ServerMessage {
ContextRegisterDeviceCollectionChanged(ffi::cubeb_device_type, bool),
StreamCreate(StreamCreateParams),
- StreamInit(usize, StreamInitParams),
+ StreamInit(usize),
StreamDestroy(usize),
StreamStart(usize),
diff --git a/toolkit/library/rust/shared/Cargo.toml b/toolkit/library/rust/shared/Cargo.toml
index 3efdfc00878..857500b9a7b 100644
--- a/toolkit/library/rust/shared/Cargo.toml
+++ b/toolkit/library/rust/shared/Cargo.toml
@@ -26,8 +26,8 @@ webrender_bindings = { path = "../../../../gfx/webrender_bindings" }
cubeb-coreaudio = { git = "https://github.com/mozilla/cubeb-coreaudio-rs", rev = "0bb8a45a040e85d313eb18deb36570e87df3a6af", optional = true, features=["vpio-forcelist"] }
cubeb-pulse = { git = "https://github.com/mozilla/cubeb-pulse-rs", rev="3cf4a1af09a1748d0e184297a17132bdcc608874", optional = true, features=["pulse-dlopen"] }
cubeb-sys = { version = "0.32.0", optional = true, features=["gecko-in-tree"] }
-audioipc2-client = { git = "https://github.com/mozilla/audioipc", rev = "042d48dc5932ced772c2bf20a2aef2845fd6ec85", optional = true }
-audioipc2-server = { git = "https://github.com/mozilla/audioipc", rev = "042d48dc5932ced772c2bf20a2aef2845fd6ec85", optional = true }
+audioipc2-client = { git = "https://github.com/mozilla/audioipc", rev = "c9dcbaee1624daad2fa6b1445fd047efde4f1ec0", optional = true }
+audioipc2-server = { git = "https://github.com/mozilla/audioipc", rev = "c9dcbaee1624daad2fa6b1445fd047efde4f1ec0", optional = true }
encoding_glue = { path = "../../../../intl/encoding_glue" }
locale_service_glue = { path = "../../../../intl/locale/rust/locale_service_glue" }
app_collator_glue = { path = "../../../../intl/app_collator_glue" }