File 0014-state-always-update-state-variables.patch of Package pipewire.30043

From f678f4371de0a8a4b75023fb123d0210ac685ed2 Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Sat, 27 Jun 2020 13:21:12 +0200
Subject: [PATCH] state: always update state variables

Or else we might leak the error string.
---
 src/pipewire/impl-link.c |  8 ++++----
 src/pipewire/impl-node.c | 11 +++++------
 src/pipewire/impl-port.c | 24 +++++++++++++-----------
 3 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/src/pipewire/impl-link.c b/src/pipewire/impl-link.c
index 8be818b4..22446c86 100644
--- a/src/pipewire/impl-link.c
+++ b/src/pipewire/impl-link.c
@@ -89,6 +89,10 @@ static void pw_impl_link_update_state(struct pw_impl_link *link, enum pw_link_st
 {
 	enum pw_link_state old = link->info.state;
 
+	link->info.state = state;
+	free((char*)link->info.error);
+	link->info.error = error;
+
 	if (state == old)
 		return;
 
@@ -105,10 +109,6 @@ static void pw_impl_link_update_state(struct pw_impl_link *link, enum pw_link_st
 				pw_link_state_as_string(state));
 	}
 
-	link->info.state = state;
-	free((char*)link->info.error);
-	link->info.error = error;
-
 	pw_impl_link_emit_state_changed(link, old, state, error);
 
 	link->info.change_mask |= PW_LINK_CHANGE_MASK_STATE;
diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c
index fb415cdb..97ee439d 100644
--- a/src/pipewire/impl-node.c
+++ b/src/pipewire/impl-node.c
@@ -285,9 +285,12 @@ do_node_add(struct spa_loop *loop,
 
 static void node_update_state(struct pw_impl_node *node, enum pw_node_state state, char *error)
 {
-	enum pw_node_state old;
+	enum pw_node_state old = node->info.state;
+
+	free((char*)node->info.error);
+	node->info.error = error;
+	node->info.state = state;
 
-	old = node->info.state;
 	if (old == state)
 		return;
 
@@ -302,10 +305,6 @@ static void node_update_state(struct pw_impl_node *node, enum pw_node_state stat
 		     pw_node_state_as_string(old), pw_node_state_as_string(state));
 	}
 
-	free((char*)node->info.error);
-	node->info.error = error;
-	node->info.state = state;
-
 	switch (state) {
 	case PW_NODE_STATE_RUNNING:
 		pw_loop_invoke(node->data_loop, do_node_add, 1, NULL, 0, true, node);
diff --git a/src/pipewire/impl-port.c b/src/pipewire/impl-port.c
index 7e4528e7..21434360 100644
--- a/src/pipewire/impl-port.c
+++ b/src/pipewire/impl-port.c
@@ -98,17 +98,19 @@ void pw_impl_port_update_state(struct pw_impl_port *port, enum pw_impl_port_stat
 {
 	enum pw_impl_port_state old = port->state;
 
-	if (old != state) {
-		pw_log(state == PW_IMPL_PORT_STATE_ERROR ?
-				SPA_LOG_LEVEL_ERROR : SPA_LOG_LEVEL_DEBUG,
-			NAME" %p: state %s -> %s (%s)", port,
-			port_state_as_string(old), port_state_as_string(state), error);
-
-		port->state = state;
-		free((void*)port->error);
-		port->error = error;
-		pw_impl_port_emit_state_changed(port, old, state, error);
-	}
+	port->state = state;
+	free((void*)port->error);
+	port->error = error;
+
+	if (old == state)
+		return;
+
+	pw_log(state == PW_IMPL_PORT_STATE_ERROR ?
+			SPA_LOG_LEVEL_ERROR : SPA_LOG_LEVEL_DEBUG,
+		NAME" %p: state %s -> %s (%s)", port,
+		port_state_as_string(old), port_state_as_string(state), error);
+
+	pw_impl_port_emit_state_changed(port, old, state, error);
 }
 
 static int tee_process(void *object)
openSUSE Build Service is sponsored by