Skip to content

Commit 35b05c6

Browse files
committed
tail: fix TOCTOU race in follow retry logic
* Replace exists() check followed by metadata().unwrap() with a single if-let on metadata(). The file could be removed between the two calls, causing a panic with "No such file or directory" (seen intermittently in test_retry9).
1 parent ffada0f commit 35b05c6

1 file changed

Lines changed: 3 additions & 2 deletions

File tree

src/uu/tail/src/follow/watch.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -506,9 +506,10 @@ pub fn follow(mut observer: Observer, settings: &Settings) -> UResult<()> {
506506
// here paths will not be removed from orphans if the path becomes available.
507507
if observer.follow_name_retry() {
508508
for new_path in &observer.orphans {
509-
if new_path.exists() {
509+
// Use metadata() directly instead of exists() + metadata().unwrap()
510+
// to avoid a TOCTOU race where the file is removed between the two calls.
511+
if let Ok(md) = new_path.metadata() {
510512
let pd = observer.files.get(new_path);
511-
let md = new_path.metadata().unwrap();
512513
if md.is_tailable() && pd.reader.is_none() {
513514
show_error!(
514515
"{}",

0 commit comments

Comments
 (0)