From 6cad01fafd89e107ee714eac8923a964f6efc676 Mon Sep 17 00:00:00 2001 From: altugbakan Date: Sun, 9 Apr 2023 13:23:31 +0300 Subject: [PATCH] Fix windowsize parsing --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/config.rs | 2 +- src/packet.rs | 16 ++++++++++++++-- src/worker.rs | 4 +++- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7602d24..017f6f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,4 +4,4 @@ version = 3 [[package]] name = "tftpd" -version = "0.2.0" +version = "0.2.1" diff --git a/Cargo.toml b/Cargo.toml index 71ee218..a60641e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tftpd" -version = "0.2.0" +version = "0.2.1" authors = ["Altuğ Bakan "] edition = "2021" description = "Multithreaded TFTP server daemon" diff --git a/src/config.rs b/src/config.rs index b81b1ae..f18d911 100644 --- a/src/config.rs +++ b/src/config.rs @@ -37,7 +37,7 @@ impl Config { let mut config = Config { ip_address: Ipv4Addr::new(127, 0, 0, 1), port: 69, - directory: env::current_dir().unwrap_or(env::temp_dir()), + directory: env::current_dir().unwrap_or_else(|_| env::temp_dir()), }; args.next(); diff --git a/src/packet.rs b/src/packet.rs index 579ef5f..7004287 100644 --- a/src/packet.rs +++ b/src/packet.rs @@ -213,6 +213,7 @@ impl FromStr for OptionType { "blksize" => Ok(OptionType::BlockSize), "tsize" => Ok(OptionType::TransferSize), "timeout" => Ok(OptionType::Timeout), + "windowsize" => Ok(OptionType::Windowsize), _ => Err("Invalid option type"), } } @@ -304,7 +305,7 @@ fn parse_rq(buf: &[u8], opcode: Opcode) -> Result> { (option, zero_index) = Convert::to_string(buf, zero_index + 1)?; (value, zero_index) = Convert::to_string(buf, zero_index + 1)?; - if let Ok(option) = OptionType::from_str(option.as_str()) { + if let Ok(option) = OptionType::from_str(option.to_lowercase().as_str()) { options.push(TransferOption { option, value: value.parse()?, @@ -428,6 +429,10 @@ mod tests { &[0x00], ("5".as_bytes()), &[0x00], + (OptionType::Windowsize.as_str().as_bytes()), + &[0x00], + ("4".as_bytes()), + &[0x00], ] .concat(); @@ -439,7 +444,7 @@ mod tests { { assert_eq!(filename, "test.png"); assert_eq!(mode, "octet"); - assert_eq!(options.len(), 2); + assert_eq!(options.len(), 3); assert_eq!( options[0], TransferOption { @@ -454,6 +459,13 @@ mod tests { value: 5 } ); + assert_eq!( + options[2], + TransferOption { + option: OptionType::Windowsize, + value: 4 + } + ); } else { panic!("cannot parse read request with options") } diff --git a/src/worker.rs b/src/worker.rs index 2a63293..3a5f12e 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -47,6 +47,7 @@ enum WorkType { const MAX_RETRIES: u32 = 6; const DEFAULT_TIMEOUT_SECS: u64 = 5; +const TIMEOUT_BUFFER_SECS: u64 = 1; const DEFAULT_BLOCK_SIZE: usize = 512; impl Worker { @@ -139,7 +140,8 @@ fn send_file( let filled = window.fill()?; let mut retry_cnt = 0; - let mut time = SystemTime::now() - Duration::from_secs(DEFAULT_TIMEOUT_SECS); + let mut time = + SystemTime::now() - Duration::from_secs(DEFAULT_TIMEOUT_SECS + TIMEOUT_BUFFER_SECS); loop { if time.elapsed()? >= Duration::from_secs(DEFAULT_TIMEOUT_SECS) { send_window(socket, &window, block_number)?;