From f067d0fee9e15cafb0012c3e90838376e4e8fffd Mon Sep 17 00:00:00 2001 From: whitequark Date: Mon, 26 Mar 2018 12:35:28 +0000 Subject: [PATCH] Fix DMA writing to dangling pointers in ethmac. --- firmware/src/ethmac.rs | 13 ++++++++----- firmware/src/main.rs | 5 +++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/firmware/src/ethmac.rs b/firmware/src/ethmac.rs index 985a192..580a283 100644 --- a/firmware/src/ethmac.rs +++ b/firmware/src/ethmac.rs @@ -355,14 +355,17 @@ impl DeviceInner { pub struct Device(RefCell); impl Device { - pub fn new(mac: EthernetAddress) -> Device { - let mut inner = DeviceInner::new(); - inner.init(mac); - Device(RefCell::new(inner)) + pub fn new() -> Device { + Device(RefCell::new(DeviceInner::new())) + } + + // After `init` is called, `Device` shall not be moved. + pub unsafe fn init(&mut self, mac: EthernetAddress) { + self.0.borrow_mut().init(mac); } } -impl<'a> phy::Device<'a> for Device { +impl<'a, 'b> phy::Device<'a> for &'b mut Device { type RxToken = RxToken<'a>; type TxToken = TxToken<'a>; diff --git a/firmware/src/main.rs b/firmware/src/main.rs index 1feee84..82b8604 100644 --- a/firmware/src/main.rs +++ b/firmware/src/main.rs @@ -164,8 +164,9 @@ fn main() { println!("MAC {} IP {}", hardware_addr, ip_addrs[0]); let mut neighbor_cache_storage = [None; 8]; let neighbor_cache = NeighborCache::new(&mut neighbor_cache_storage[..]); - let device = ethmac::Device::new(hardware_addr); - let mut iface = EthernetInterfaceBuilder::new(device) + let mut device = ethmac::Device::new(); + unsafe { device.init(hardware_addr) }; + let mut iface = EthernetInterfaceBuilder::new(&mut device) .ethernet_addr(hardware_addr) .neighbor_cache(neighbor_cache) .ip_addrs(&mut ip_addrs[..])