From cf7a55203b5e44ba11f773ee9b95a36a6d083c35 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Fri, 6 Nov 2020 11:12:45 +0100 Subject: [PATCH] fix potential memory leak with converting byte arrays to bitmaps --- app/DD_PM_WINDREAM/ClassControlCreator.vb | 3 --- app/DD_PM_WINDREAM/ClassEncryption.vb | 29 ++++++++++++++++------- app/DD_PM_WINDREAM/ModuleHelper.vb | 13 +++++++++- app/DD_PM_WINDREAM/frmFormDesigner.vb | 3 --- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/app/DD_PM_WINDREAM/ClassControlCreator.vb b/app/DD_PM_WINDREAM/ClassControlCreator.vb index 7ec7b14..9b51f5d 100644 --- a/app/DD_PM_WINDREAM/ClassControlCreator.vb +++ b/app/DD_PM_WINDREAM/ClassControlCreator.vb @@ -288,9 +288,6 @@ Public Class ClassControlCreator Return control End Function - Private Shared Function ByteArrayToBitmap(bytearray() As Byte) As Bitmap - Return New Bitmap(New System.IO.MemoryStream(bytearray)) - End Function Public Shared Function CreateExistingButton(row As DataRow, designMode As Boolean) As Button Dim oControl As Button = CreateBaseControl(New Button(), row, designMode) diff --git a/app/DD_PM_WINDREAM/ClassEncryption.vb b/app/DD_PM_WINDREAM/ClassEncryption.vb index b0bfa39..fe67c9b 100644 --- a/app/DD_PM_WINDREAM/ClassEncryption.vb +++ b/app/DD_PM_WINDREAM/ClassEncryption.vb @@ -14,16 +14,14 @@ Public Class ClassEncryption Dim sha1 As New SHA1CryptoServiceProvider ' Hash the key. - Dim keyBytes() As Byte = - System.Text.Encoding.Unicode.GetBytes(key) + Dim keyBytes() As Byte = Text.Encoding.Unicode.GetBytes(key) Dim hash() As Byte = sha1.ComputeHash(keyBytes) ' Truncate or pad the hash. ReDim Preserve hash(length - 1) Return hash End Function - Public Function EncryptData( - ByVal plaintext As String) As String + Public Function EncryptData(ByVal plaintext As String) As String ' Convert the plaintext string to a byte array. Dim plaintextBytes() As Byte = @@ -40,12 +38,19 @@ Public Class ClassEncryption encStream.Write(plaintextBytes, 0, plaintextBytes.Length) encStream.FlushFinalBlock() + Dim oPrintableString = Convert.ToBase64String(ms.ToArray) + + Try + ms.Dispose() + Catch ex As Exception + LOGGER.Error(ex) + End Try + ' Convert the encrypted stream to a printable string. - Return Convert.ToBase64String(ms.ToArray) + Return oPrintableString End Function 'Entschlüsselt die Zeichenfolge - Public Function DecryptData( - ByVal encryptedtext As String) As String + Public Function DecryptData(ByVal encryptedtext As String) As String ' Convert the encrypted text string to a byte array. Dim encryptedBytes() As Byte = Convert.FromBase64String(encryptedtext) @@ -60,9 +65,17 @@ Public Class ClassEncryption ' Use the crypto stream to write the byte array to the stream. decStream.Write(encryptedBytes, 0, encryptedBytes.Length) decStream.FlushFinalBlock() + + ' Convert the plaintext stream to a string. Dim result = System.Text.Encoding.Unicode.GetString(ms.ToArray) result = result.Replace("!Didalog35452Heuchelheim=", "") - ' Convert the plaintext stream to a string. + + Try + ms.Dispose() + Catch ex As Exception + LOGGER.Error(ex) + End Try + Return result End Function End Class diff --git a/app/DD_PM_WINDREAM/ModuleHelper.vb b/app/DD_PM_WINDREAM/ModuleHelper.vb index cbfbd23..80bc422 100644 --- a/app/DD_PM_WINDREAM/ModuleHelper.vb +++ b/app/DD_PM_WINDREAM/ModuleHelper.vb @@ -1,6 +1,17 @@ Module ModuleHelper Public Function ByteArrayToBitmap(bytearray() As Byte) As Bitmap - Return New Bitmap(New System.IO.MemoryStream(bytearray)) + Try + Dim oBitmap As Bitmap + + Using oStream As New IO.MemoryStream(bytearray) + oBitmap = New Bitmap(oStream) + End Using + + Return oBitmap + Catch ex As Exception + LOGGER.Error(ex) + Return Nothing + End Try End Function Public Function StringToByteArray(ByVal hex As String) As Byte() diff --git a/app/DD_PM_WINDREAM/frmFormDesigner.vb b/app/DD_PM_WINDREAM/frmFormDesigner.vb index 02698da..c04d453 100644 --- a/app/DD_PM_WINDREAM/frmFormDesigner.vb +++ b/app/DD_PM_WINDREAM/frmFormDesigner.vb @@ -207,9 +207,6 @@ Public Class frmFormDesigner End If Return oType <> FINALINDICES.INDEX_TYPE_VECTOR_DATETIME End Function - Public Function ByteArrayToBitmap(bytearray() As Byte) As Bitmap - Return New Bitmap(New System.IO.MemoryStream(bytearray)) - End Function Sub LoadControls() Try TBPM_PROFILE_CONTROLSTableAdapter.FillByProfil(DD_DMSLiteDataSet.TBPM_PROFILE_CONTROLS, USER_LANGUAGE, ProfileId)