rdp redirect: do the necessary layering violation to avoid leaks
authorMads Kiilerich <mads@kiilerich.com>
Fri, 16 Mar 2012 17:12:49 +0000 (18:12 +0100)
committerMads Kiilerich <mads@kiilerich.com>
Fri, 16 Mar 2012 17:12:49 +0000 (18:12 +0100)
libfreerdp-core/connection.c
libfreerdp-core/rdp.c
libfreerdp-core/redirection.c

index 236077b..86a724d 100644 (file)
@@ -128,10 +128,22 @@ boolean rdp_client_redirect(rdpRdp* rdp)
 
        rdp_client_disconnect(rdp);
 
+       /* FIXME: this is a subset of rdp_free */
+       crypto_rc4_free(rdp->rc4_decrypt_key);
+       crypto_rc4_free(rdp->rc4_encrypt_key);
+       crypto_des3_free(rdp->fips_encrypt);
+       crypto_des3_free(rdp->fips_decrypt);
+       crypto_hmac_free(rdp->fips_hmac);
        mcs_free(rdp->mcs);
        nego_free(rdp->nego);
        license_free(rdp->license);
        transport_free(rdp->transport);
+
+       /* FIXME: this is a subset of settings_free */
+       freerdp_blob_free(settings->server_random);
+       freerdp_blob_free(settings->server_certificate);
+       xfree(settings->ip_address);
+
        rdp->transport = transport_new(settings);
        rdp->license = license_new(rdp);
        rdp->nego = nego_new(rdp->transport);
index 13ecae8..94d81bd 100644 (file)
@@ -941,8 +941,8 @@ void rdp_free(rdpRdp* rdp)
                crypto_des3_free(rdp->fips_encrypt);
                crypto_des3_free(rdp->fips_decrypt);
                crypto_hmac_free(rdp->fips_hmac);
-               extension_free(rdp->extension);
                settings_free(rdp->settings);
+               extension_free(rdp->extension);
                transport_free(rdp->transport);
                license_free(rdp->license);
                input_free(rdp->input);
index 113c65a..3ca8ff8 100644 (file)
@@ -193,12 +193,6 @@ void redirection_free(rdpRedirection* redirection)
 {
        if (redirection != NULL)
        {
-               //these four have already been freed in settings_free() and freerdp_string_free() checks for NULL
-               redirection->username.ascii = NULL;
-               redirection->domain.ascii = NULL;
-               redirection->targetNetAddress.ascii = NULL;
-               redirection->targetNetBiosName.ascii = NULL;
-
                freerdp_string_free(&redirection->tsvUrl);
                freerdp_string_free(&redirection->username);
                freerdp_string_free(&redirection->domain);