summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2024-03-13 20:57:34 +0000
committerGitHub <noreply@github.com>2024-03-13 20:57:34 +0000
commitda58722851fcdf965084a0736d83aac678d67032 (patch)
treeecf2a5a7ee59d5a4de0a2bc7b68c41c9c5efc820
parent43d066cb7069c8c55aa555d7959a8612a52facc7 (diff)
fix(node): add nul byte to statfs path on windows (#22905)
-rw-r--r--ext/node/ops/fs.rs29
1 files changed, 18 insertions, 11 deletions
diff --git a/ext/node/ops/fs.rs b/ext/node/ops/fs.rs
index 28d95eabe..cfc760656 100644
--- a/ext/node/ops/fs.rs
+++ b/ext/node/ops/fs.rs
@@ -180,21 +180,28 @@ where
.ancestors()
.last()
.ok_or(anyhow!("Path has no root."))?;
- let root = OsStr::new(root).encode_wide().collect::<Vec<_>>();
+ let mut root = OsStr::new(root).encode_wide().collect::<Vec<_>>();
+ root.push(0);
let mut sectors_per_cluster = 0;
let mut bytes_per_sector = 0;
let mut available_clusters = 0;
let mut total_clusters = 0;
- // SAFETY: Normal GetDiskFreeSpaceW usage.
- let code = unsafe {
- GetDiskFreeSpaceW(
- root.as_ptr(),
- &mut sectors_per_cluster,
- &mut bytes_per_sector,
- &mut available_clusters,
- &mut total_clusters,
- )
- };
+ let mut code = 0;
+ let mut retries = 0;
+ // We retry here because libuv does: https://github.com/libuv/libuv/blob/fa6745b4f26470dae5ee4fcbb1ee082f780277e0/src/win/fs.c#L2705
+ while code == 0 && retries < 2 {
+ // SAFETY: Normal GetDiskFreeSpaceW usage.
+ code = unsafe {
+ GetDiskFreeSpaceW(
+ root.as_ptr(),
+ &mut sectors_per_cluster,
+ &mut bytes_per_sector,
+ &mut available_clusters,
+ &mut total_clusters,
+ )
+ };
+ retries += 1;
+ }
if code == 0 {
return Err(std::io::Error::last_os_error().into());
}