diff --git a/internal/fs/file_windows.go b/internal/fs/file_windows.go index cadd69284..b05068c42 100644 --- a/internal/fs/file_windows.go +++ b/internal/fs/file_windows.go @@ -105,17 +105,20 @@ func ClearAttribute(path string, attribute uint32) error { } // OpenHandleForEA return a file handle for file or dir for setting/getting EAs -func OpenHandleForEA(nodeType, path string) (handle windows.Handle, err error) { +func OpenHandleForEA(nodeType, path string, writeAccess bool) (handle windows.Handle, err error) { path = fixpath(path) + fileAccess := windows.FILE_READ_EA + if writeAccess { + fileAccess = fileAccess | windows.FILE_WRITE_EA + } + switch nodeType { case "file": utf16Path := windows.StringToUTF16Ptr(path) - fileAccessRightReadWriteEA := (0x8 | 0x10) - handle, err = windows.CreateFile(utf16Path, uint32(fileAccessRightReadWriteEA), 0, nil, windows.OPEN_EXISTING, windows.FILE_ATTRIBUTE_NORMAL, 0) + handle, err = windows.CreateFile(utf16Path, uint32(fileAccess), 0, nil, windows.OPEN_EXISTING, windows.FILE_ATTRIBUTE_NORMAL, 0) case "dir": utf16Path := windows.StringToUTF16Ptr(path) - fileAccessRightReadWriteEA := (0x8 | 0x10) - handle, err = windows.CreateFile(utf16Path, uint32(fileAccessRightReadWriteEA), 0, nil, windows.OPEN_EXISTING, windows.FILE_ATTRIBUTE_NORMAL|windows.FILE_FLAG_BACKUP_SEMANTICS, 0) + handle, err = windows.CreateFile(utf16Path, uint32(fileAccess), 0, nil, windows.OPEN_EXISTING, windows.FILE_ATTRIBUTE_NORMAL|windows.FILE_FLAG_BACKUP_SEMANTICS, 0) default: return 0, nil } diff --git a/internal/restic/node_windows.go b/internal/restic/node_windows.go index 0825992b1..8942db901 100644 --- a/internal/restic/node_windows.go +++ b/internal/restic/node_windows.go @@ -88,7 +88,7 @@ func (node Node) restoreExtendedAttributes(path string) (err error) { // fill extended attributes in the node. This also includes the Generic attributes for windows. func (node *Node) fillExtendedAttributes(path string, _ bool) (err error) { var fileHandle windows.Handle - if fileHandle, err = fs.OpenHandleForEA(node.Type, path); fileHandle == 0 { + if fileHandle, err = fs.OpenHandleForEA(node.Type, path, false); fileHandle == 0 { return nil } if err != nil { @@ -130,7 +130,7 @@ func closeFileHandle(fileHandle windows.Handle, path string) { // The Windows API requires setting of all the Extended Attributes in one call. func restoreExtendedAttributes(nodeType, path string, eas []fs.ExtendedAttribute) (err error) { var fileHandle windows.Handle - if fileHandle, err = fs.OpenHandleForEA(nodeType, path); fileHandle == 0 { + if fileHandle, err = fs.OpenHandleForEA(nodeType, path, true); fileHandle == 0 { return nil } if err != nil {