github-actions[bot] opened a new issue, #3518:
URL: https://github.com/apache/iceberg-rust/issues/3518

   
   > `AsyncFd::new` and related constructors violate I/O safety
   
   | Details             |                                                |
   | ------------------- | ---------------------------------------------- |
   | Status              | unsound                |
   | Package             | `tokio`                      |
   | Version             | `1.53.1`                   |
   | URL                 | 
[https://github.com/tokio-rs/tokio/pull/8587](https://github.com/tokio-rs/tokio/pull/8587)
 |
   | Date                | 2026-10-13                         |
   
   `tokio::io::unix::AsyncFd` provides safe constructors (`new`, 
`with_interest`, `try_new`, and `try_with_interest`) that accept any `T: 
AsRawFd` rather than requiring proof of ownership or validity of the file 
descriptor. Because `RawFd` implements `AsRawFd`, safe code can construct an 
`AsyncFd` from an arbitrary or closed file descriptor, or close/replace the 
underlying file descriptor while the `AsyncFd` is still alive.
   
   This violates I/O safety in two ways:
   
   1. `AsyncFd<T>` implements `AsFd` for all `T: AsRawFd` by calling 
`BorrowedFd::borrow_raw(self.as_raw_fd())`, allowing safe code to obtain an 
arbitrary `BorrowedFd<'_>` without owning the file descriptor.
   2. Tokio's I/O driver stores a pointer to an internal allocation in the 
`epoll`/`kqueue` user data for registered file descriptors. If the underlying 
file descriptor is duplicated and then closed while an `AsyncFd` is alive, and 
the OS reuses that file descriptor number for a another IO resource on the same 
runtime, dropping the first `AsyncFd` deregisters the reused file descriptor 
number and frees the first while the original file description remains 
registered in `epoll`, leading to a use-after-free when a readiness event fires.
   
   Starting in Tokio 1.51.6, 1.53.3, and 1.54.0, `AsyncFd::new`, 
`AsyncFd::with_interest`, `AsyncFd::try_new`, and `AsyncFd::try_with_interest` 
are deprecated in favor of the `unsafe` constructors `AsyncFd::register` and 
`AsyncFd::register_with_interest`. Callers must ensure that the file descriptor 
remains valid, open, and unchanged for the lifetime of the `AsyncFd`.
   
   See [advisory page](https://rustsec.org/advisories/RUSTSEC-2026-0386.html) 
for additional details.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to