From 085a02835d1c3eab09f2804f7d7e29611c010a01 Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Fri, 9 Oct 2026 13:06:59 -0300 Subject: [PATCH] fix(fs): return an error when Android returns no file descriptor (#3636) In plugins/fs/src/android.rs resolve_content_uri, a null `fd` from getFileDescriptor (openAssetFileDescriptor returning null, e.g. for virtual files) hit unimplemented!() and panicked inside the command handler. It now returns an Unsupported I/O error. Also switches the two io::Error::new(Other, ..) calls to io::Error::other, which clippy flags on the Android target. Checked with cargo clippy --target aarch64-linux-android. --- .changes/fix-fs-android-null-fd.md | 6 ++++++ plugins/fs/src/android.rs | 9 +++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 .changes/fix-fs-android-null-fd.md diff --git a/.changes/fix-fs-android-null-fd.md b/.changes/fix-fs-android-null-fd.md new file mode 100644 index 000000000..fe66b48b8 --- /dev/null +++ b/.changes/fix-fs-android-null-fd.md @@ -0,0 +1,6 @@ +--- +fs: patch +fs-js: patch +--- + +Fixed a panic on Android when a content provider returns no file descriptor for a `content://` URI (e.g. virtual files). The fs command now fails with an error instead. diff --git a/plugins/fs/src/android.rs b/plugins/fs/src/android.rs index b9a829b95..66fb5154f 100644 --- a/plugins/fs/src/android.rs +++ b/plugins/fs/src/android.rs @@ -63,10 +63,11 @@ impl Fs { uri: impl Into, mode: impl Into, ) -> crate::Result { + let uri = uri.into(); let result = self.0.run_mobile_plugin::( "getFileDescriptor", GetFileDescriptorPayload { - uri: uri.into(), + uri: uri.clone(), mode: mode.into(), }, )?; @@ -76,7 +77,11 @@ impl Fs { std::fs::File::from_raw_fd(fd) }) } else { - unimplemented!() + // the content provider did not return a file descriptor, e.g. for virtual files + Err(crate::Error::Io(std::io::Error::new( + std::io::ErrorKind::Unsupported, + format!("no file descriptor available for {uri}"), + ))) } } }