diff options
author | Zach Reizner <zachr@google.com> | 2019-02-13 17:33:32 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-02-28 03:24:24 -0800 |
commit | a60744b42ee2589e9318029cf3fd7d87fd73f29d (patch) | |
tree | 4819c7b24caab92956d95474e638eb067a5ce926 /devices/src | |
parent | b7196e2a1c1eb7123e7eace5418b7eb4a3e24dbe (diff) | |
download | crosvm-a60744b42ee2589e9318029cf3fd7d87fd73f29d.tar crosvm-a60744b42ee2589e9318029cf3fd7d87fd73f29d.tar.gz crosvm-a60744b42ee2589e9318029cf3fd7d87fd73f29d.tar.bz2 crosvm-a60744b42ee2589e9318029cf3fd7d87fd73f29d.tar.lz crosvm-a60744b42ee2589e9318029cf3fd7d87fd73f29d.tar.xz crosvm-a60744b42ee2589e9318029cf3fd7d87fd73f29d.tar.zst crosvm-a60744b42ee2589e9318029cf3fd7d87fd73f29d.zip |
crosvm: use seqpacket rather than datagram sockets
The advantage of seqpacket is that they are connection oriented. A listener can be created that accepts new connections, useful for the path based VM control sockets. Previously, the only bidirectional sockets in crosvm were either stream based or made using socketpair. This change also whitelists sendmsg and recvmsg for the common device policy. TEST=cargo test BUG=chromium:848187 Change-Id: I83fd46f54bce105a7730632cd013b5e7047db22b Reviewed-on: https://chromium-review.googlesource.com/1470917 Commit-Ready: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Tested-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
Diffstat (limited to 'devices/src')
-rw-r--r-- | devices/src/proxy.rs | 8 | ||||
-rw-r--r-- | devices/src/virtio/balloon.rs | 11 | ||||
-rw-r--r-- | devices/src/virtio/block.rs | 11 | ||||
-rw-r--r-- | devices/src/virtio/wl.rs | 13 |
4 files changed, 22 insertions, 21 deletions
diff --git a/devices/src/proxy.rs b/devices/src/proxy.rs index 4bc3405..a91d2ed 100644 --- a/devices/src/proxy.rs +++ b/devices/src/proxy.rs @@ -7,14 +7,14 @@ use libc::pid_t; use std::os::unix::io::{AsRawFd, RawFd}; -use std::os::unix::net::UnixDatagram; use std::process; use std::time::Duration; use std::{self, fmt, io}; +use io_jail::{self, Minijail}; use msg_socket::{MsgOnSocket, MsgReceiver, MsgSender, MsgSocket}; +use sys_util::net::UnixSeqpacket; -use io_jail::{self, Minijail}; use BusDevice; /// Errors for proxy devices. @@ -64,7 +64,7 @@ enum CommandResult { ReadConfigResult(u32), } -fn child_proc(sock: UnixDatagram, device: &mut BusDevice) { +fn child_proc(sock: UnixSeqpacket, device: &mut BusDevice) { let mut running = true; let sock = MsgSocket::<CommandResult, Command>::new(sock); @@ -138,7 +138,7 @@ impl ProxyDevice { mut keep_fds: Vec<RawFd>, ) -> Result<ProxyDevice> { let debug_label = device.debug_label(); - let (child_sock, parent_sock) = UnixDatagram::pair().map_err(Error::Io)?; + let (child_sock, parent_sock) = UnixSeqpacket::pair().map_err(Error::Io)?; keep_fds.push(child_sock.as_raw_fd()); // Forking here is safe as long as the program is still single threaded. diff --git a/devices/src/virtio/balloon.rs b/devices/src/virtio/balloon.rs index 1dfb72c..e9f36f6 100644 --- a/devices/src/virtio/balloon.rs +++ b/devices/src/virtio/balloon.rs @@ -8,13 +8,14 @@ use std::fmt::{self, Display}; use std::io::Write; use std::mem; use std::os::unix::io::{AsRawFd, RawFd}; -use std::os::unix::net::UnixDatagram; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; use std::thread; use byteorder::{ByteOrder, LittleEndian, ReadBytesExt, WriteBytesExt}; -use sys_util::{self, EventFd, GuestAddress, GuestMemory, PollContext, PollToken}; +use sys_util::{ + self, net::UnixSeqpacket, EventFd, GuestAddress, GuestMemory, PollContext, PollToken, +}; use super::{ DescriptorChain, Queue, VirtioDevice, INTERRUPT_STATUS_CONFIG_CHANGED, @@ -67,7 +68,7 @@ struct Worker { interrupt_evt: EventFd, interrupt_resample_evt: EventFd, config: Arc<BalloonConfig>, - command_socket: UnixDatagram, + command_socket: UnixSeqpacket, } fn valid_inflate_desc(desc: &DescriptorChain) -> bool { @@ -230,7 +231,7 @@ impl Worker { /// Virtio device for memory balloon inflation/deflation. pub struct Balloon { - command_socket: Option<UnixDatagram>, + command_socket: Option<UnixSeqpacket>, config: Arc<BalloonConfig>, features: u64, kill_evt: Option<EventFd>, @@ -238,7 +239,7 @@ pub struct Balloon { impl Balloon { /// Create a new virtio balloon device. - pub fn new(command_socket: UnixDatagram) -> Result<Balloon> { + pub fn new(command_socket: UnixSeqpacket) -> Result<Balloon> { Ok(Balloon { command_socket: Some(command_socket), config: Arc::new(BalloonConfig { diff --git a/devices/src/virtio/block.rs b/devices/src/virtio/block.rs index 9dcf828..3c5d2fd 100644 --- a/devices/src/virtio/block.rs +++ b/devices/src/virtio/block.rs @@ -7,7 +7,6 @@ use std::fmt::{self, Display}; use std::io::{self, Read, Seek, SeekFrom, Write}; use std::mem::{size_of, size_of_val}; use std::os::unix::io::{AsRawFd, RawFd}; -use std::os::unix::net::UnixDatagram; use std::result; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; @@ -19,8 +18,8 @@ use sync::Mutex; use sys_util::Error as SysError; use sys_util::Result as SysResult; use sys_util::{ - EventFd, FileSetLen, FileSync, GuestAddress, GuestMemory, GuestMemoryError, PollContext, - PollToken, PunchHole, TimerFd, WriteZeroes, + net::UnixSeqpacket, EventFd, FileSetLen, FileSync, GuestAddress, GuestMemory, GuestMemoryError, + PollContext, PollToken, PunchHole, TimerFd, WriteZeroes, }; use data_model::{DataInit, Le16, Le32, Le64}; @@ -695,7 +694,7 @@ impl<T: DiskFile> Worker<T> { self.interrupt_evt.write(1).unwrap(); } - fn run(&mut self, queue_evt: EventFd, kill_evt: EventFd, control_socket: UnixDatagram) { + fn run(&mut self, queue_evt: EventFd, kill_evt: EventFd, control_socket: UnixSeqpacket) { #[derive(PollToken)] enum Token { FlushTimer, @@ -819,7 +818,7 @@ pub struct Block<T: DiskFile> { disk_size: Arc<Mutex<u64>>, avail_features: u64, read_only: bool, - control_socket: Option<UnixDatagram>, + control_socket: Option<UnixSeqpacket>, } fn build_config_space(disk_size: u64) -> virtio_blk_config { @@ -844,7 +843,7 @@ impl<T: DiskFile> Block<T> { pub fn new( mut disk_image: T, read_only: bool, - control_socket: Option<UnixDatagram>, + control_socket: Option<UnixSeqpacket>, ) -> SysResult<Block<T>> { let disk_size = disk_image.seek(SeekFrom::End(0))? as u64; if disk_size % SECTOR_SIZE != 0 { diff --git a/devices/src/virtio/wl.rs b/devices/src/virtio/wl.rs index 4d43825..0220d42 100644 --- a/devices/src/virtio/wl.rs +++ b/devices/src/virtio/wl.rs @@ -41,7 +41,7 @@ use std::mem::{size_of, size_of_val}; #[cfg(feature = "wl-dmabuf")] use std::os::raw::{c_uint, c_ulonglong}; use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; -use std::os::unix::net::{UnixDatagram, UnixStream}; +use std::os::unix::net::UnixStream; use std::path::{Path, PathBuf}; use std::rc::Rc; use std::result; @@ -59,6 +59,7 @@ use data_model::*; use msg_socket::{MsgError, MsgReceiver, MsgSender, MsgSocket}; #[cfg(feature = "wl-dmabuf")] use resources::GpuMemoryDesc; +use sys_util::net::UnixSeqpacket; use sys_util::{ pipe, round_up_to_page_size, Error, EventFd, FileFlags, GuestAddress, GuestMemory, GuestMemoryError, PollContext, PollToken, Result, ScmSocket, SharedMemory, @@ -490,7 +491,7 @@ struct VmRequester { } impl VmRequester { - fn new(vm_socket: UnixDatagram) -> VmRequester { + fn new(vm_socket: UnixSeqpacket) -> VmRequester { VmRequester { inner: Rc::new(RefCell::new(MsgSocket::<VmRequest, VmResponse>::new( vm_socket, @@ -1004,7 +1005,7 @@ struct WlState { impl WlState { fn new( wayland_path: PathBuf, - vm_socket: UnixDatagram, + vm_socket: UnixSeqpacket, use_transition_flags: bool, resource_bridge: Option<ResourceRequestSocket>, ) -> WlState { @@ -1488,7 +1489,7 @@ impl Worker { in_queue: Queue, out_queue: Queue, wayland_path: PathBuf, - vm_socket: UnixDatagram, + vm_socket: UnixSeqpacket, use_transition_flags: bool, resource_bridge: Option<ResourceRequestSocket>, ) -> Worker { @@ -1678,7 +1679,7 @@ impl Worker { pub struct Wl { kill_evt: Option<EventFd>, wayland_path: PathBuf, - vm_socket: Option<UnixDatagram>, + vm_socket: Option<UnixSeqpacket>, resource_bridge: Option<ResourceRequestSocket>, use_transition_flags: bool, } @@ -1686,7 +1687,7 @@ pub struct Wl { impl Wl { pub fn new<P: AsRef<Path>>( wayland_path: P, - vm_socket: UnixDatagram, + vm_socket: UnixSeqpacket, resource_bridge: Option<ResourceRequestSocket>, ) -> Result<Wl> { Ok(Wl { |