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}"), + ))) } } }