|
60 | 60 | #![deny(rust_2018_idioms)] |
61 | 61 |
|
62 | 62 | use std::{ |
63 | | - ffi::CStr, |
| 63 | + ffi::{CStr, c_void}, |
64 | 64 | fmt, |
65 | 65 | fs::File, |
66 | 66 | mem, |
@@ -531,27 +531,28 @@ impl PfCtl { |
531 | 531 | // Maximum number of ioctl retries before giving up |
532 | 532 | const MAX_RETRIES: usize = 2; |
533 | 533 |
|
534 | | - let mut buf: Vec<ffi::pfvar::pfi_kif> = Vec::with_capacity(INITIAL_CAPACITY); |
535 | | - let mut iface = unsafe { mem::zeroed::<ffi::pfvar::pfioc_iface>() }; |
| 534 | + let mut buf: Vec<ffi::pfvar::pfi_kif> = |
| 535 | + ffi::pfvar::pfi_kif::new_vec_zeroed(INITIAL_CAPACITY).expect("allocation must succeed"); |
| 536 | + let mut iface = ffi::pfvar::pfioc_iface::new_zeroed(); |
536 | 537 | interface.try_copy_to(&mut iface.pfiio_name)?; |
537 | 538 | iface.pfiio_esize = mem::size_of::<ffi::pfvar::pfi_kif>() as i32; |
538 | 539 |
|
539 | 540 | let mut retry = 0; |
540 | 541 | loop { |
541 | | - iface.pfiio_buffer = buf.as_mut_ptr() as _; |
542 | | - iface.pfiio_size = buf.capacity() as _; |
| 542 | + iface.pfiio_buffer = buf.as_mut_ptr().cast::<c_void>(); |
| 543 | + iface.pfiio_size = buf.len() as i32; |
543 | 544 |
|
544 | 545 | ioctl_guard!(ffi::pf_get_ifaces(self.fd(), &mut iface))?; |
545 | 546 | let num_system_interfaces = usize::try_from(iface.pfiio_size).unwrap_or_default(); |
546 | 547 |
|
547 | 548 | retry += 1; |
548 | 549 | // Reserve additional space and retry if number of system interfaces exceeds capacity |
549 | | - if retry < MAX_RETRIES && num_system_interfaces > buf.capacity() { |
550 | | - buf.reserve(num_system_interfaces); |
| 550 | + if retry < MAX_RETRIES && num_system_interfaces > buf.len() { |
| 551 | + buf = ffi::pfvar::pfi_kif::new_vec_zeroed(num_system_interfaces) |
| 552 | + .expect("allocation must succeed"); |
551 | 553 | } else { |
552 | | - let new_len = std::cmp::min(num_system_interfaces, buf.capacity()); |
553 | | - // SAFETY: safe since new_len is capped at capacity |
554 | | - unsafe { buf.set_len(new_len) }; |
| 554 | + // truncate will only shorten the vec, but this is fine. |
| 555 | + buf.truncate(num_system_interfaces); |
555 | 556 | break; |
556 | 557 | } |
557 | 558 | } |
|
0 commit comments