diff --git a/crates/daemon/src/idm.rs b/crates/daemon/src/idm.rs index 7525def..ee788b9 100644 --- a/crates/daemon/src/idm.rs +++ b/crates/daemon/src/idm.rs @@ -120,16 +120,22 @@ impl DaemonIdm { if let Some(data) = data { let buffer = buffers.entry(domid).or_insert_with_key(|_| BytesMut::new()); buffer.extend_from_slice(&data); - if buffer.len() < 4 { + if buffer.len() < 6 { continue; } - let size = (buffer[0] as u32 | (buffer[1] as u32) << 8 | (buffer[2] as u32) << 16 | (buffer[3] as u32) << 24) as usize; - let needed = size + 4; + + if buffer[0] != 0xff || buffer[1] != 0xff { + buffer.clear(); + continue; + } + + let size = (buffer[2] as u32 | (buffer[3] as u32) << 8 | (buffer[4] as u32) << 16 | (buffer[5] as u32) << 24) as usize; + let needed = size + 6; if buffer.len() < needed { continue; } let mut packet = buffer.split_to(needed); - packet.advance(4); + packet.advance(6); match IdmPacket::decode(packet) { Ok(packet) => { let _ = client_or_create(domid, &self.tx_sender, &self.clients, &self.feeds).await?; @@ -159,12 +165,14 @@ impl DaemonIdm { x = self.tx_receiver.recv() => match x { Some((domid, packet)) => { let data = packet.encode_to_vec(); - let mut buffer = vec![0u8; 4]; + let mut buffer = vec![0u8; 6]; let length = data.len() as u32; - buffer[0] = length as u8; - buffer[1] = (length << 8) as u8; - buffer[2] = (length << 16) as u8; - buffer[3] = (length << 24) as u8; + buffer[0] = 0xff; + buffer[1] = 0xff; + buffer[2] = length as u8; + buffer[3] = (length << 8) as u8; + buffer[4] = (length << 16) as u8; + buffer[5] = (length << 24) as u8; buffer.extend_from_slice(&data); self.tx_raw_sender.send((domid, buffer)).await?; let _ = self.snoop_sender.send(DaemonIdmSnoopPacket { from: 0, to: domid, packet }); diff --git a/crates/krata/src/idm/client.rs b/crates/krata/src/idm/client.rs index c9ac714..3c0181b 100644 --- a/crates/krata/src/idm/client.rs +++ b/crates/krata/src/idm/client.rs @@ -69,6 +69,14 @@ impl IdmBackend for IdmFileBackend { async fn recv(&mut self) -> Result { let mut fd = self.read_fd.lock().await; let mut guard = fd.readable_mut().await?; + let b1 = guard.get_inner_mut().read_u8().await?; + if b1 != 0xff { + return Ok(IdmPacket::default()); + } + let b2 = guard.get_inner_mut().read_u8().await?; + if b2 != 0xff { + return Ok(IdmPacket::default()); + } let size = guard.get_inner_mut().read_u32_le().await?; if size == 0 { return Ok(IdmPacket::default()); @@ -84,6 +92,7 @@ impl IdmBackend for IdmFileBackend { async fn send(&mut self, packet: IdmPacket) -> Result<()> { let mut file = self.write.lock().await; let data = packet.encode_to_vec(); + file.write_all(&[0xff, 0xff]).await?; file.write_u32_le(data.len() as u32).await?; file.write_all(&data).await?; Ok(())