Blob Blame History Raw
From c2b36aa61e333e2492ced8beaa84f6f19b8cf6ed Mon Sep 17 00:00:00 2001
From: Sebastien GODARD <sysstat@users.noreply.github.com>
Date: Sat, 30 Dec 2017 11:16:32 +0100
Subject: [PATCH] sadc: Fix segfault that may happen when appending data to
 file

Buffers need to be allocated according to activities present in file so
that we can append data to that file.

Signed-off-by: Sebastien GODARD <sysstat@users.noreply.github.com>

(cherry-picked from commit 1cf6596368da94ac48656dbb117f4e8c0cde58b9)
---
 sadc.c | 29 +++++++++++++++--------------
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/sadc.c b/sadc.c
index 53e9175..fa94d1f 100644
--- a/sadc.c
+++ b/sadc.c
@@ -824,20 +824,21 @@ void open_ofile(int *ofd, char ofile[])
 			for (i = 0; i < file_hdr.sa_nr_act; i++) {
 				
 				p = get_activity_position(act, file_act[i].id);
-				
-				if ((act[p]->nr != file_act[i].nr) || (act[p]->nr2 != file_act[i].nr2)) {
-					/*
-					 * Force number of items (serial lines, network interfaces...)
-					 * and sub-items to that of the file, and reallocate structures.
-					 */
-					act[p]->nr  = file_act[i].nr;
-					act[p]->nr2 = file_act[i].nr2;
-					SREALLOC(act[p]->_buf0, void, act[p]->msize * act[p]->nr * act[p]->nr2);
-				}
-				
-				/* Save activity sequence */
-				id_seq[i] = file_act[i].id;
-				act[p]->options |= AO_COLLECTED;
+
+                                act[p]->nr = file_act[i].nr;
+                                /*
+                                 * Force number of sub-items to that of the file, and reallocate structures.
+                                 * Note: Structures have been allocated in sa_sys_init() only for activities
+                                 * that are collected. But since activities from file now prevail over them,
+                                 * we need to reallocate.
+                                 */
+                                act[p]->nr2 = file_act[i].nr2;
+                                SREALLOC(act[p]->_buf0, void,
+                                         (size_t) act[p]->msize * (size_t) act[p]->nr * (size_t) act[p]->nr2);
+
+                                /* Save activity sequence */
+                                id_seq[i] = file_act[i].id;
+                                act[p]->options |= AO_COLLECTED;
 			}
 		}
 	}
-- 
2.21.0