mirror of
https://github.com/denoland/deno.git
synced 2024-11-28 16:20:57 -05:00
fix(fs): copyFile NUL path on macOS (#22216)
Fixes https://github.com/denoland/deno/issues/22211
This commit is contained in:
parent
e58b1900a7
commit
4f914dd161
2 changed files with 19 additions and 5 deletions
|
@ -236,3 +236,14 @@ Deno.test(
|
||||||
copyFileSyncMode("Hello world!".repeat(128 * 1024));
|
copyFileSyncMode("Hello world!".repeat(128 * 1024));
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Deno.test(
|
||||||
|
{ permissions: { read: true, write: true } },
|
||||||
|
async function copyFileNulPath() {
|
||||||
|
const fromFilename = "from.txt\0";
|
||||||
|
const toFilename = "to.txt\0";
|
||||||
|
await assertRejects(async () => {
|
||||||
|
await Deno.copyFile(fromFilename, toFilename);
|
||||||
|
}, TypeError);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
|
@ -413,10 +413,11 @@ fn copy_file(from: &Path, to: &Path) -> FsResult<()> {
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
use std::os::unix::fs::OpenOptionsExt;
|
use std::os::unix::fs::OpenOptionsExt;
|
||||||
use std::os::unix::fs::PermissionsExt;
|
use std::os::unix::fs::PermissionsExt;
|
||||||
use std::os::unix::prelude::OsStrExt;
|
|
||||||
|
|
||||||
let from_str = CString::new(from.as_os_str().as_bytes()).unwrap();
|
let from_str = CString::new(from.as_os_str().as_encoded_bytes())
|
||||||
let to_str = CString::new(to.as_os_str().as_bytes()).unwrap();
|
.map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?;
|
||||||
|
let to_str = CString::new(to.as_os_str().as_encoded_bytes())
|
||||||
|
.map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?;
|
||||||
|
|
||||||
// SAFETY: `from` and `to` are valid C strings.
|
// SAFETY: `from` and `to` are valid C strings.
|
||||||
// std::fs::copy does open() + fcopyfile() on macOS. We try to use
|
// std::fs::copy does open() + fcopyfile() on macOS. We try to use
|
||||||
|
@ -555,8 +556,10 @@ fn cp(from: &Path, to: &Path) -> FsResult<()> {
|
||||||
use std::ffi::CString;
|
use std::ffi::CString;
|
||||||
use std::os::unix::ffi::OsStrExt;
|
use std::os::unix::ffi::OsStrExt;
|
||||||
|
|
||||||
let from_str = CString::new(from.as_os_str().as_bytes()).unwrap();
|
let from_str = CString::new(from.as_os_str().as_bytes())
|
||||||
let to_str = CString::new(to.as_os_str().as_bytes()).unwrap();
|
.map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?;
|
||||||
|
let to_str = CString::new(to.as_os_str().as_bytes())
|
||||||
|
.map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?;
|
||||||
|
|
||||||
// SAFETY: `from` and `to` are valid C strings.
|
// SAFETY: `from` and `to` are valid C strings.
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
Loading…
Reference in a new issue