39 lines
1.5 KiB
Diff
39 lines
1.5 KiB
Diff
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++) {
|