diff --git a/ios/logbuf.go b/ios/logbuf.go index 64bff6a..8c1c178 100644 --- a/ios/logbuf.go +++ b/ios/logbuf.go @@ -47,7 +47,7 @@ func ClearLogs() { sharedLogBuf.clear() } // bufLogger реализует logx.Logger, пишет в stderr и в sharedLogBuf. type bufLogger struct{ debug bool } -func (l *bufLogger) write(level, format string, v ...any) { +func (*bufLogger) write(level, format string, v ...any) { msg := fmt.Sprintf(format, v...) line := time.Now().Format("15:04:05") + " [" + level + "] " + msg log.Print("[" + level + "] " + msg) diff --git a/ios/mobile.go b/ios/mobile.go index 12679e9..5d5558c 100644 --- a/ios/mobile.go +++ b/ios/mobile.go @@ -7,6 +7,7 @@ import ( "context" "errors" "fmt" + "math" "net" "sync" "sync/atomic" @@ -68,6 +69,16 @@ var ( func setStatus(s *statusInfo) { statusVal.Store(s) } +// clampToInt64 насыщает uint64 до int64: gomobile экспортирует только int64, +// а счётчики байт — uint64. Реальный трафик до math.MaxInt64 не доходит, но +// насыщение делает конверсию безопасной от переполнения. +func clampToInt64(u uint64) int64 { + if u > math.MaxInt64 { + return math.MaxInt64 + } + return int64(u) +} + // GetState возвращает текущий снимок состояния сессии: стадию подключения // плюс статистику трафика, собранные на чтении из внутренних атомиков. func GetState() *Snapshot { @@ -81,8 +92,8 @@ func GetState() *Snapshot { Streams: st.streams, Total: st.total, ErrMsg: st.errMsg, - TxTotal: int64(tx), - RxTotal: int64(rx), + TxTotal: clampToInt64(tx), + RxTotal: clampToInt64(rx), TxRate: globalTxRate.Load(), RxRate: globalRxRate.Load(), } diff --git a/ios/mobilestats.go b/ios/mobilestats.go index cda8e82..a3499a5 100644 --- a/ios/mobilestats.go +++ b/ios/mobilestats.go @@ -37,8 +37,8 @@ func startRateMeter(ctx context.Context) { prevTx, prevRx = tx, rx continue } - globalTxRate.Store(int64(tx - prevTx)) - globalRxRate.Store(int64(rx - prevRx)) + globalTxRate.Store(clampToInt64(tx - prevTx)) + globalRxRate.Store(clampToInt64(rx - prevRx)) prevTx, prevRx = tx, rx } }