Skip to content

Commit 43689f7

Browse files
Merge commit from fork
1 parent 17c14f6 commit 43689f7

2 files changed

Lines changed: 27 additions & 6 deletions

File tree

server/filesystem/quota_file.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,15 @@ func (f *quotaFile) Write(p []byte) (int, error) {
2424
return f.File.Write(p)
2525
}
2626

27+
f.mu.Lock()
28+
defer f.mu.Unlock()
29+
2730
off, err := f.File.Seek(0, io.SeekCurrent)
2831
if err != nil {
2932
return 0, err
3033
}
3134

32-
return f.writeAt(p, off, func() (int, error) {
35+
return f.writeAtLocked(p, off, func() (int, error) {
3336
return f.File.Write(p)
3437
})
3538
}
@@ -39,15 +42,15 @@ func (f *quotaFile) WriteAt(p []byte, off int64) (int, error) {
3942
return f.File.WriteAt(p, off)
4043
}
4144

42-
return f.writeAt(p, off, func() (int, error) {
45+
f.mu.Lock()
46+
defer f.mu.Unlock()
47+
48+
return f.writeAtLocked(p, off, func() (int, error) {
4349
return f.File.WriteAt(p, off)
4450
})
4551
}
4652

47-
func (f *quotaFile) writeAt(p []byte, off int64, write func() (int, error)) (int, error) {
48-
f.mu.Lock()
49-
defer f.mu.Unlock()
50-
53+
func (f *quotaFile) writeAtLocked(p []byte, off int64, write func() (int, error)) (int, error) {
5154
previousSize := f.size
5255
if growth := off + int64(len(p)) - previousSize; growth > 0 {
5356
if err := f.fs.reserveDisk(growth); err != nil {

sftp/utils.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package sftp
33
import (
44
"io"
55
"os"
6+
"reflect"
67
)
78

89
const (
@@ -30,6 +31,23 @@ func (l ListerAt) ListAt(f []os.FileInfo, offset int64) (int, error) {
3031

3132
type fxErr uint32
3233

34+
func (e fxErr) As(target interface{}) bool {
35+
// pkg/sftp checks errors against its private fxerr type before writing status packets.
36+
v := reflect.ValueOf(target)
37+
if v.Kind() != reflect.Ptr || v.IsNil() {
38+
return false
39+
}
40+
41+
elem := v.Elem()
42+
t := elem.Type()
43+
if elem.Kind() != reflect.Uint32 || t.PkgPath() != "github.com/pkg/sftp" || t.Name() != "fxerr" {
44+
return false
45+
}
46+
47+
elem.SetUint(uint64(e))
48+
return true
49+
}
50+
3351
func (e fxErr) Error() string {
3452
switch e {
3553
case ErrSSHQuotaExceeded:

0 commit comments

Comments
 (0)