forked from TrueCloudLab/restic
restic: fix error in fillGenericAttributes for vss volumes
Extended attributes and security descriptors apparently cannot be retrieved from a vss volume. Fix the volume check to correctly detect vss volumes and just completely disable extended attributes for volumes.
This commit is contained in:
parent
f77e67086c
commit
e38f6794cd
1 changed files with 17 additions and 2 deletions
|
@ -372,8 +372,11 @@ func (node *Node) fillGenericAttributes(path string, fi os.FileInfo, stat *statT
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasSuffix(filepath.Clean(path), `\`) {
|
isVolume, err := isVolumePath(path)
|
||||||
// filepath.Clean(path) ends with '\' for Windows root volume paths only
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if isVolume {
|
||||||
// Do not process file attributes, created time and sd for windows root volume paths
|
// Do not process file attributes, created time and sd for windows root volume paths
|
||||||
// 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,
|
||||||
|
@ -464,6 +467,18 @@ func checkAndStoreEASupport(path string) (isEASupportedVolume bool, err error) {
|
||||||
return isEASupportedVolume, err
|
return isEASupportedVolume, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isVolumePath returns whether a path refers to a volume
|
||||||
|
func isVolumePath(path string) (bool, error) {
|
||||||
|
volName, err := prepareVolumeName(path)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanPath := filepath.Clean(path)
|
||||||
|
cleanVolume := filepath.Clean(volName + `\`)
|
||||||
|
return cleanPath == cleanVolume, nil
|
||||||
|
}
|
||||||
|
|
||||||
// prepareVolumeName prepares the volume name for different cases in Windows
|
// prepareVolumeName prepares the volume name for different cases in Windows
|
||||||
func prepareVolumeName(path string) (volumeName string, err error) {
|
func prepareVolumeName(path string) (volumeName string, err error) {
|
||||||
// Check if it's an extended length path
|
// Check if it's an extended length path
|
||||||
|
|
Loading…
Reference in a new issue