From f89e4d17d01e82c4e2291cd63449330033ea3c32 Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Thu, 22 Oct 2026 11:48:41 +0200 Subject: [PATCH] MT#66063 Check parsed SDP before to create new one When faking the SDP body (the rapid 200OK answer) make sure about proper parsed given (requeste's) SDP body, before to try to prepare a new faked SDP based on that. Change-Id: I57d1010051adccc941d485b3c6178d34154c2709 --- core/AmB2BSession.cpp | 16 ++++++++++++---- core/AmSdp.cpp | 5 +++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/core/AmB2BSession.cpp b/core/AmB2BSession.cpp index 5466c698..46c651d0 100644 --- a/core/AmB2BSession.cpp +++ b/core/AmB2BSession.cpp @@ -313,18 +313,22 @@ void AmB2BSession::addFakeSDPbasedOnPort(const AmMimeBody *src_sdp, AmMimeBody & /* create fake AmSdp from AmMimeBody */ AmSdp fake_sdp; AmMimeBody fake_mimebody; - if (!fake_sdp.parse(src_sdp->getPayload())) - { - ILOG_DLG(L_WARN, "Failed to parse SDP.\n"); + if (!fake_sdp.parse(src_sdp->getPayload())) { + WARN("SDP parsing failed, can't put the desired port value: '%u'!\n", desired_port); + DBG("Fall-back to the createFakeReply().\n"); + createFakeReply(nullptr, new_body); /* create a brand new fake body */ return; } + /* parsing into AmSdp is required only to set desired source port */ for (auto it = fake_sdp.media.begin(); it != fake_sdp.media.end(); ++it) { it->port = desired_port; } + /* after rewriting the port, put the SDP back into AmMimeBody */ sdp2body(fake_sdp, fake_mimebody); + /* based on that create a new body to be used in reply */ createFakeReply(&fake_mimebody, new_body); } @@ -392,6 +396,10 @@ void AmB2BSession::acceptPendingInviteB2B(const AmSipRequest& invite) return; } + if (!sdp) { + WARN("No application/sdp body found!\n"); + } + AmSipReply n_reply; /* local sdp, which was already learned before */ @@ -410,7 +418,7 @@ void AmB2BSession::acceptPendingInviteB2B(const AmSipRequest& invite) } } - if (remote_port > 0) { + if (remote_port > 0 && sdp) { ILOG_DLG(L_DBG, "Using remotely seen SDP port for faking this reply: '%d'\n", remote_port); addFakeSDPbasedOnPort(sdp, n_reply.body, remote_port); } diff --git a/core/AmSdp.cpp b/core/AmSdp.cpp index 500095b8..cf5d25cb 100644 --- a/core/AmSdp.cpp +++ b/core/AmSdp.cpp @@ -458,6 +458,8 @@ bool AmSdp::parse(const string& sdp_copy) { if (sdp_copy.empty()) { WARN("Nothing to parse.\n"); + /* remove all values already parsed before */ + clear(); return false; } @@ -501,6 +503,9 @@ bool AmSdp::parse(const string& sdp_copy) sdp_parse_fingerprint(); sdp_parse_ssrc(); + if (parsed) + DBG("SDP parsing finished OK.\n"); + return parsed; }