0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 17:34:47 -05:00

fix udp BorrowMutError (#6221)

This commit is contained in:
Ryan Dahl 2020-06-10 11:26:28 -04:00 committed by GitHub
parent d9c6b109df
commit 54c3f8e27f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 9 deletions

View file

@ -161,6 +161,7 @@ fn receive_udp(
Ok(JsonOp::Async(op.boxed_local())) Ok(JsonOp::Async(op.boxed_local()))
} }
// TODO(ry) Rename to op_datagram_receive
fn op_receive( fn op_receive(
isolate_state: &mut CoreIsolateState, isolate_state: &mut CoreIsolateState,
state: &State, state: &State,
@ -191,6 +192,7 @@ struct SendArgs {
transport_args: ArgsEnum, transport_args: ArgsEnum,
} }
// TODO(ry) Rename to op_datagram_send
fn op_send( fn op_send(
isolate_state: &mut CoreIsolateState, isolate_state: &mut CoreIsolateState,
state: &State, state: &State,
@ -208,21 +210,21 @@ fn op_send(
transport_args: ArgsEnum::Ip(args), transport_args: ArgsEnum::Ip(args),
} if transport == "udp" => { } if transport == "udp" => {
state.check_net(&args.hostname, args.port)?; state.check_net(&args.hostname, args.port)?;
let addr = resolve_addr(&args.hostname, args.port)?;
let op = async move { let f = poll_fn(move |cx| {
let mut resource_table = resource_table.borrow_mut(); let mut resource_table = resource_table.borrow_mut();
let resource = resource_table let resource = resource_table
.get_mut::<UdpSocketResource>(rid as u32) .get_mut::<UdpSocketResource>(rid as u32)
.ok_or_else(|| { .ok_or_else(|| {
OpError::bad_resource("Socket has been closed".to_string()) OpError::bad_resource("Socket has been closed".to_string())
})?; })?;
let socket = &mut resource.socket; resource
let addr = resolve_addr(&args.hostname, args.port)?; .socket
socket.send_to(&zero_copy, addr).await?; .poll_send_to(cx, &zero_copy, &addr)
Ok(json!({})) .map_err(OpError::from)
}; .map_ok(|_| json!({}))
});
Ok(JsonOp::Async(op.boxed_local())) Ok(JsonOp::Async(f.boxed_local()))
} }
#[cfg(unix)] #[cfg(unix)]
SendArgs { SendArgs {

View file

@ -254,6 +254,21 @@ unitTest(
} }
); );
unitTest(
{ ignore: Deno.build.os === "windows", perms: { net: true } },
async function netUdpBorrowMutError(): Promise<void> {
const socket = Deno.listenDatagram({
port: 4501,
transport: "udp",
});
// Panic happened on second send: BorrowMutError
const a = socket.send(new Uint8Array(), socket.addr);
const b = socket.send(new Uint8Array(), socket.addr);
await Promise.all([a, b]);
socket.close();
}
);
unitTest( unitTest(
{ ignore: Deno.build.os === "windows", perms: { read: true, write: true } }, { ignore: Deno.build.os === "windows", perms: { read: true, write: true } },
async function netUnixPacketSendReceive(): Promise<void> { async function netUnixPacketSendReceive(): Promise<void> {