Skip to content

Commit e21c980

Browse files
authored
Merge pull request #9 from ObsoleteMadness/hotfix-volumeflags
Fix bitmap validation and path type validation.
2 parents 384b6db + 8014127 commit e21c980

9 files changed

Lines changed: 19 additions & 121 deletions

server.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ read_only = true
5151
[AFP.Volumes.TestVolume]
5252
name = "Test Volume" # Volume name. Max 31 characters.
5353
path = 'C:\Mac\Test'
54+
read_only = false
5455
appledouble_mode = "modern" # per-volume override; "modern" (._ sidecars) or "legacy" (.appledouble folder)
5556
rebuild_desktop_db = false
5657

service/afp/directory.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,6 @@ func (s *Service) handleSetDirParms(req *FPSetDirParmsReq) (*FPSetDirParmsRes, i
323323
}
324324

325325
func (s *Service) handleCreateDir(req *FPCreateDirReq) (*FPCreateDirRes, int32) {
326-
if s.fs == nil {
327-
return &FPCreateDirRes{}, ErrAccessDenied
328-
}
329326
if s.volumeIsReadOnly(req.VolumeID) {
330327
return &FPCreateDirRes{}, ErrVolLocked
331328
}

service/afp/file.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@ func (s *Service) handleSetFileParms(req *FPSetFileParmsReq) (*FPSetFileParmsRes
2424
}
2525

2626
func (s *Service) handleCreateFile(req *FPCreateFileReq) (*FPCreateFileRes, int32) {
27-
if s.fs == nil {
28-
return &FPCreateFileRes{}, ErrAccessDenied
29-
}
3027
if s.volumeIsReadOnly(req.VolumeID) {
3128
return &FPCreateFileRes{}, ErrVolLocked
3229
}
@@ -41,6 +38,7 @@ func (s *Service) handleCreateFile(req *FPCreateFileReq) (*FPCreateFileRes, int3
4138
if req.HasFlag(FPCreateFileFlagHardCreate) {
4239
f, err := backend.CreateFile(targetPath)
4340
if err != nil {
41+
netlog.Debug("[AFP] FPCreateFile hard create %q failed: %v", targetPath, err)
4442
return &FPCreateFileRes{}, ErrAccessDenied
4543
}
4644
f.Close()
@@ -50,6 +48,7 @@ func (s *Service) handleCreateFile(req *FPCreateFileReq) (*FPCreateFileRes, int3
5048
if os.IsExist(err) {
5149
return &FPCreateFileRes{}, ErrObjectExists
5250
}
51+
netlog.Debug("[AFP] FPCreateFile %q failed: %v", targetPath, err)
5352
return &FPCreateFileRes{}, ErrAccessDenied
5453
}
5554
f.Close()

service/afp/filedir.go

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,18 @@ import (
1212

1313
func (s *Service) handleGetFileDirParms(req *FPGetFileDirParmsReq) (*FPGetFileDirParmsRes, int32) {
1414
if req.FileBitmap == 0 && req.DirBitmap == 0 {
15-
return &FPGetFileDirParmsRes{}, ErrBitmapErr
15+
return nil, ErrBitmapErr
1616
}
1717
if req.FileBitmap&^enumerateFileBitmapMask != 0 || req.DirBitmap&^enumerateDirBitmapMask != 0 {
18-
return &FPGetFileDirParmsRes{}, ErrBitmapErr
18+
return nil, ErrBitmapErr
1919
}
2020
if req.Path != "" && req.PathType != PathTypeShortNames && req.PathType != PathTypeLongNames {
21-
return &FPGetFileDirParmsRes{}, ErrParamErr
21+
return nil, ErrParamErr
2222
}
2323

2424
parentPath, ok := s.resolveDIDPath(req.VolumeID, req.DirID)
2525
if !ok && req.DirID != 0 {
26-
return emptyGetFileDirParmsRes(req), ErrObjectNotFound
26+
return nil, ErrObjectNotFound
2727
} else if !ok && req.DirID == 0 {
2828
parentPath, _ = s.resolveDIDPath(req.VolumeID, CNIDRoot)
2929
}
@@ -32,10 +32,7 @@ func (s *Service) handleGetFileDirParms(req *FPGetFileDirParmsReq) (*FPGetFileDi
3232
if req.Path != "" {
3333
resolvedPath, errCode := s.resolvePath(parentPath, req.Path, req.PathType)
3434
if errCode != NoErr {
35-
if errCode == ErrObjectNotFound {
36-
return emptyGetFileDirParmsRes(req), ErrObjectNotFound
37-
}
38-
return &FPGetFileDirParmsRes{}, errCode
35+
return nil, errCode
3936
}
4037
targetPath = resolvedPath
4138
}
@@ -48,12 +45,12 @@ func (s *Service) handleGetFileDirParms(req *FPGetFileDirParmsReq) (*FPGetFileDi
4845
} else {
4946
backend := s.fsForPath(targetPath)
5047
if backend == nil {
51-
return emptyGetFileDirParmsRes(req), ErrObjectNotFound
48+
return nil, ErrObjectNotFound
5249
}
5350
info, err = backend.Stat(targetPath)
5451
}
5552
if err != nil {
56-
return emptyGetFileDirParmsRes(req), ErrObjectNotFound
53+
return nil, ErrObjectNotFound
5754
}
5855
targetPath = infoPath
5956

@@ -76,21 +73,6 @@ func (s *Service) handleGetFileDirParms(req *FPGetFileDirParmsReq) (*FPGetFileDi
7673
return res, NoErr
7774
}
7875

79-
func emptyGetFileDirParmsRes(req *FPGetFileDirParmsReq) *FPGetFileDirParmsRes {
80-
// Preserve a valid reply layout (bitmaps + File/DirFlag + pad) even on
81-
// ObjectNotFound so clients can parse the envelope deterministically.
82-
isFile := true
83-
if req.FileBitmap == 0 && req.DirBitmap != 0 {
84-
isFile = false
85-
}
86-
return &FPGetFileDirParmsRes{
87-
FileBitmap: req.FileBitmap,
88-
DirBitmap: req.DirBitmap,
89-
IsFile: isFile,
90-
Data: nil,
91-
}
92-
}
93-
9476
func (s *Service) handleRename(req *FPRenameReq) (*FPRenameRes, int32) {
9577
if s.volumeIsReadOnly(req.VolumeID) {
9678
return &FPRenameRes{}, ErrVolLocked
@@ -195,9 +177,6 @@ func (s *Service) handleSetFileDirParms(req *FPSetFileDirParmsReq) (*FPSetFileDi
195177
}
196178

197179
func (s *Service) handleDelete(req *FPDeleteReq) (*FPDeleteRes, int32) {
198-
if s.fs == nil {
199-
return &FPDeleteRes{}, ErrAccessDenied
200-
}
201180
if s.volumeIsReadOnly(req.VolumeID) {
202181
return &FPDeleteRes{}, ErrVolLocked
203182
}

service/afp/filedir_pack.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -233,11 +233,7 @@ func (s *Service) packFileInfo(buf *bytes.Buffer, volumeID uint16, bitmap uint16
233233
fixedSize := calcFileParamsSize(bitmap)
234234

235235
if bitmap&FileBitmapAttributes != 0 {
236-
attr := uint16(0)
237-
if s.volumeIsReadOnly(volumeID) {
238-
attr |= FileAttrWriteInhibit
239-
}
240-
binutil.WriteU16(buf, attr)
236+
binutil.WriteU16(buf, 0)
241237
}
242238
if bitmap&FileBitmapParentDID != 0 {
243239
pdir := s.getPathDID(volumeID, parentPath)

service/afp/getfiledirparms_error_response_test.go

Lines changed: 0 additions & 74 deletions
This file was deleted.

service/afp/getfiledirparms_validation_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ func TestHandleGetFileDirParms_RejectsZeroBitmaps(t *testing.T) {
1919
if errCode != ErrBitmapErr {
2020
t.Fatalf("errCode=%d, want %d", errCode, ErrBitmapErr)
2121
}
22-
if res == nil {
23-
t.Fatalf("expected non-nil response")
22+
if res != nil {
23+
t.Fatalf("expected nil response on error, got %+v", res)
2424
}
2525
}
2626

@@ -41,8 +41,8 @@ func TestHandleGetFileDirParms_RejectsUnsupportedBitmapBits(t *testing.T) {
4141
if errCode != ErrBitmapErr {
4242
t.Fatalf("errCode=%d, want %d", errCode, ErrBitmapErr)
4343
}
44-
if res == nil {
45-
t.Fatalf("expected non-nil response")
44+
if res != nil {
45+
t.Fatalf("expected nil response on error, got %+v", res)
4646
}
4747
}
4848

@@ -61,7 +61,7 @@ func TestHandleGetFileDirParms_RejectsInvalidPathTypeWhenPathPresent(t *testing.
6161
if errCode != ErrParamErr {
6262
t.Fatalf("errCode=%d, want %d", errCode, ErrParamErr)
6363
}
64-
if res == nil {
65-
t.Fatalf("expected non-nil response")
64+
if res != nil {
65+
t.Fatalf("expected nil response on error, got %+v", res)
6666
}
6767
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0016001f004d000080000b5465737420536572766572084f6d6e6954616c6b030e41465056657273696f6e20312e310e41465056657273696f6e20322e300e41465056657273696f6e20322e31020f4e6f20557365722041757468656e7410436c6561727478742050617373777264
1+
001600230051000080000b54657374205365727665720c436c6173736963537461636b030e41465056657273696f6e20312e310e41465056657273696f6e20322e300e41465056657273696f6e20322e31020f4e6f20557365722041757468656e7410436c6561727478742050617373777264
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
000100031357656c636f6d6520746f204f6d6e6954616c6b
1+
000100031757656c636f6d6520746f20436c6173736963537461636b

0 commit comments

Comments
 (0)