From 84c9d83c90d4d9401307931b0fc284cb6da2cf11 Mon Sep 17 00:00:00 2001 From: sauwming Date: Mon, 18 Dec 2023 11:56:43 +0800 Subject: [PATCH] Prevent immediate tsx termination upon transport error (#3805) --- pjsip/src/pjsip/sip_transaction.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/pjsip/src/pjsip/sip_transaction.c b/pjsip/src/pjsip/sip_transaction.c index 7687d17baa..719be95ca7 100644 --- a/pjsip/src/pjsip/sip_transaction.c +++ b/pjsip/src/pjsip/sip_transaction.c @@ -2144,11 +2144,15 @@ static void send_msg_callback( pjsip_send_state *send_state, else sc = PJSIP_SC_TSX_TRANSPORT_ERROR; - /* Terminate transaction, if it's not already terminated. */ - tsx_set_status_code(tsx, sc, &err); - if (tsx->state != PJSIP_TSX_STATE_TERMINATED && + /* We terminate the transaction for 502 error. For 503, + * we will retry it. + * See https://github.com/pjsip/pjproject/pull/3805 + */ + if (sc == PJSIP_SC_BAD_GATEWAY && + tsx->state != PJSIP_TSX_STATE_TERMINATED && tsx->state != PJSIP_TSX_STATE_DESTROYED) { + tsx_set_status_code(tsx, sc, &err); /* Set tsx state to TERMINATED, but release the lock * when invoking the callback, to avoid deadlock. */ @@ -2161,6 +2165,7 @@ static void send_msg_callback( pjsip_send_state *send_state, */ else if (tsx->transport_flag & TSX_HAS_PENDING_DESTROY) { + tsx_set_status_code(tsx, sc, &err); tsx_set_state( tsx, PJSIP_TSX_STATE_DESTROYED, PJSIP_EVENT_TRANSPORT_ERROR, send_state->tdata, 0);