]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
app-layer-ssl: fix unusual memory leak
authorVictor Julien <victor@inliniac.net>
Mon, 20 Jan 2014 11:42:59 +0000 (12:42 +0100)
committerVictor Julien <victor@inliniac.net>
Mon, 20 Jan 2014 12:21:40 +0000 (13:21 +0100)
In some cases the TLS state pointers to subject and issuerdn could
be overwritten by a new memory allocation, causing us to loose
track of the old.

This has been observed in the case of improper VLAN handling, where
it was suspected that multiple unrelated TLS streams were mangled
together.

src/app-layer-tls-handshake.c

index de596b461dceaa9fd0bb89cc3f25d037cc18000e..022547cdebc8ad812815a5abfcbac631fe13ce49 100644 (file)
@@ -130,7 +130,8 @@ int DecodeTLSHandshakeServerCertificate(SSLState *ssl_state, uint8_t *input, uin
                 SSLCertsChain *ncert;
                 //SCLogInfo("TLS Cert %d: %s\n", i, buffer);
                 if (i == 0) {
-                    ssl_state->server_connp.cert0_subject = SCStrdup(buffer);
+                    if (ssl_state->server_connp.cert0_subject == NULL)
+                        ssl_state->server_connp.cert0_subject = SCStrdup(buffer);
                     if (ssl_state->server_connp.cert0_subject == NULL) {
                         DerFree(cert);
                         return -1;
@@ -152,7 +153,8 @@ int DecodeTLSHandshakeServerCertificate(SSLState *ssl_state, uint8_t *input, uin
             } else {
                 //SCLogInfo("TLS IssuerDN %d: %s\n", i, buffer);
                 if (i == 0) {
-                    ssl_state->server_connp.cert0_issuerdn = SCStrdup(buffer);
+                    if (ssl_state->server_connp.cert0_issuerdn == NULL)
+                        ssl_state->server_connp.cert0_issuerdn = SCStrdup(buffer);
                     if (ssl_state->server_connp.cert0_issuerdn == NULL) {
                         DerFree(cert);
                         return -1;