fix(sysinfo): переносимое приведение размера блока statfs
`statfs.Bsize` в Linux — int64, в Darwin — uint32: сборка образа для linux/amd64 падала на приведении к uint32. Приведение к int64 безопасно на обеих платформах; проверено `GOOS=linux go vet` по всем пакетам.
This commit is contained in:
@@ -295,7 +295,8 @@ func ReadDisk(path string) (Disk, error) {
|
||||
if err := syscall.Statfs(path, &stats); err != nil {
|
||||
return Disk{}, fmt.Errorf("sysinfo.disk: %w", err)
|
||||
}
|
||||
blockSize := toInt64From32(stats.Bsize)
|
||||
// Bsize в Linux — int64, в Darwin — uint32: приведение безопасно в обоих случаях.
|
||||
blockSize := int64(stats.Bsize)
|
||||
total := saturatingMul(toInt64(stats.Blocks), blockSize)
|
||||
free := saturatingMul(toInt64(stats.Bavail), blockSize)
|
||||
return Disk{UsedBytes: total - free, TotalBytes: total, FreeBytes: free}, nil
|
||||
@@ -324,11 +325,6 @@ func toInt64(value uint64) int64 {
|
||||
return int64(value)
|
||||
}
|
||||
|
||||
// toInt64From32 переводит 32-битное беззнаковое значение (размер блока statfs).
|
||||
func toInt64From32(value uint32) int64 {
|
||||
return int64(value)
|
||||
}
|
||||
|
||||
// saturatingMul умножает с насыщением: размер раздела не должен переполняться.
|
||||
func saturatingMul(a, b int64) int64 {
|
||||
if a <= 0 || b <= 0 {
|
||||
|
||||
Reference in New Issue
Block a user