From b95bf2e31f0be429a78f9639835312d8423fd632 Mon Sep 17 00:00:00 2001 From: Alex Franchuk Date: Wed, 17 May 2023 11:21:42 -0400 Subject: [PATCH] Use procfs-core rather than procfs to reduce dependencies. --- Cargo.toml | 2 +- src/linux/auxv_reader.rs | 2 +- src/linux/errors.rs | 2 +- src/linux/maps_reader.rs | 7 ++++--- src/linux/ptrace_dumper.rs | 3 ++- src/linux/sections/memory_info_list_stream.rs | 15 ++++++++++----- 6 files changed, 19 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3182b286..373a9ec3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ nix = { version = "0.26", default-features = false, features = [ "user", ] } # Used for parsing procfs info. -procfs = "0.15.1" +procfs-core = { git = "https://github.com/eminence/procfs", rev = "591016286d195f523628eccf5cac9c923ae6ea45" } [target.'cfg(target_os = "windows")'.dependencies] bitflags = "2.0" diff --git a/src/linux/auxv_reader.rs b/src/linux/auxv_reader.rs index 1fcaff96..3b5254f4 100644 --- a/src/linux/auxv_reader.rs +++ b/src/linux/auxv_reader.rs @@ -25,7 +25,7 @@ pub struct AuxvPair { pub value: AuxvType, } -/// An iterator across auxv pairs froom procfs. +/// An iterator across auxv pairs from procfs. pub struct ProcfsAuxvIter { pair_size: usize, buf: Vec, diff --git a/src/linux/errors.rs b/src/linux/errors.rs index d7b1c586..a2e70957 100644 --- a/src/linux/errors.rs +++ b/src/linux/errors.rs @@ -152,7 +152,7 @@ pub enum SectionMemInfoListError { #[error("Failed to write to memory")] MemoryWriterError(#[from] MemoryWriterError), #[error("Failed to read from procfs")] - ProcfsError(#[from] procfs::ProcError), + ProcfsError(#[from] procfs_core::ProcError), } #[derive(Debug, Error)] diff --git a/src/linux/maps_reader.rs b/src/linux/maps_reader.rs index 249f63b3..f6bfddec 100644 --- a/src/linux/maps_reader.rs +++ b/src/linux/maps_reader.rs @@ -4,7 +4,7 @@ use crate::thread_info::Pid; use byteorder::{NativeEndian, ReadBytesExt}; use goblin::elf; use memmap2::{Mmap, MmapOptions}; -use procfs::process::{MMPermissions, MMapPath, MemoryMaps}; +use procfs_core::process::{MMPermissions, MMapPath, MemoryMaps}; use std::ffi::{OsStr, OsString}; use std::os::unix::ffi::OsStrExt; use std::{fs::File, mem::size_of, path::PathBuf}; @@ -73,7 +73,7 @@ impl MappingInfo { pub fn aggregate(memory_maps: MemoryMaps, linux_gate_loc: AuxvType) -> Result> { let mut infos = Vec::::new(); - for mm in memory_maps.memory_maps { + for mm in memory_maps { let start_address: usize = mm.address.0.try_into()?; let end_address: usize = mm.address.1.try_into()?; let mut offset: usize = mm.offset.try_into()?; @@ -345,10 +345,11 @@ impl MappingInfo { #[cfg(target_pointer_width = "64")] // All addresses are 64 bit and I'm currently too lazy to adjust it to work for both mod tests { use super::*; + use procfs_core::prelude::*; fn get_mappings_for(map: &str, linux_gate_loc: u64) -> Vec { MappingInfo::aggregate( - MemoryMaps::from_reader(map.as_bytes()).expect("failed to read mapping info"), + MemoryMaps::from_read(map.as_bytes()).expect("failed to read mapping info"), linux_gate_loc, ) .unwrap_or_default() diff --git a/src/linux/ptrace_dumper.rs b/src/linux/ptrace_dumper.rs index 1dad9c31..3cf030e0 100644 --- a/src/linux/ptrace_dumper.rs +++ b/src/linux/ptrace_dumper.rs @@ -274,7 +274,8 @@ impl PtraceDumper { let maps_path = path::PathBuf::from(&filename); let maps_file = std::fs::File::open(maps_path).map_err(errmap)?; - self.mappings = procfs::process::MemoryMaps::from_reader(maps_file) + use procfs_core::prelude::*; + self.mappings = procfs_core::process::MemoryMaps::from_read(maps_file) .ok() .and_then(|maps| MappingInfo::aggregate(maps, linux_gate_loc).ok()) .unwrap_or_default(); diff --git a/src/linux/sections/memory_info_list_stream.rs b/src/linux/sections/memory_info_list_stream.rs index 01d2001e..370b8726 100644 --- a/src/linux/sections/memory_info_list_stream.rs +++ b/src/linux/sections/memory_info_list_stream.rs @@ -1,21 +1,26 @@ use super::*; use minidump_common::format::{MemoryProtection, MemoryState, MemoryType}; -use procfs::process::MMPermissions; +use procfs_core::{ + prelude::*, + process::{MMPermissions, MemoryMaps}, +}; /// Write a MemoryInfoListStream using information from procfs. pub fn write( config: &mut MinidumpWriter, buffer: &mut DumpBuf, ) -> Result { - let process = procfs::process::Process::new(config.blamed_thread)?; - let maps = process.maps()?; + let maps = MemoryMaps::from_file(std::path::PathBuf::from(format!( + "/proc/{}/maps", + config.blamed_thread + )))?; let list_header = MemoryWriter::alloc_with_val( buffer, MDMemoryInfoList { size_of_header: std::mem::size_of::() as u32, size_of_entry: std::mem::size_of::() as u32, - number_of_entries: maps.memory_maps.len() as u64, + number_of_entries: maps.len() as u64, }, )?; @@ -26,7 +31,7 @@ pub fn write( let block_list = MemoryArrayWriter::::alloc_from_iter( buffer, - maps.memory_maps.iter().map(|mm| MDMemoryInfo { + maps.iter().map(|mm| MDMemoryInfo { base_address: mm.address.0, allocation_base: mm.address.0, allocation_protection: get_memory_protection(mm.perms).bits(),