diff --git a/collector/cpu_freebsd.go b/collector/cpu_freebsd.go index 29748f11..7b4e7bc7 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 } @@ -149,10 +151,13 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) (err error) { if C.getCPUTimes(&ncpu, &cpuTimesC, &cpuTimesLength) == -1 { return errors.New("could not retrieve CPU times") } - defer C.freeCPUTimes(cpuTimesC) + defer C.free(unsafe.Pointer(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 := (*[maxCpuTimes]C.double)(unsafe.Pointer(cpuTimesC))[:cpuTimesLength:cpuTimesLength] for cpu := 0; cpu < int(ncpu); cpu++ { base_idx := C.CPUSTATES * cpu