From 2d7bf81397c9754a1065a511723528c7f3548acb Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Thu, 4 Sep 2025 10:54:18 +0200 Subject: [PATCH] [proxy,channels] better NULL checks --- server/proxy/channels/pf_channel_drdynvc.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/server/proxy/channels/pf_channel_drdynvc.c b/server/proxy/channels/pf_channel_drdynvc.c index 20e9b26d8..c09f1e939 100644 --- a/server/proxy/channels/pf_channel_drdynvc.c +++ b/server/proxy/channels/pf_channel_drdynvc.c @@ -337,12 +337,11 @@ static PfChannelResult DynvcTrackerHandleClose(ChannelStateTracker* tracker, DynChannelContext* dynChannelContext, BOOL firstPacket, BOOL lastPacket) { - WINPR_ASSERT(dynChannel); WINPR_ASSERT(dynChannelContext); const BOOL isBackData = (tracker == dynChannelContext->backTracker); - if (!lastPacket) + if (!lastPacket || !dynChannel) return PF_CHANNEL_RESULT_DROP; DynvcTrackerLog(dynChannelContext->log, WLOG_DEBUG, dynChannel, CLOSE_REQUEST_PDU, isBackData, @@ -380,7 +379,7 @@ static PfChannelResult DynvcTrackerHandleCreateBack(ChannelStateTracker* tracker DynvcTrackerLog(dynChannelContext->log, WLOG_ERROR, dynChannel, cmd, isBackData, "channel id %" PRIu64 ", name=%s [%" PRIuz "|%" PRIuz "], status=%s", dynChannelId, namebuffer, len, nameLen, - openstatus2str(dynChannel->openStatus)); + dynChannel ? openstatus2str(dynChannel->openStatus) : "NULL"); return PF_CHANNEL_RESULT_ERROR; } @@ -450,7 +449,7 @@ static PfChannelResult DynvcTrackerHandleCreateFront(ChannelStateTracker* tracke DynvcTrackerLog(dynChannelContext->log, WLOG_DEBUG, dynChannel, cmd, isBackData, "CREATE_RESPONSE openStatus=%" PRIu32, creationStatus); - if (creationStatus == 0) + if (dynChannel && (creationStatus == 0)) dynChannel->openStatus = CHANNEL_OPENSTATE_OPENED; const BOOL firstPacket = (flags & CHANNEL_FLAG_FIRST) ? TRUE : FALSE; @@ -495,7 +494,6 @@ static PfChannelResult DynvcTrackerHandleCmdDATA(ChannelStateTracker* tracker, BOOL firstPacket, BOOL lastPacket) { WINPR_ASSERT(tracker); - WINPR_ASSERT(dynChannel); WINPR_ASSERT(s); DynChannelContext* dynChannelContext = @@ -504,6 +502,13 @@ static PfChannelResult DynvcTrackerHandleCmdDATA(ChannelStateTracker* tracker, const BOOL isBackData = (tracker == dynChannelContext->backTracker); + if (!dynChannel) + { + DynvcTrackerLog(dynChannelContext->log, WLOG_WARN, dynChannel, cmd, isBackData, + "channel is NULL, dropping packet"); + return PF_CHANNEL_RESULT_DROP; + } + DynChannelTrackerState* trackerState = isBackData ? &dynChannel->backTracker : &dynChannel->frontTracker; if (dynChannel->openStatus != CHANNEL_OPENSTATE_OPENED)