Better, faster and stronger errors.

This commit is contained in:
CosminPerRam 2022-11-24 23:38:51 +02:00
parent b988b51cff
commit 304b8340d2
7 changed files with 75 additions and 69 deletions

View file

@ -4,12 +4,24 @@ use crate::{GDResult, GDError};
fn resolve_dns(address: &str) -> GDResult<String> {
let resolver = Resolver::new(ResolverConfig::default(), ResolverOpts::default())
.map_err(|e| GDError::DnsResolve(e.to_string()))?;
.map_err(|e| GDError::DnsResolve(e.to_string().as_str()))?;
let response = resolver.lookup_ip(address)
.map_err(|e| GDError::DnsResolve(e.to_string()))?;
.map_err(|e| GDError::DnsResolve(e.to_string().as_str()))?;
Ok(response.iter().next().ok_or(GDError::DnsResolve("Couldn't resolve the DNS address.".to_string()))?.to_string())
Ok(response.iter().next().ok_or(GDError::DnsResolve("Couldn't resolve the DNS address."))?.to_string())
}
pub fn error_by_expected_size(expected: usize, size: usize) -> GDResult<()> {
if size < expected {
Err(GDError::PacketUnderflow("Unexpectedly short packet."))
}
else if size > expected {
Err(GDError::PacketOverflow("Unexpectedly long packet."))
}
else {
Ok(())
}
}
pub fn complete_address(address: &str, port: u16) -> GDResult<String> {
@ -25,7 +37,7 @@ pub mod buffer {
pub fn get_u8(buf: &[u8], pos: &mut usize) -> GDResult<u8> {
if buf.len() <= *pos {
return Err(GDError::PacketUnderflow("Unexpectedly short packet.".to_string()));
return Err(GDError::PacketUnderflow("Unexpectedly short packet."));
}
let value = buf[*pos];
@ -35,7 +47,7 @@ pub mod buffer {
pub fn get_u16_le(buf: &[u8], pos: &mut usize) -> GDResult<u16> {
if buf.len() <= *pos + 1 {
return Err(GDError::PacketUnderflow("Unexpectedly short packet.".to_string()));
return Err(GDError::PacketUnderflow("Unexpectedly short packet."));
}
let value = u16::from_le_bytes([buf[*pos], buf[*pos + 1]]);
@ -45,7 +57,7 @@ pub mod buffer {
pub fn get_u16_be(buf: &[u8], pos: &mut usize) -> GDResult<u16> {
if buf.len() <= *pos + 1 {
return Err(GDError::PacketUnderflow("Unexpectedly short packet.".to_string()));
return Err(GDError::PacketUnderflow("Unexpectedly short packet."));
}
let value = u16::from_be_bytes([buf[*pos], buf[*pos + 1]]);
@ -55,7 +67,7 @@ pub mod buffer {
pub fn get_u32_le(buf: &[u8], pos: &mut usize) -> GDResult<u32> {
if buf.len() <= *pos + 3 {
return Err(GDError::PacketUnderflow("Unexpectedly short packet.".to_string()));
return Err(GDError::PacketUnderflow("Unexpectedly short packet."));
}
let value = u32::from_le_bytes([buf[*pos], buf[*pos + 1], buf[*pos + 2], buf[*pos + 3]]);
@ -65,7 +77,7 @@ pub mod buffer {
pub fn get_f32_le(buf: &[u8], pos: &mut usize) -> GDResult<f32> {
if buf.len() <= *pos + 3 {
return Err(GDError::PacketUnderflow("Unexpectedly short packet.".to_string()));
return Err(GDError::PacketUnderflow("Unexpectedly short packet."));
}
let value = f32::from_le_bytes([buf[*pos], buf[*pos + 1], buf[*pos + 2], buf[*pos + 3]]);
@ -75,7 +87,7 @@ pub mod buffer {
pub fn get_u64_le(buf: &[u8], pos: &mut usize) -> GDResult<u64> {
if buf.len() <= *pos + 7 {
return Err(GDError::PacketUnderflow("Unexpectedly short packet.".to_string()));
return Err(GDError::PacketUnderflow("Unexpectedly short packet."));
}
let value = u64::from_le_bytes([buf[*pos], buf[*pos + 1], buf[*pos + 2], buf[*pos + 3], buf[*pos + 4], buf[*pos + 5], buf[*pos + 6], buf[*pos + 7]]);
@ -86,9 +98,9 @@ pub mod buffer {
pub fn get_string_utf8_le(buf: &[u8], pos: &mut usize) -> GDResult<String> {
let sub_buf = &buf[*pos..];
let first_null_position = sub_buf.iter().position(|&x| x == 0)
.ok_or(GDError::PacketBad("Unexpectedly formatted packet.".to_string()))?;
.ok_or(GDError::PacketBad("Unexpectedly formatted packet."))?;
let value = std::str::from_utf8(&sub_buf[..first_null_position])
.map_err(|_| GDError::PacketBad("Badly formatted string.".to_string()))?.to_string();
.map_err(|_| GDError::PacketBad("Badly formatted string."))?.to_string();
*pos += value.len() + 1;
Ok(value)
@ -100,7 +112,7 @@ pub mod buffer {
.into_iter().map(|a| u16::from_be_bytes([a[0], a[1]])).collect();
let value = String::from_utf16(&paired_buf)
.map_err(|_| GDError::PacketBad("Badly formatted string.".to_string()))?.to_string();
.map_err(|_| GDError::PacketBad("Badly formatted string."))?.to_string();
*pos += value.len() + 1;
Ok(value)