Compare commits

...

2 Commits

Author SHA1 Message Date
e7fd197ee8 Bump version to 1.1.0 2025-08-01 22:33:28 +02:00
4dcd5ee998 Correctly handle result data bounds 2025-08-01 22:27:43 +02:00
4 changed files with 21 additions and 8 deletions

2
Cargo.lock generated
View File

@@ -315,7 +315,7 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "improv-setup"
version = "1.0.0"
version = "1.1.0"
dependencies = [
"anyhow",
"clap",

View File

@@ -1,6 +1,6 @@
[package]
name = "improv-setup"
version = "1.0.0"
version = "1.1.0"
edition = "2021"
[dependencies]

View File

@@ -10,7 +10,7 @@
in {
improv-setup = pkgs.rustPlatform.buildRustPackage rec {
pname = "improv-setup";
version = "1.0.0";
version = "1.1.0";
src = ./.;

View File

@@ -483,21 +483,34 @@ impl ImprovDataFromPacket for RPCResultPacket {
return Err(anyhow!("Packet is not RPCResult"));
}
// Byte 1
let command_responded_to = RPCCommand::try_from(&raw_packet.data[0]).context("Failed to determine RPC command this packet responds to")?;
// Byte 2
let result_data_len = usize::from(raw_packet.data[1]);
// Byte 3...
// slice the part of the raw_packet data that contains the result strings
let result_data = &raw_packet.data[2..result_data_len+2];
// the ESPHome implementation has a trailing nullbyte after the strings, so result_data
// ends before raw_packet.data, everything after that is ignored
// store result strings
let mut results: Vec<String> = Vec::new();
let mut data_position: usize = 2;
let mut data_position: usize = 0;
loop {
if data_position >= raw_packet.data.len() {
if data_position >= result_data.len() {
break;
}
// find string bounds
let current_string_len: usize = usize::from(raw_packet.data[data_position]);
let current_string_len: usize = usize::from(result_data[data_position]);
let current_string_begin = data_position + 1;
let current_string_end = data_position + current_string_len;
// load string and append to results
let string_bytes = &raw_packet.data[current_string_begin..current_string_end+1];
let string_bytes = &result_data[current_string_begin..current_string_end+1];
let string = std::str::from_utf8(string_bytes).context("Failed to convert response to UTF-8 string")?.to_string();
results.push(string);
@@ -506,7 +519,7 @@ impl ImprovDataFromPacket for RPCResultPacket {
}
return Ok(Self {
command_responded_to: RPCCommand::try_from(&raw_packet.data[0]).context("Failed to determine RPC command this packet responds to")?,
command_responded_to: command_responded_to,
results: results,
})
}