From a5c16955d7a05fed783e7cf03cf50cf5d544657e Mon Sep 17 00:00:00 2001 From: "Christian F.K. Schaller" Date: Tue, 7 Apr 2026 12:51:50 -0400 Subject: [PATCH] module-avb: fix ACMP error responses sent with wrong message type In handle_connect_tx_command() and handle_disconnect_tx_command(), AVB_PACKET_ACMP_SET_MESSAGE_TYPE() is called after the goto done target. When find_stream() fails and jumps to done, the response is sent with the original command message type (e.g., CONNECT_TX_COMMAND) instead of the correct response type (CONNECT_TX_RESPONSE). Also fix pending_destroy() which used < PENDING_CONTROLLER instead of <= PENDING_CONTROLLER, skipping cleanup of pending controller requests on shutdown. Co-Authored-By: Claude Opus 4.6 --- src/modules/module-avb/acmp.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/modules/module-avb/acmp.c b/src/modules/module-avb/acmp.c index eacfb6133..26330b14b 100644 --- a/src/modules/module-avb/acmp.c +++ b/src/modules/module-avb/acmp.c @@ -82,7 +82,7 @@ static void pending_free(struct acmp *acmp, struct pending *p) static void pending_destroy(struct acmp *acmp) { struct pending *p, *t; - for (uint32_t list_id = 0; list_id < PENDING_CONTROLLER; list_id++) { + for (uint32_t list_id = 0; list_id <= PENDING_CONTROLLER; list_id++) { spa_list_for_each_safe(p, t, &acmp->pending[list_id], link) { pending_free(acmp, p); } @@ -174,13 +174,14 @@ static int handle_connect_tx_command(struct acmp *acmp, uint64_t now, const void return 0; memcpy(buf, m, len); + AVB_PACKET_ACMP_SET_MESSAGE_TYPE(reply, AVB_ACMP_MESSAGE_TYPE_CONNECT_TX_RESPONSE); + stream = find_stream(server, SPA_DIRECTION_OUTPUT, ntohs(reply->talker_unique_id)); if (stream == NULL) { status = AVB_ACMP_STATUS_TALKER_NO_STREAM_INDEX; goto done; } - AVB_PACKET_ACMP_SET_MESSAGE_TYPE(reply, AVB_ACMP_MESSAGE_TYPE_CONNECT_TX_RESPONSE); reply->stream_id = htobe64(stream->id); stream_activate(stream, ntohs(reply->talker_unique_id), now); @@ -251,14 +252,14 @@ static int handle_disconnect_tx_command(struct acmp *acmp, uint64_t now, const v return 0; memcpy(buf, m, len); + AVB_PACKET_ACMP_SET_MESSAGE_TYPE(reply, AVB_ACMP_MESSAGE_TYPE_DISCONNECT_TX_RESPONSE); + stream = find_stream(server, SPA_DIRECTION_OUTPUT, ntohs(reply->talker_unique_id)); if (stream == NULL) { status = AVB_ACMP_STATUS_TALKER_NO_STREAM_INDEX; goto done; } - AVB_PACKET_ACMP_SET_MESSAGE_TYPE(reply, AVB_ACMP_MESSAGE_TYPE_DISCONNECT_TX_RESPONSE); - stream_deactivate(stream, now); done: