From 8a189a27fb2e4e98c136db98b280c9b63f666b22 Mon Sep 17 00:00:00 2001
From: Alex Franchuk
Date: Mon, 29 Dec 2025 11:10:37 -0500
Subject: [PATCH 1/2] Rename ProcessMemory to ModuleMemory.
This better reflects what the type represents. This also absorbs the
`ProcessReader` type, which was poorly named as well, and adds a variant
which takes a MemReader by reference.
---
src/linux/minidump_writer/mod.rs | 5 ++-
src/linux/module_reader.rs | 72 ++++++++++++++------------------
2 files changed, 35 insertions(+), 42 deletions(-)
diff --git a/src/linux/minidump_writer/mod.rs b/src/linux/minidump_writer/mod.rs
index f388b2e..d5790ba 100644
--- a/src/linux/minidump_writer/mod.rs
+++ b/src/linux/minidump_writer/mod.rs
@@ -7,7 +7,7 @@ use {
dso_debug,
dumper_cpu_info::CpuInfoError,
maps_reader::{MappingInfo, MappingList, MapsReaderError},
- mem_reader::CopyFromProcessError,
+ mem_reader::{CopyFromProcessError, MemReader},
module_reader,
serializers::*,
thread_info::{ThreadInfo, ThreadInfoError},
@@ -953,8 +953,9 @@ impl MinidumpWriter {
mapping: &MappingInfo,
pid: Pid,
) -> Result {
+ let mem_reader = MemReader::new(pid);
Ok(T::read_from_module(
- module_reader::ProcessReader::new(pid, mapping.start_address).into(),
+ module_reader::ModuleMemory::from_process(&mem_reader, mapping.start_address),
)?)
}
}
diff --git a/src/linux/module_reader.rs b/src/linux/module_reader.rs
index 2eb521e..6a5d9f5 100644
--- a/src/linux/module_reader.rs
+++ b/src/linux/module_reader.rs
@@ -13,11 +13,6 @@ type Error = ModuleReaderError;
const NOTE_SECTION_NAME: &[u8] = b".note.gnu.build-id\0";
-pub struct ProcessReader {
- inner: MemReader,
- start_address: u64,
-}
-
#[derive(Debug, thiserror::Error, serde::Serialize)]
pub enum ModuleReaderError {
#[error("failed to read module file ({path}): {error}")]
@@ -84,35 +79,30 @@ pub enum ModuleReaderError {
},
}
-impl ProcessReader {
- pub fn new(pid: i32, start_address: usize) -> Self {
- Self {
- inner: MemReader::new(pid),
- start_address: start_address as u64,
- }
- }
-}
-
-pub enum ProcessMemory<'buf> {
- Slice(&'buf [u8]),
- Process(ProcessReader),
+pub enum ModuleMemory<'a> {
+ Slice(&'a [u8]),
+ Process {
+ reader: &'a MemReader,
+ start_address: u64,
+ },
}
-impl<'buf> From<&'buf [u8]> for ProcessMemory<'buf> {
+impl<'buf> From<&'buf [u8]> for ModuleMemory<'buf> {
fn from(value: &'buf [u8]) -> Self {
Self::Slice(value)
}
}
-impl From for ProcessMemory<'_> {
- fn from(value: ProcessReader) -> Self {
- Self::Process(value)
+impl<'a> ModuleMemory<'a> {
+ pub fn from_process(reader: &'a MemReader, start_address: usize) -> Self {
+ Self::Process {
+ reader,
+ start_address: start_address as u64,
+ }
}
-}
-impl<'buf> ProcessMemory<'buf> {
#[inline]
- fn read(&mut self, offset: u64, length: u64) -> Result, Error> {
+ fn read(&mut self, offset: u64, length: u64) -> Result, Error> {
let error = move |start_address, error| Error::ReadModuleMemory {
start_address,
offset,
@@ -121,15 +111,17 @@ impl<'buf> ProcessMemory<'buf> {
};
match self {
- Self::Process(pr) => {
- let error = |e| error(Some(pr.start_address), e);
+ Self::Process {
+ reader,
+ start_address,
+ } => {
+ let error = |e| error(Some(*start_address), e);
let len = std::num::NonZeroUsize::new(length as usize)
.ok_or_else(|| error(nix::Error::EINVAL))?;
- let proc_offset = pr
- .start_address
+ let proc_offset = start_address
.checked_add(offset)
.ok_or_else(|| error(nix::Error::EOVERFLOW))?;
- pr.inner
+ reader
.read_to_vec(proc_offset as _, len)
.map(Cow::Owned)
.map_err(|err| error(err.source))
@@ -149,15 +141,15 @@ impl<'buf> ProcessMemory<'buf> {
/// Calculates the absolute address of the specified relative address
#[inline]
fn absolute(&self, addr: u64) -> u64 {
- let Self::Process(pr) = self else {
+ let Self::Process { start_address, .. } = self else {
return addr;
};
- addr.checked_sub(pr.start_address).unwrap_or(addr)
+ addr.checked_sub(*start_address).unwrap_or(addr)
}
#[inline]
fn is_process_memory(&self) -> bool {
- matches!(self, Self::Process(_))
+ matches!(self, Self::Process { .. })
}
}
@@ -192,7 +184,7 @@ fn section_header_with_name<'sc>(
section_headers: &'sc elf::SectionHeaders,
strtab_index: usize,
name: &[u8],
- module_memory: &mut ProcessMemory<'_>,
+ module_memory: &mut ModuleMemory<'_>,
) -> Result