From e48ea81b7caa82301a00dd12fe572c87afea632b Mon Sep 17 00:00:00 2001 From: Vlad Vissoultchev Date: Sun, 3 Dec 2023 15:47:04 +0200 Subject: [PATCH 1/3] Fix excl. code when VNC_NO_ZLIB condition compilation is set --- src/cVncServer.cls | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/cVncServer.cls b/src/cVncServer.cls index 8d87179..ae348fd 100644 --- a/src/cVncServer.cls +++ b/src/cVncServer.cls @@ -1289,10 +1289,12 @@ Private Function pvHandleClientMessage(uInput As UcsBuffer) As Boolean .Pos = .Pos + sizeof_RfbClientFramebufferUpdateRequest If m_uClientFramebufferUpdate.Incremental = 0 Then Call RedrawWindow(0, ByVal 0, 0, RDW_INVALIDATE Or RDW_ALLCHILDREN) - If Not m_oZipArchive Is Nothing And m_uClientEncodings.PrefEncoding = rfbEncTight Then - m_oZipArchive.DeflateEnd m_hDeflateCtx - Set m_oZipArchive = Nothing - End If + #If ImplZlib Then + If Not m_oZipArchive Is Nothing And m_uClientEncodings.PrefEncoding = rfbEncTight Then + m_oZipArchive.DeflateEnd m_hDeflateCtx + Set m_oZipArchive = Nothing + End If + #End If End If Case rfbMsgKeyEvent If .Size - .Pos < sizeof_RfbClientKeyEvent Then @@ -2006,13 +2008,17 @@ SkipChecksums: End If Case rfbFtpFilePacket If m_pFtpRecvStream Is Nothing Then +AbortRecv: + Set m_pFtpRecvStream = Nothing + pvSendFileTransfer uOutput, rfbFtpAbortFileTransfer GoTo QH End If - If uMsg.Size = rfbFtpSPacketAlreadyThere Then + Select Case uMsg.Size + Case rfbFtpSPacketAlreadyThere If pvCheckHResult(IStream_Seek(m_pFtpRecvStream, uMsg.Length / 10000@, STREAM_SEEK_CUR), FUNC_NAME) < 0 Then GoTo AbortRecv End If - ElseIf uMsg.Size = rfbFtpSPacketCompressed Then + Case rfbFtpSPacketCompressed #If ImplZlib Then Dim hCtx As Long Dim lOutputPtr As Long @@ -2025,8 +2031,10 @@ SkipChecksums: If lOutputSize = 0 Then GoTo AbortRecv End If - ReDim baData(0 To lOutputSize - 1) As Byte - Call CopyMemory(baData(0), ByVal lOutputPtr, lOutputSize) + If pvCheckHResult(IStream_Write(m_pFtpRecvStream, lOutputPtr, lOutputSize), FUNC_NAME) < 0 Then + Call CoTaskMemFree(lOutputPtr) + GoTo AbortRecv + End If Call CoTaskMemFree(lOutputPtr) End With #Else @@ -2035,17 +2043,11 @@ SkipChecksums: #End If GoTo AbortRecv #End If - uMsg.Size = rfbFtpSPacketUncompressed - End If - If uMsg.Size = rfbFtpSPacketUncompressed Then + Case Else ' rfbFtpSPacketUncompressed If pvCheckHResult(IStream_Write(m_pFtpRecvStream, pvArrayPtr(baData), pvArraySize(baData)), FUNC_NAME) < 0 Then -AbortRecv: - Set m_pFtpRecvStream = Nothing - If Not pvSendFileTransfer(uOutput, rfbFtpAbortFileTransfer) Then - GoTo QH - End If + GoTo AbortRecv End If - End If + End Select Case rfbFtpEndOfFile If pvCheckHResult(IStream_Seek(m_pFtpRecvStream, 0, STREAM_SEEK_CUR, cStreamSize), FUNC_NAME) < 0 Then cStreamSize = -1 From 79cf838b2f32dd116a03b50e5c184686ada18e55 Mon Sep 17 00:00:00 2001 From: Vlad Vissoultchev Date: Mon, 4 Dec 2023 08:49:30 +0200 Subject: [PATCH 2/3] Handle FTP session start/end, clear junk in unused length on EOF msg --- src/cVncServer.cls | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/cVncServer.cls b/src/cVncServer.cls index ae348fd..7c075b8 100644 --- a/src/cVncServer.cls +++ b/src/cVncServer.cls @@ -1383,6 +1383,8 @@ Private Function pvHandleClientMessage(uInput As UcsBuffer) As Boolean lIdx = lIdx + 4 ElseIf uFileTransfer.ContentType = rfbFtpFilePacket And uFileTransfer.Size = rfbFtpSPacketAlreadyThere Then lIdx = 0 + ElseIf uFileTransfer.ContentType = rfbFtpEndOfFile Then + lIdx = 0 End If If .Size - .Pos < sizeof_RfbFileTransfer + lIdx Then GoTo QH @@ -2083,6 +2085,13 @@ AbortRecv: ContentParam:=rfbFtpProtocolVersion, ContentSize:=rfbFtpSProtocolEnabled) Then GoTo QH End If + Case rfbFtpFileTransferSessionStart, rfbFtpFileTransferSessionEnd + m_bFtpSendRunning = False + Set m_pFtpSendStream = Nothing + Set m_pFtpSendChecksums = Nothing + m_sFtpSendArchiveFile = vbNullString + m_sFtpRecvFileName = vbNullString + Set m_pFtpRecvStream = Nothing End Select '--- success pvHandleFileTransfer = True From 5283d15ac81f47cd1b029f79b45d8366cae2c280 Mon Sep 17 00:00:00 2001 From: Vlad Vissoultchev Date: Wed, 13 Dec 2023 13:36:44 +0200 Subject: [PATCH 3/3] Reset desktop duplication if lost on too much pending frames --- src/cVncServer.cls | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/cVncServer.cls b/src/cVncServer.cls index 7c075b8..20900cd 100644 --- a/src/cVncServer.cls +++ b/src/cVncServer.cls @@ -2310,19 +2310,19 @@ Attribute TimerProc.VB_MemberFlags = "40" For Each oConn In m_cConnections oConn.frNotifyBeforeSendFrame Next - m_uCaptureFrame.NumTiles = 0 - m_uCaptureFrame.NumMoveRects = 0 - m_uCaptureFrame.PointerShapeBufferSize = 0 + If m_uCaptureCtx.Duplication Is Nothing Then + frCaptureSetupDeviceIndex + End If If Not m_uCaptureCtx.Duplication Is Nothing Then - If Not pvCaptureFrame(m_uCaptureCtx, m_uCaptureFrame) Then - If m_uCaptureCtx.Duplication Is Nothing Then - frCaptureSetupDeviceIndex - End If + m_uCaptureFrame.NumTiles = 0 + m_uCaptureFrame.NumMoveRects = 0 + m_uCaptureFrame.PointerShapeBufferSize = 0 + If pvCaptureFrame(m_uCaptureCtx, m_uCaptureFrame) Then + For Each oConn In m_cConnections + oConn.frNotifySendFrame m_uCaptureFrame + Next End If End If - For Each oConn In m_cConnections - oConn.frNotifySendFrame m_uCaptureFrame - Next For Each oConn In m_cConnections oConn.frNotifyAfterSendFrame Next