Skip to content

Commit d2f9e3b

Browse files
committed
Properly get server-process handle in all situations that need it
This fixes big-data sending to a different process when there are no handles or shmems to send -- we wouldn't actually get the other process handle at the start, so would end up dup'ing the big-data receiver handle to INVALID_HANDLE_VALUE, which is a pseudohandle for the current process. The remote would then try to read and get an INVALID_HANDLE error.
1 parent 5cbd305 commit d2f9e3b

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

src/platform/windows/mod.rs

+11-10
Original file line numberDiff line numberDiff line change
@@ -956,33 +956,34 @@ impl OsIpcSender {
956956
// to.
957957
assert!(data.len() < INVALID_HEADER_DATA_SIZE as usize);
958958

959-
let server_process_handle =
960-
if ports.len() > 0 || shared_memory_regions.len() > 0 {
961-
try!(self.get_pipe_server_process_handle())
962-
} else {
963-
WinHandle::invalid()
964-
};
959+
let mut server_process_handle_opt: Option<WinHandle> = None;
960+
let mut server_process_handle = || {
961+
if server_process_handle_opt.is_none() {
962+
server_process_handle_opt = Some(self.get_pipe_server_process_handle().unwrap());
963+
}
964+
**server_process_handle_opt.as_ref().unwrap()
965+
};
965966

966967
let mut oob = OsIpcOutOfBandMessage::new();
967968

968969
for ref shmem in shared_memory_regions {
969970
// shmem.handle, shmem.length
970-
let remote_handle = try!(dup_handle_to_process(*shmem.handle, *server_process_handle));
971+
let remote_handle = try!(dup_handle_to_process(*shmem.handle, server_process_handle()));
971972
oob.add_shmem(remote_handle, shmem.length);
972973
}
973974

974975
for port in ports {
975976
match port {
976977
OsIpcChannel::Sender(mut s) => {
977-
let raw_remote_handle = try!(move_handle_to_process(s.handle.take(), *server_process_handle));
978+
let raw_remote_handle = try!(move_handle_to_process(s.handle.take(), server_process_handle()));
978979
oob.add_sender(raw_remote_handle);
979980
},
980981
OsIpcChannel::Receiver(mut r) => {
981982
if try!(r.prepare_for_transfer()) == false {
982983
panic!("Sending receiver with outstanding partial read buffer, noooooo! What should even happen?");
983984
}
984985

985-
let raw_remote_handle = try!(move_handle_to_process(r.handle.take(), *server_process_handle));
986+
let raw_remote_handle = try!(move_handle_to_process(r.handle.take(), server_process_handle()));
986987
oob.add_receiver(raw_remote_handle);
987988
},
988989
}
@@ -996,7 +997,7 @@ impl OsIpcSender {
996997
big_data_sender = Some(try!(receiver.sender()));
997998

998999
// Put the receiver in the OOB data
999-
let raw_receiver_handle = try!(move_handle_to_process(receiver.handle.take(), *server_process_handle));
1000+
let raw_receiver_handle = try!(move_handle_to_process(receiver.handle.take(), server_process_handle()));
10001001
oob.set_big_data_receiver_handle(raw_receiver_handle);
10011002
}
10021003

0 commit comments

Comments
 (0)