network helpers: fix fd leak in get_network_interfaces
This one always leaked. Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
		| @ -1,14 +1,16 @@ | |||||||
| use std::path::Path; | use std::path::Path; | ||||||
| use std::process::Command; | use std::process::Command; | ||||||
| use std::collections::HashMap; | use std::collections::HashMap; | ||||||
|  | use std::os::unix::io::{AsRawFd, FromRawFd}; | ||||||
|  |  | ||||||
| use anyhow::{Error, bail, format_err}; | use anyhow::{Error, bail, format_err}; | ||||||
| use lazy_static::lazy_static; | use lazy_static::lazy_static; | ||||||
| use nix::sys::socket::{socket, AddressFamily, SockType, SockFlag}; |  | ||||||
| use nix::ioctl_read_bad; | use nix::ioctl_read_bad; | ||||||
|  | use nix::sys::socket::{socket, AddressFamily, SockType, SockFlag}; | ||||||
| use regex::Regex; | use regex::Regex; | ||||||
|  |  | ||||||
| use proxmox::*; // for IP macros | use proxmox::*; // for IP macros | ||||||
|  | use proxmox::tools::fd::Fd; | ||||||
|  |  | ||||||
| pub static IPV4_REVERSE_MASK: &[&str] = &[ | pub static IPV4_REVERSE_MASK: &[&str] = &[ | ||||||
|     "0.0.0.0", |     "0.0.0.0", | ||||||
| @ -133,8 +135,24 @@ pub fn get_network_interfaces() -> Result<HashMap<String, bool>, Error> { | |||||||
|  |  | ||||||
|     let lines = raw.lines(); |     let lines = raw.lines(); | ||||||
|  |  | ||||||
|     let sock = socket(AddressFamily::Inet, SockType::Datagram, SockFlag::empty(), None) |     let sock = unsafe { | ||||||
|         .or_else(|_| socket(AddressFamily::Inet6, SockType::Datagram, SockFlag::empty(), None))?; |         Fd::from_raw_fd( | ||||||
|  |             socket( | ||||||
|  |                 AddressFamily::Inet, | ||||||
|  |                 SockType::Datagram, | ||||||
|  |                 SockFlag::empty(), | ||||||
|  |                 None, | ||||||
|  |             ) | ||||||
|  |             .or_else(|_| { | ||||||
|  |                 socket( | ||||||
|  |                     AddressFamily::Inet6, | ||||||
|  |                     SockType::Datagram, | ||||||
|  |                     SockFlag::empty(), | ||||||
|  |                     None, | ||||||
|  |                 ) | ||||||
|  |             })?, | ||||||
|  |         ) | ||||||
|  |     }; | ||||||
|  |  | ||||||
|     let mut interface_list = HashMap::new(); |     let mut interface_list = HashMap::new(); | ||||||
|  |  | ||||||
| @ -146,7 +164,7 @@ pub fn get_network_interfaces() -> Result<HashMap<String, bool>, Error> { | |||||||
|             for (i, b) in std::ffi::CString::new(ifname)?.as_bytes_with_nul().iter().enumerate() { |             for (i, b) in std::ffi::CString::new(ifname)?.as_bytes_with_nul().iter().enumerate() { | ||||||
|                 if i < (libc::IFNAMSIZ-1) { req.ifr_name[i] = *b as libc::c_uchar; } |                 if i < (libc::IFNAMSIZ-1) { req.ifr_name[i] = *b as libc::c_uchar; } | ||||||
|             } |             } | ||||||
|             let res = unsafe { get_interface_flags(sock, &mut req)? }; |             let res = unsafe { get_interface_flags(sock.as_raw_fd(), &mut req)? }; | ||||||
|             if res != 0 { |             if res != 0 { | ||||||
|                 bail!("ioctl get_interface_flags for '{}' failed ({})", ifname, res); |                 bail!("ioctl get_interface_flags for '{}' failed ({})", ifname, res); | ||||||
|             } |             } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user