From 567fcc296e7a774beb459a646d953f55d27a2e88 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Thu, 28 Mar 2024 08:55:59 +0000 Subject: [PATCH] kratart: fix channels after u32::MAX worth of data --- crates/kratart/src/channel.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/kratart/src/channel.rs b/crates/kratart/src/channel.rs index 6df439e..07348f3 100644 --- a/crates/kratart/src/channel.rs +++ b/crates/kratart/src/channel.rs @@ -423,12 +423,12 @@ impl KrataChannelBackendProcessor { if space > XenConsoleInterface::INPUT_SIZE { error!("channel for domid {} has an invalid input space of {}", self.domid, space); } - let free = XenConsoleInterface::INPUT_SIZE - space; + let free = XenConsoleInterface::INPUT_SIZE.wrapping_sub(space); let want = data.len().min(free); let buffer = &data[index..want]; for b in buffer { unsafe { (*interface).input[prod as usize & (XenConsoleInterface::INPUT_SIZE - 1)] = *b; }; - prod += 1; + prod = prod.wrapping_add(1); } fence(Ordering::Release); unsafe { (*interface).in_prod = prod; }; @@ -478,7 +478,7 @@ impl KrataChannelBackendProcessor { let mut cons = (*interface).out_cons; let prod = (*interface).out_prod; fence(Ordering::Release); - let size = prod - cons; + let size = prod.wrapping_sub(cons); let mut data: Vec = Vec::new(); if size == 0 || size as usize > XenConsoleInterface::OUTPUT_SIZE { return Ok(data); @@ -488,7 +488,7 @@ impl KrataChannelBackendProcessor { break; } data.push((*interface).output[cons as usize & (XenConsoleInterface::OUTPUT_SIZE - 1)]); - cons += 1; + cons = cons.wrapping_add(1); } fence(Ordering::AcqRel); (*interface).out_cons = cons;