ipc-channel icon indicating copy to clipboard operation
ipc-channel copied to clipboard

Sending an IpcReceiver over a previously sent IpcChannel doesn't work on Windows

Open zaddach opened this issue 2 years ago • 4 comments

I'm trying to set up a secondary channel through which I can transfer Senders/Receivers/SharedMemory. Since the secondary channel has been created in a single process, both its server and client named pipe have the same PID. When the secondary channel's pipe handle gets transferred to the other process (via DuplicateHandle), the PID for its server end isn't updated. When another handle (e.g., from a shared memory blob) is now sent over the connection, the transfer will fail on the other end, as the PID encoded in the OutOfBand message is wrong (and the handle hasn't been duplicated into the receiver's process).

Pseudocode of what I'm trying to do at the sender's side:

let sender: IpcSender<Requests> = IpcSender::connect(server_name).unwrap();
let (secondary_sender, secondary_sender_other_end) = channel<SecondaryRequests>().unwrap();
sender.send(Requests::Init(secondary_sender)).unwrap();
let shared_memory = IpcSharedMemory::from_byte(0xba, 1024 * 1024);
// The next command will fail on the receiver side, because the server PID of the secondary OsIpcSender is wrong (still the one of the current process, not the transferred OsIpcReceiver)
secondary_sender.send(SecondaryRequests::Mem(shared_memory)).unwrap();

zaddach avatar Mar 07 '23 15:03 zaddach

I hit the similar problem when attempting to add multiprocess support for Servo on Windows. It resulted in the same panic in oob_data.

wusyong avatar Jul 07 '24 03:07 wusyong

I wonder if we can replace the implementation with anonymous pipes instead. It states it's safe to duplicate the handle to other process.

wusyong avatar Sep 06 '24 05:09 wusyong

Anonymous pipes aren't very popular on Windows because they don't support overlapped operations. Internally they're a pair of named pipes anyways, just that the name isn't visible outside the Windows-internal code.

On Fri, Sep 6, 2024 at 7:55 AM Ngo Iok Ui (Wu Yu Wei) @.***> wrote:

I wonder if we can replace the implementation with anonymous pipes instead. It states it's safe to duplicate the handle to other process.

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

zaddach avatar Oct 01 '24 12:10 zaddach

yeah I saw there are lots of overlapped operations are not supported which ipc-channel needs them. I wonder how Firefox does it because it also uses named pipe for sure.

wusyong avatar Oct 02 '24 06:10 wusyong