forked from TrueCloudLab/restic
Handle extended length paths
This commit is contained in:
parent
85639f5159
commit
71632a8197
1 changed files with 16 additions and 7 deletions
|
@ -38,6 +38,12 @@ var (
|
||||||
eaSupportedVolumesMap = sync.Map{}
|
eaSupportedVolumesMap = sync.Map{}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
extendedPathPrefix = `\\?\`
|
||||||
|
uncPathPrefix = `\\?\UNC\`
|
||||||
|
globalRootPrefix = `\\?\GLOBALROOT\`
|
||||||
|
)
|
||||||
|
|
||||||
// mknod is not supported on Windows.
|
// mknod is not supported on Windows.
|
||||||
func mknod(_ string, _ uint32, _ uint64) (err error) {
|
func mknod(_ string, _ uint32, _ uint64) (err error) {
|
||||||
return errors.New("device nodes cannot be created on windows")
|
return errors.New("device nodes cannot be created on windows")
|
||||||
|
@ -371,7 +377,7 @@ func (node *Node) fillGenericAttributes(path string, fi os.FileInfo, stat *statT
|
||||||
// Security descriptors are not supported for root volume paths.
|
// Security descriptors are not supported for root volume paths.
|
||||||
// Though file attributes and created time are supported for root volume paths,
|
// Though file attributes and created time are supported for root volume paths,
|
||||||
// we ignore them and we do not want to replace them during every restore.
|
// we ignore them and we do not want to replace them during every restore.
|
||||||
allowExtended, err = checkAndStoreEASupport(filepath.VolumeName(path))
|
allowExtended, err = checkAndStoreEASupport(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
@ -381,7 +387,7 @@ func (node *Node) fillGenericAttributes(path string, fi os.FileInfo, stat *statT
|
||||||
var sd *[]byte
|
var sd *[]byte
|
||||||
if node.Type == "file" || node.Type == "dir" {
|
if node.Type == "file" || node.Type == "dir" {
|
||||||
// Check EA support and get security descriptor for file/dir only
|
// Check EA support and get security descriptor for file/dir only
|
||||||
allowExtended, err = checkAndStoreEASupport(filepath.VolumeName(path))
|
allowExtended, err = checkAndStoreEASupport(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
@ -401,11 +407,14 @@ func (node *Node) fillGenericAttributes(path string, fi os.FileInfo, stat *statT
|
||||||
// checkAndStoreEASupport checks if the volume of the path supports extended attributes and stores the result in a map
|
// checkAndStoreEASupport checks if the volume of the path supports extended attributes and stores the result in a map
|
||||||
// If the result is already in the map, it returns the result from the map.
|
// If the result is already in the map, it returns the result from the map.
|
||||||
func checkAndStoreEASupport(path string) (isEASupportedVolume bool, err error) {
|
func checkAndStoreEASupport(path string) (isEASupportedVolume bool, err error) {
|
||||||
// Check if it's a UNC path and format it correctly
|
// Check if it's an extended length path
|
||||||
if strings.HasPrefix(path, `\\?\UNC\`) {
|
if strings.HasPrefix(path, uncPathPrefix) {
|
||||||
// Convert \\?\UNC\ path to standard path to get the volume name correctly
|
// Convert \\?\UNC\ extended path to standard path to get the volume name correctly
|
||||||
path = `\\` + strings.TrimPrefix(path, `\\?\UNC\`)
|
path = `\\` + path[len(uncPathPrefix):]
|
||||||
} else if strings.HasPrefix(path, `\\?\GLOBALROOT`) {
|
} else if strings.HasPrefix(path, extendedPathPrefix) {
|
||||||
|
//Extended length path prefix needs to be trimmed to get the volume name correctly
|
||||||
|
path = path[len(extendedPathPrefix):]
|
||||||
|
} else if strings.HasPrefix(path, globalRootPrefix) {
|
||||||
// EAs are not supported for \\?\GLOBALROOT i.e. VSS snapshots
|
// EAs are not supported for \\?\GLOBALROOT i.e. VSS snapshots
|
||||||
return false, nil
|
return false, nil
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue