From e7a5944aaee4f296fda47d1620e9aaade97f6111 Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Tue, 26 Feb 2019 20:15:37 +0100 Subject: Change directory after dropping privileges, to detect permission problems early --- src/tftpd.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/tftpd.rs b/src/tftpd.rs index 2df7a5c..c54d9d7 100644 --- a/src/tftpd.rs +++ b/src/tftpd.rs @@ -24,6 +24,7 @@ struct Configuration { gid: u32, ro: bool, wo: bool, + dir: PathBuf, } fn wait_for_ack(sock: &UdpSocket, expected_block: u16) -> Result { @@ -223,7 +224,6 @@ fn file_allowed(filename: &Path) -> Option { } fn handle_wrq(socket: &UdpSocket, cl: &SocketAddr, buf: &[u8]) -> Result<(), io::Error> { - let (filename, mode) = parse_file_mode(buf)?; match mode.as_ref() { @@ -374,6 +374,7 @@ fn parse_commandline<'a>(args: &'a Vec) -> Result(args: &'a Vec) -> Result d, + conf.dir = match matches.opt_str("d") { + Some(d) => Path::new(&d).to_path_buf(), None => { usage(opts, None); return Err("directory"); } }; - match env::set_current_dir(Path::new(&basedir)) { - Ok(_) => (), - Err(err) => { - usage(opts, Some(err.to_string())); - return Err("changing directory"); - } - } } return Ok(conf); @@ -465,6 +459,14 @@ fn main() { } }; + match env::set_current_dir(&conf.dir) { + Ok(_) => (), + Err(err) => { + println!("Changing directory to {} failed ({}).", &conf.dir.display(), err); + return; + } + } + loop { let mut buf = [0; 2048]; let (n, src) = match socket.recv_from(&mut buf) { -- cgit v1.2.3