Description
Proposal Details
Context
The Go runtime
and os
package currently implements two levels of long path (more than 260 chars) support on Windows:
- Setting an undocumented PEB bit (source) tricking Windows into enabling process-wide support for long paths without following the official way of doing that (documented here).
- In case the previous hack doesn't work because Windows is older than version 1607, then the
os
package does some path manipulation (source) to prepend the extended-path prefix, which is a documented approach to make Windows APIs support long paths. Note that the current implementation is not complete, as it does not support relative paths.
These are some issues related to long paths on Windows: #41734, #21782, #36375.
I've recently mailed some CLs to improve the path manipulation approach: CL 570995 and CL 574695.
Proposal
We (the Go team at @microsoft) recommend removing this undocumented PEB hack.
The main concern is that long path support might be internally reimplemented and no longer use the PEB bit used by the Go runtime, in which case that bit could be reused for other purposes. If that happens, then the chances of Go corrupting the PEB are high.
This would be a behavior breaking change. Even if we manage to properly support all long path cases in os
, that fix won't apply to interactions with the Windows API outside the os
package, i.e. using syscall
or cgo. Those affected users will have to enable long path support following the official way.
Given that using undocumented Windows APIs might have security implications, I propose not to add a GODEBUG
setting to get the old behavior.
Additionally, using undocumented Windows API goes against Microsoft policies, and the Microsoft Go fork has been flagged for doing this PEB long path support hack. We have taken the action to remove it from our fork regardless of the outcome of this proposal. On the other hand, we are working with the Windows team to define and document APIs which will make long path support easier to achieve.
@golang/windows
Metadata
Metadata
Assignees
Type
Projects
Status
Status