]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
DER decoding: fix potential memory leak
authorVictor Julien <victor@inliniac.net>
Wed, 11 Dec 2013 10:00:41 +0000 (11:00 +0100)
committerVictor Julien <victor@inliniac.net>
Thu, 12 Dec 2013 14:59:58 +0000 (15:59 +0100)
This would only happen in memory failure conditions.

util-decode-der.c:634:27: warning: Potential leak of memory pointed to by 'child'
    return (Asn1Generic *)node;

src/util-decode-der.c

index bc4eb7a706f84917ef31ccdd74f52a2ec1694d29..3e7324be9cdb65f485834a6017b4901749825f84 100644 (file)
@@ -74,24 +74,28 @@ static Asn1Generic * Asn1GenericNew(void)
     return obj;
 }
 
-static void Asn1SequenceAppend(Asn1Generic *seq, Asn1Generic *node)
+/**
+ * \retval r 0 ok, -1 error
+ */
+static int Asn1SequenceAppend(Asn1Generic *seq, Asn1Generic *node)
 {
     Asn1Generic *it, *new_container;
 
     if (seq->data == NULL) {
         seq->data = node;
-        return;
+        return 0;
     }
 
     new_container = Asn1GenericNew();
     if (new_container == NULL)
-        return;
+        return -1;
     new_container->data = node;
 
     for (it=seq; it->next != NULL; it=it->next)
         ;
 
     it->next = new_container;
+    return 0;
 }
 
 static Asn1Generic * DecodeAsn1DerGeneric(const unsigned char *buffer, uint32_t max_size, uint8_t depth, int seq_index, uint32_t *errcode)
@@ -586,7 +590,6 @@ static Asn1Generic * DecodeAsn1DerSequence(const unsigned char *buffer, uint32_t
     uint8_t c;
     uint32_t seq_index;
     Asn1Generic *node;
-    Asn1Generic *child;
 
     d_ptr++;
 
@@ -620,15 +623,22 @@ static Asn1Generic * DecodeAsn1DerSequence(const unsigned char *buffer, uint32_t
     /* decode child elements */
     while (parsed_bytes < d_length) {
         el_max_size = max_size - (d_ptr-buffer);
-        child = DecodeAsn1DerGeneric(d_ptr, el_max_size, depth, seq_index, errcode);
 
+        Asn1Generic *child = DecodeAsn1DerGeneric(d_ptr, el_max_size, depth, seq_index, errcode);
         if (child == NULL) {
             break;
         }
-        Asn1SequenceAppend(node, child);
+
+        int ret = Asn1SequenceAppend(node, child);
+        if (ret == -1) {
+            DerFree(child);
+            break;
+        }
+
         parsed_bytes += child->length;
         d_ptr += child->length;
         seq_index++;
+
     }
 
     return (Asn1Generic *)node;