fs: 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:
Michael Eischer 2024-10-31 19:10:01 +01:00
parent 03aad742d3
commit 1d0d5d87bc

View file

@ -325,8 +325,11 @@ func nodeFillGenericAttributes(node *restic.Node, path string, stat *ExtendedFil
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,
@ -335,7 +338,7 @@ func nodeFillGenericAttributes(node *restic.Node, path string, stat *ExtendedFil
if err != nil { if err != nil {
return false, err return false, err
} }
return allowExtended, nil return allowExtended, err
} }
var sd *[]byte var sd *[]byte
@ -420,6 +423,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