Blob Blame History Raw
commit 9d9adc9d6c8eb24a6884da81c18b927ea706a68e
Author: Nathan Scott <nathans@redhat.com>
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++) {