diff --git a/src/scheme/debug.rs b/src/scheme/debug.rs index 23eb049..f97452b 100644 --- a/src/scheme/debug.rs +++ b/src/scheme/debug.rs @@ -47,7 +47,11 @@ impl Scheme for DebugScheme { Ok(id) } - fn dup(&self, id: usize, _buf: &[u8]) -> Result { + fn dup(&self, id: usize, buf: &[u8]) -> Result { + if ! buf.is_empty() { + return Err(Error::new(ENOENT)); + } + let flags = { let handles = self.handles.read(); *handles.get(&id).ok_or(Error::new(EBADF))? diff --git a/src/scheme/env.rs b/src/scheme/env.rs index 112d896..cbe5b7e 100644 --- a/src/scheme/env.rs +++ b/src/scheme/env.rs @@ -90,7 +90,11 @@ impl Scheme for EnvScheme { } } - fn dup(&self, id: usize, _buf: &[u8]) -> Result { + fn dup(&self, id: usize, buf: &[u8]) -> Result { + if ! buf.is_empty() { + return Err(Error::new(ENOENT)); + } + let new_handle = { let handles = self.handles.read(); let handle = handles.get(&id).ok_or(Error::new(EBADF))?; diff --git a/src/scheme/event.rs b/src/scheme/event.rs index f68c2a3..24afc1e 100644 --- a/src/scheme/event.rs +++ b/src/scheme/event.rs @@ -39,7 +39,11 @@ impl Scheme for EventScheme { Ok(id) } - fn dup(&self, id: usize, _buf: &[u8]) -> Result { + fn dup(&self, id: usize, buf: &[u8]) -> Result { + if ! buf.is_empty() { + return Err(Error::new(ENOENT)); + } + let handle = { let handles = self.handles.read(); let handle_weak = handles.get(&id).ok_or(Error::new(EBADF))?; diff --git a/src/scheme/initfs.rs b/src/scheme/initfs.rs index 7c099aa..7f9b7dd 100644 --- a/src/scheme/initfs.rs +++ b/src/scheme/initfs.rs @@ -65,7 +65,11 @@ impl Scheme for InitFsScheme { Err(Error::new(ENOENT)) } - fn dup(&self, id: usize, _buf: &[u8]) -> Result { + fn dup(&self, id: usize, buf: &[u8]) -> Result { + if ! buf.is_empty() { + return Err(Error::new(ENOENT)); + } + let (path, flags, data, mode, seek) = { let handles = self.handles.read(); let handle = handles.get(&id).ok_or(Error::new(EBADF))?; diff --git a/src/scheme/irq.rs b/src/scheme/irq.rs index a5c0333..854cc99 100644 --- a/src/scheme/irq.rs +++ b/src/scheme/irq.rs @@ -48,7 +48,11 @@ impl Scheme for IrqScheme { } } - fn dup(&self, file: usize, _buf: &[u8]) -> Result { + fn dup(&self, file: usize, buf: &[u8]) -> Result { + if ! buf.is_empty() { + return Err(Error::new(ENOENT)); + } + Ok(file) } diff --git a/src/scheme/live.rs b/src/scheme/live.rs index e434f8e..bc6b845 100644 --- a/src/scheme/live.rs +++ b/src/scheme/live.rs @@ -49,7 +49,11 @@ impl Scheme for DiskScheme { Ok(id) } - fn dup(&self, id: usize, _buf: &[u8]) -> Result { + fn dup(&self, id: usize, buf: &[u8]) -> Result { + if ! buf.is_empty() { + return Err(Error::new(ENOENT)); + } + let (path, data, mode, seek) = { let handles = self.handles.read(); let handle = handles.get(&id).ok_or(Error::new(EBADF))?; diff --git a/src/scheme/null.rs b/src/scheme/null.rs index 81b6454..c8df593 100644 --- a/src/scheme/null.rs +++ b/src/scheme/null.rs @@ -8,7 +8,11 @@ impl Scheme for NullScheme { Ok(0) } - fn dup(&self, _file: usize, _buf: &[u8]) -> Result { + fn dup(&self, _file: usize, buf: &[u8]) -> Result { + if ! buf.is_empty() { + return Err(Error::new(ENOENT)); + } + Ok(0) } diff --git a/src/scheme/pipe.rs b/src/scheme/pipe.rs index 342fb1f..0989e84 100644 --- a/src/scheme/pipe.rs +++ b/src/scheme/pipe.rs @@ -51,7 +51,11 @@ impl PipeScheme { } impl Scheme for PipeScheme { - fn dup(&self, id: usize, _buf: &[u8]) -> Result { + fn dup(&self, id: usize, buf: &[u8]) -> Result { + if ! buf.is_empty() { + return Err(Error::new(ENOENT)); + } + let mut pipes = pipes_mut(); let read_option = if let Some(pipe) = pipes.0.get(&id) { diff --git a/src/scheme/root.rs b/src/scheme/root.rs index 42bcaad..6261ff7 100644 --- a/src/scheme/root.rs +++ b/src/scheme/root.rs @@ -71,7 +71,11 @@ impl Scheme for RootScheme { } } - fn dup(&self, file: usize, _buf: &[u8]) -> Result { + fn dup(&self, file: usize, buf: &[u8]) -> Result { + if ! buf.is_empty() { + return Err(Error::new(ENOENT)); + } + let mut handles = self.handles.write(); let inner = { let inner = handles.get(&file).ok_or(Error::new(EBADF))?; diff --git a/src/scheme/sys/mod.rs b/src/scheme/sys/mod.rs index a058dbf..63ddfd2 100644 --- a/src/scheme/sys/mod.rs +++ b/src/scheme/sys/mod.rs @@ -100,7 +100,11 @@ impl Scheme for SysScheme { Err(Error::new(ENOENT)) } - fn dup(&self, id: usize, _buf: &[u8]) -> Result { + fn dup(&self, id: usize, buf: &[u8]) -> Result { + if ! buf.is_empty() { + return Err(Error::new(ENOENT)); + } + let (path, data, mode, seek) = { let handles = self.handles.read(); let handle = handles.get(&id).ok_or(Error::new(EBADF))?; diff --git a/src/scheme/time.rs b/src/scheme/time.rs index faef360..b41bad6 100644 --- a/src/scheme/time.rs +++ b/src/scheme/time.rs @@ -45,7 +45,11 @@ impl Scheme for TimeScheme { Ok(id) } - fn dup(&self, id: usize, _buf: &[u8]) -> Result { + fn dup(&self, id: usize, buf: &[u8]) -> Result { + if ! buf.is_empty() { + return Err(Error::new(ENOENT)); + } + let clock = { let handles = self.handles.read(); *handles.get(&id).ok_or(Error::new(EBADF))? diff --git a/src/scheme/zero.rs b/src/scheme/zero.rs index 194f2ec..e2a202b 100644 --- a/src/scheme/zero.rs +++ b/src/scheme/zero.rs @@ -8,7 +8,11 @@ impl Scheme for ZeroScheme { Ok(0) } - fn dup(&self, _file: usize, _buf: &[u8]) -> Result { + fn dup(&self, _file: usize, buf: &[u8]) -> Result { + if ! buf.is_empty() { + return Err(Error::new(ENOENT)); + } + Ok(0) }