[PATCH] Avoid static local variable in fbus-phonet

Ladislav Michl <[email protected]> Wed, 21 Nov 2018 10:32:53 +0100
Newsgroups gmane.linux.drivers.gnokii
Message-ID <20181121093253.GA22483@lenoch>
Function verify_max_message_len is using static local variable
making it thread unsafe. Move that variable into incoming message
instance.

Signed-off-by: Ladislav Michl <[email protected]>
Reported-by: Peter Koch <[email protected]>
---
 common/links/fbus-phonet.c  | 26 +++++++++++++-------------
 include/links/fbus-phonet.h |  1 +
 2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/common/links/fbus-phonet.c b/common/links/fbus-phonet.c
index 3300ceab..276de1d6 100644
--- a/common/links/fbus-phonet.c
+++ b/common/links/fbus-phonet.c
@@ -47,19 +47,18 @@ static gn_error phonet_send_message(unsigned int messagesize, unsigned char mess
 
 /*--------------------------------------------*/
 
-static int verify_max_message_len(int len, char **message_buffer)
+static int verify_max_message_len(int len, phonet_incoming_message *i)
 {
-	static int max_message_len = 0;
-
-	if (len > max_message_len || !*message_buffer) {
-		dprintf("overrun, reallocating: %d %d\n", len, max_message_len);
-		*message_buffer = realloc(*message_buffer, len + 1);
-		max_message_len = len + 1;
+	if (len > i->message_buffer_size || !i->message_buffer) {
+		dprintf("overrun, reallocating: %d %d\n", len, i->message_buffer_size);
+		i->message_buffer_size = len + 1;
+		i->message_buffer = realloc(i->message_buffer, i->message_buffer_size);
 	}
-	if (*message_buffer)
-		return max_message_len;
-	else
-		return 0;
+	if (i->message_buffer)
+		return i->message_buffer_size;
+
+	i->message_buffer_size = 0;
+	return 0;
 }
 
 
@@ -171,7 +170,7 @@ static void phonet_rx_statemachine(unsigned char rx_byte, struct gn_statemachine
 		i->message_length = i->message_length + rx_byte;
 		i->state = FBUS_RX_GetMessage;
 		i->buffer_count = 0;
-		if (!verify_max_message_len(i->message_length, &(i->message_buffer))) {
+		if (!verify_max_message_len(i->message_length, i)) {
 			dprintf("PHONET: Failed to allocate memory for larger buffer\n");
 			i->message_corrupted = 1;
 		}
@@ -369,6 +368,7 @@ static void phonet_cleanup(struct gn_statemachine *state)
 {
 	free(FBUSINST(state)->message_buffer);
 	FBUSINST(state)->message_buffer = NULL;
+	FBUSINST(state)->message_buffer_size = 0;
 }
 
 /* Initialise variables and start the link */
@@ -388,7 +388,7 @@ gn_error phonet_initialise(struct gn_statemachine *state)
 	if ((FBUSINST(state) = calloc(1, sizeof(phonet_incoming_message))) == NULL)
 		return GN_ERR_MEMORYFULL;
 
-	if (!verify_max_message_len(PHONET_FRAME_MAX_LENGTH, &(FBUSINST(state)->message_buffer))) {
+	if (!verify_max_message_len(PHONET_FRAME_MAX_LENGTH, FBUSINST(state))) {
 		dprintf("PHONET: Failed to initalize initial incoming buffer for %d bytes\n", PHONET_FRAME_MAX_LENGTH);
 		return GN_ERR_MEMORYFULL;
 	}
diff --git a/include/links/fbus-phonet.h b/include/links/fbus-phonet.h
index 89eaf0ba..88eb06ca 100644
--- a/include/links/fbus-phonet.h
+++ b/include/links/fbus-phonet.h
@@ -48,6 +48,7 @@ typedef struct {
 	int message_type;
 	int message_length;
 	char *message_buffer;
+	int message_buffer_size;
 	int message_corrupted;
 } phonet_incoming_message;
 
-- 
2.19.1