commit 9d9adc9d6c8eb24a6884da81c18b927ea706a68e Author: Nathan Scott Date: Tue Dec 7 11:18:11 2021 +1100 pmdanvidia: fix mishandling of zero-byte size passed to realloc Picked up during QA of recent nvidia changes - some hardware lacks support for per-process metrics, or the hardware (GPU) has not yet been accessed by a process using its resources, which had the side effect that a zero-byte size argument was passed into realloc. In turn, this passes back something that can be freed and an issue in the logic meant this would happen on subsequent calls also. Resolves the QA failure and Red Hat BZ #2029301 diff --git a/src/pmdas/nvidia/nvidia.c b/src/pmdas/nvidia/nvidia.c index f1c12f2275..dc5bb93a0d 100644 --- a/src/pmdas/nvidia/nvidia.c +++ b/src/pmdas/nvidia/nvidia.c @@ -617,11 +617,16 @@ refresh(pcp_nvinfo_t *nvinfo, int need_processes) /* update indoms, cull old entries that remain inactive */ if (need_processes) { pmdaIndom *proc_indomp = &indomtab[PROC_INDOM]; - pmdaInstid *it_set = proc_indomp->it_set; + pmdaInstid *it_set = NULL; size_t bytes = nproc * sizeof(pmdaInstid); - if ((it_set = (pmdaInstid *)realloc(it_set, bytes)) == NULL) + if (bytes > 0) { + it_set = (pmdaInstid *)realloc(proc_indomp->it_set, bytes); + if (it_set == NULL) + free(proc_indomp->it_set); + } else if (proc_indomp->it_set != NULL) { free(proc_indomp->it_set); + } if ((proc_indomp->it_set = it_set) != NULL) { for (i = j = 0; i < processes.hsize && j < nproc; i++) {