diff options
| author | 2026-03-04 08:26:56 +0800 | |
|---|---|---|
| committer | 2026-03-04 08:59:53 +0800 | |
| commit | ab7501be34032fb9e5c48726a68ae90a917af9eb (patch) | |
| tree | 20d005647569befea8133e953c3270e8fd2a2a5b /objectstore/packed/pack.go | |
| parent | *: gofumpt (diff) | |
| signature | No signature | |
*: Lint
Diffstat (limited to 'objectstore/packed/pack.go')
| -rw-r--r-- | objectstore/packed/pack.go | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/objectstore/packed/pack.go b/objectstore/packed/pack.go index 9af4c860..874b2b76 100644 --- a/objectstore/packed/pack.go +++ b/objectstore/packed/pack.go @@ -25,43 +25,58 @@ func openPackFile(name string, file *os.File, size int64) (*packFile, error) { if size < 12 { return nil, fmt.Errorf("objectstore/packed: pack %q too short", name) } + if size > int64(int(^uint(0)>>1)) { return nil, fmt.Errorf("objectstore/packed: pack %q has unsupported size", name) } + fd, err := intconv.UintptrToInt(file.Fd()) if err != nil { return nil, err } + data, err := syscall.Mmap(fd, 0, int(size), syscall.PROT_READ, syscall.MAP_PRIVATE) if err != nil { return nil, err } + if binary.BigEndian.Uint32(data[:4]) != packfmt.Signature { _ = syscall.Munmap(data) + return nil, fmt.Errorf("objectstore/packed: pack %q invalid signature", name) } + version := binary.BigEndian.Uint32(data[4:8]) if !packfmt.VersionSupported(version) { _ = syscall.Munmap(data) + return nil, fmt.Errorf("objectstore/packed: pack %q unsupported version %d", name, version) } + return &packFile{name: name, file: file, data: data}, nil } // close unmaps and closes one pack handle. func (pack *packFile) close() error { var closeErr error + if pack.data != nil { - if err := syscall.Munmap(pack.data); err != nil && closeErr == nil { + err := syscall.Munmap(pack.data) + if err != nil && closeErr == nil { closeErr = err } + pack.data = nil } + if pack.file != nil { - if err := pack.file.Close(); err != nil && closeErr == nil { + err := pack.file.Close() + if err != nil && closeErr == nil { closeErr = err } + pack.file = nil } + return closeErr } |
