diff --git a/collector/cpu_freebsd.go b/collector/cpu_freebsd.go index 29748f11..0ede1a69 100644 --- a/collector/cpu_freebsd.go +++ b/collector/cpu_freebsd.go @@ -103,6 +103,8 @@ void freeCPUTimes(double *cpu_times) { */ import "C" +const maxCPUTimesLen = C.MAXCPU * C.CPUSTATES + type statCollector struct { cpu *prometheus.CounterVec } @@ -150,9 +152,12 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) (err error) { return errors.New("could not retrieve CPU times") } defer C.freeCPUTimes(cpuTimesC) + if cpuTimesLength > maxCPUTimesLen { + return errors.New("more CPU's than MAXCPU?") + } // Convert C.double array to Go array (https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices). - cpuTimes := (*[1 << 30]C.double)(unsafe.Pointer(cpuTimesC))[:cpuTimesLength:cpuTimesLength] + cpuTimes := (*[maxCPUTimesLen]C.double)(unsafe.Pointer(cpuTimesC))[:cpuTimesLength:cpuTimesLength] for cpu := 0; cpu < int(ncpu); cpu++ { base_idx := C.CPUSTATES * cpu