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(),