aboutsummaryrefslogtreecommitdiff
path: root/objectstore/packed/pack.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-04 08:26:56 +0800
committerGravatar Runxi Yu2026-03-04 08:59:53 +0800
commitab7501be34032fb9e5c48726a68ae90a917af9eb (patch)
tree20d005647569befea8133e953c3270e8fd2a2a5b /objectstore/packed/pack.go
parent*: gofumpt (diff)
signatureNo signature
*: Lint
Diffstat (limited to 'objectstore/packed/pack.go')
-rw-r--r--objectstore/packed/pack.go19
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
}