Fix memory leak + crash

This commit is contained in:
Wizzard 2025-03-10 21:08:42 -04:00
parent 61ea504f28
commit 363db1c56a
3 changed files with 71 additions and 47 deletions
src/dma
context
mod.rs
threaddata

@ -196,7 +196,8 @@ impl DmaCtx {
let mut data_vec: Vec<(Address, u64, Vec<(u64, i32)>)> = data_vec let mut data_vec: Vec<(Address, u64, Vec<(u64, i32)>)> = data_vec
.into_iter() .into_iter()
.map(|(pawn, _, wep_count, wep_base)| { .map(|(pawn, _, wep_count, wep_base)| {
let weps = (0..wep_count).into_iter().map(|idx| (0u64, idx)).collect(); let safe_count = if wep_count < 0 || wep_count > 32 { 0 } else { wep_count };
let weps = (0..safe_count).into_iter().map(|idx| (0u64, idx)).collect();
(pawn, wep_base, weps) (pawn, wep_base, weps)
}) })
.collect(); .collect();
@ -206,7 +207,7 @@ impl DmaCtx {
data_vec.iter_mut().for_each(|(_, wep_base, wep_data_vec)| { data_vec.iter_mut().for_each(|(_, wep_base, wep_data_vec)| {
wep_data_vec.iter_mut().for_each(|(_, idx)| { wep_data_vec.iter_mut().for_each(|(_, idx)| {
let b: Address = (*wep_base).into(); let b: Address = (*wep_base).into();
batcher.read_into(b + * idx * 0x4, idx); batcher.read_into(b + u64::saturating_mul(*idx as u64, 0x4), idx);
}); });
}); });
drop(batcher); drop(batcher);

@ -76,10 +76,18 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_
.into_iter() .into_iter()
.map(|(_, pawn)| pawn) .map(|(_, pawn)| pawn)
.collect(); .collect();
pawns.push(data.local_pawn.into());
pawns.push(data.local_pawn.into());
let prev_holder = data.bomb_holder;
data.bomb_holder = ctx.get_c4_holder(pawns, data.entity_list.into(), &data); data.bomb_holder = ctx.get_c4_holder(pawns, data.entity_list.into(), &data);
if data.bomb_holder.is_some() && prev_holder.is_none() {
log::debug!("Bomb picked up by player");
data.bomb_dropped = false;
}
data.recheck_bomb_holder = false; data.recheck_bomb_holder = false;
} }
@ -138,18 +146,25 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_
// Bomb // Bomb
if data.bomb_dropped || data.bomb_planted { if data.bomb_dropped || data.bomb_planted {
let node = ctx.process.read_addr64( if let Ok(node) = ctx.process.read_addr64(
data.bomb + cs2dumper::client::C_BaseEntity::m_pGameSceneNode as u64 data.bomb + cs2dumper::client::C_BaseEntity::m_pGameSceneNode as u64
).unwrap(); ) {
let pos = ctx.process.read(node + cs2dumper::client::CGameSceneNode::m_vecAbsOrigin).unwrap(); if let Ok(pos) = ctx.process.read(node + cs2dumper::client::CGameSceneNode::m_vecAbsOrigin) {
entity_data.push(EntityData::Bomb(BombData::new(pos, data.bomb_planted)));
entity_data.push(EntityData::Bomb(BombData::new(pos, data.bomb_planted))); }
}
} }
// Local player // Local player
let local_data = ctx.batched_player_read( let local_data = match ctx.batched_player_read(
data.local.into(), data.local_pawn.into() data.local.into(), data.local_pawn.into()
).unwrap(); ) {
Ok(data) => data,
Err(e) => {
log::warn!("Failed to read local player data: {}", e);
continue;
}
};
if local_data.health > 0 { if local_data.health > 0 {
let has_bomb = match data.bomb_holder { let has_bomb = match data.bomb_holder {
@ -160,7 +175,7 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_
entity_data.push( entity_data.push(
EntityData::Player( EntityData::Player(
PlayerData::new( PlayerData::new(
local_data.pos, local_data.pos,
local_data.yaw, local_data.yaw,
PlayerType::Local, PlayerType::Local,
has_bomb, has_bomb,
@ -175,41 +190,47 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_
// Other players // Other players
for (controller, pawn) in &data.players { for (controller, pawn) in &data.players {
let player_data = ctx.batched_player_read(*controller, *pawn).unwrap(); match ctx.batched_player_read(*controller, *pawn) {
Ok(player_data) => {
if player_data.health < 1 {
continue;
}
if player_data.health < 1 { let has_bomb = match data.bomb_holder {
continue; Some(bh) => *pawn == bh,
} None => false,
};
let has_bomb = match data.bomb_holder { let player_type = {
Some(bh) => *pawn == bh, if local_data.team != player_data.team {
None => false, PlayerType::Enemy
}; } else if local_data.team == player_data.team {
PlayerType::Team
} else {
PlayerType::Unknown
}
};
let player_type = { entity_data.push(
if local_data.team != player_data.team { EntityData::Player(
PlayerType::Enemy PlayerData::new(
} else if local_data.team == player_data.team { player_data.pos,
PlayerType::Team player_data.yaw,
} else { player_type,
PlayerType::Unknown has_bomb,
player_data.has_awp,
player_data.is_scoped,
player_data.player_name,
player_data.weapon_id
)
)
);
},
Err(e) => {
log::warn!("Failed to read player data: {}", e);
continue;
} }
}; }
entity_data.push(
EntityData::Player(
PlayerData::new(
player_data.pos,
player_data.yaw,
player_type,
has_bomb,
player_data.has_awp,
player_data.is_scoped,
player_data.player_name,
player_data.weapon_id
)
)
);
} }
let mut radar = radar_data.write().await; let mut radar = radar_data.write().await;

@ -104,10 +104,12 @@ impl CsData {
} }
} }
} else if self.bomb_planted { } else if self.bomb_planted {
let bomb = ctx.get_plantedc4() match ctx.get_plantedc4() {
.expect("Failed to get planted bomb"); Ok(bomb) => self.bomb = bomb,
Err(e) => {
self.bomb = bomb; log::warn!("Failed to get planted bomb: {}", e);
}
}
} }
} }