bytecodealliance / bytecodealliance/cap-std

get entries of a windows unc path failed when call `cap_std::fs::Dir::from_std_file(dir).entries()`

Offen
#318 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Rust
Sterne
821
Forks
57
Ø Merge
1 Std. 16 Min.
Gemergte PRs (30 T.)
4

Beschreibung

## test code
```rust
let path = std::path::Path::new("C:\\Users\\path\\to\\folder"); //works fine
let path = std::path::Path::new("\\\\?\\UNC\\Mac\\path\\to\\folder"); //throw an error
let dir = std::fs::OpenOptions::new()
.read(true)
.custom_flags(33554432u32)
.open(path).unwrap();
let entries = cap_std::fs::Dir::from_std_file(dir).entries();
dbg!(entries);
```

## reason
After debugged, I found cap_primitives/src/windows/fs [get_path](https://github.com/bytecodealliance/cap-std/blob/79ae7ce65e2f45f7a1156737995b293ed99ced15/cap-primitives/src/windows/fs/get_path.rs#L19) cause this problem.
```rust
let wide_final = if wide.starts_with(&['\\' as u16, '\\' as _, '?' as _, '\\' as _]) {
&wide[4..] //throw error
//&wide //change to this and it works
} else {
&wide
};
```
when path start with `\\\\?\\`, `\\\\?\\` will be remove, and `\\\\?\\UNC\\Mac\\path\\to\\folder` changed to `UNC\\Mac\\path\\to\\folder`, so a `path not found` error be throwed.

## dependency chain
the dependency chain is:
- `cap_std::fs::dir::Dir::entries`
- `cap_primitives::fs::read_dir::read_base_dir`
- `cap_primitives::windows::fs::read_dir_inner::ReadDirInner::read_base_dir`
- `cap_primitives::windows::fs::read_dir_inner::ReadDirInner::new_unchecked`
- `cap_primitives::windows::fs::get_path::concatenate`
- `cap_primitives::windows::fs::get_path::get_path`

## cargo.toml
```toml
cap-std = "1.0.14"
```

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne in cap-primitives/src/windows/fs/get_path.rs bei get_path und verfolge die read_dir-Kette bis durch concatenate. Reproduziere den gemeldeten UNC-Pfad-Fall unter Windows und füge anschließend eine Regressionstestabdeckung für Dir::from_std_file(dir).entries() hinzu. Als erledigt gilt die Aufgabe, wenn UNC-Pfade, die mit \\?\UNC\ beginnen, korrekt aufgelöst werden, ohne gewöhnliche Windows-Pfade zu beeinträchtigen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
rust
Bereich
operating-systems
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
48/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.