]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
backport oom fixes
authorEric Leblond <eric@regit.org>
Wed, 7 Nov 2012 11:39:05 +0000 (12:39 +0100)
committerVictor Julien <victor@inliniac.net>
Fri, 9 Nov 2012 15:44:19 +0000 (16:44 +0100)
This is a backport of
https://github.com/ironbee/libhtp/commit/9ea5e0e3e4f84f54914d10ee50f618aa575bafe1

libhtp/htp/dslib.c
libhtp/htp/htp_connection_parser.c
libhtp/htp/htp_request_apache_2_2.c
libhtp/htp/htp_util.c

index 01606db107121d882b7d9862e4467bfdeab53884..507094bc1c1279952b4daf255a63d147b53d65a4 100644 (file)
@@ -530,7 +530,8 @@ size_t table_size(table_t *table) {
  */
 void table_clear(table_t *table) {    
     // TODO Clear table by removing the existing elements
-    
+    if (table == NULL)
+        return;
     size_t size = list_size(table->list);
 
     list_destroy(table->list);
index b349837386f752c81d1810810734be904cd7a1b4..f8b995b86fdd304e2c1596e489c34614808569b8 100644 (file)
@@ -152,6 +152,9 @@ htp_connp_t *htp_connp_create_copycfg(htp_cfg_t *cfg) {
  * @param connp
  */
 void htp_connp_destroy(htp_connp_t *connp) {
+    if (connp == NULL)
+        return;
+
     if (connp->out_decompressor != NULL) {
         connp->out_decompressor->destroy(connp->out_decompressor);
         connp->out_decompressor = NULL;
@@ -181,9 +184,8 @@ void htp_connp_destroy(htp_connp_t *connp) {
 
     // Destroy the configuration structure, but only
     // if it is our private copy
-    if (connp->is_cfg_private) {
-        if (connp->cfg != NULL)
-            htp_config_destroy(connp->cfg);
+    if ((connp->is_cfg_private) && (connp->cfg != NULL)) {
+        htp_config_destroy(connp->cfg);
     }
 
     free(connp);
@@ -196,6 +198,9 @@ void htp_connp_destroy(htp_connp_t *connp) {
  * @param connp
  */
 void htp_connp_destroy_all(htp_connp_t *connp) {
+    if (connp == NULL)
+        return;
+
     if (connp->conn != NULL) {
         // Destroy connection
         htp_conn_destroy(connp->conn);
index c06f1b02cc89779249160c432764ebb43c487daa..e8e0f30cc748e19c5e921e36c16b26fdd638d62e 100644 (file)
@@ -238,7 +238,13 @@ int htp_parse_request_header_apache_2_2(htp_connp_t *connp, htp_header_t *h, uns
 
     // Now extract the name and the value
     h->name = bstr_memdup((char *) data + name_start, name_end - name_start);
+    if (h->name == NULL)
+        return HTP_ERROR;
     h->value = bstr_memdup((char *) data + value_start, value_end - value_start);
+    if (h->value == NULL) {
+        bstr_free(h->name);
+        return HTP_ERROR;
+    }
 
     return HTP_OK;
 }
@@ -270,6 +276,9 @@ int htp_parse_request_line_apache_2_2(htp_connp_t *connp) {
     // No, we don't care if the method is empty.
 
     tx->request_method = bstr_memdup((char *) data, pos);
+    if (tx->request_method == NULL) {
+        return HTP_ERROR;
+    }
 
 #ifdef HTP_DEBUG
     fprint_raw_data(stderr, __FUNCTION__, (unsigned char *)bstr_ptr(tx->request_method), bstr_len(tx->request_method));
@@ -315,6 +324,8 @@ int htp_parse_request_line_apache_2_2(htp_connp_t *connp) {
 
     // The protocol information spreads until the end of the line.
     tx->request_protocol = bstr_memdup((char *) data + pos, len - pos);
+    if (tx->request_protocol == NULL)
+        return HTP_ERROR;
     tx->request_protocol_number = htp_parse_protocol(tx->request_protocol);
 
 #ifdef HTP_DEBUG
index f2849221fdcfff47711434ed0d3b67f24389ab80..42a68b8c100b34a653b2f7e8fb1c872e0696fbfc 100644 (file)
@@ -659,6 +659,9 @@ uint8_t bestfit_codepoint(htp_cfg_t *cfg, uint32_t codepoint) {
  * @param path
  */
 void htp_utf8_decode_path_inplace(htp_cfg_t *cfg, htp_tx_t *tx, bstr *path) {
+    if (path == NULL)
+        return;
+
     uint8_t *data = (unsigned char *) bstr_ptr(path);
     size_t len = bstr_len(path);
     size_t rpos = 0;
@@ -1198,17 +1201,23 @@ int htp_normalize_parsed_uri(htp_connp_t *connp, htp_uri_t *incomplete, htp_uri_
     if (incomplete->scheme != NULL) {
         // Duplicate and convert to lowercase
         normalized->scheme = bstr_dup_lower(incomplete->scheme);
+        if (normalized->scheme == NULL)
+            return HTP_ERROR;
     }
 
     // Username
     if (incomplete->username != NULL) {
         normalized->username = bstr_strdup(incomplete->username);
+        if (normalized->username == NULL)
+            return HTP_ERROR;
         htp_uriencoding_normalize_inplace(normalized->username);
     }
 
     // Password
     if (incomplete->password != NULL) {
         normalized->password = bstr_strdup(incomplete->password);
+        if (normalized->password == NULL)
+            return HTP_ERROR;
         htp_uriencoding_normalize_inplace(normalized->password);
     }
 
@@ -1217,6 +1226,8 @@ int htp_normalize_parsed_uri(htp_connp_t *connp, htp_uri_t *incomplete, htp_uri_
         // We know that incomplete->hostname does not contain
         // port information, so no need to check for it here
         normalized->hostname = bstr_strdup(incomplete->hostname);
+        if (normalized->hostname == NULL)
+            return HTP_ERROR;
         htp_uriencoding_normalize_inplace(normalized->hostname);
         htp_normalize_hostname_inplace(normalized->hostname);
     }
@@ -1250,6 +1261,8 @@ int htp_normalize_parsed_uri(htp_connp_t *connp, htp_uri_t *incomplete, htp_uri_
 
             // RFC normalization
             htp_normalize_uri_path_inplace(normalized->path);
+        } else {
+            return HTP_ERROR;
         }
     }
 
@@ -1258,11 +1271,15 @@ int htp_normalize_parsed_uri(htp_connp_t *connp, htp_uri_t *incomplete, htp_uri_
         // We cannot URL-decode the query string here; it needs to be
         // parsed into individual key-value pairs first.
         normalized->query = bstr_strdup(incomplete->query);
+        if (normalized->query == NULL)
+            return HTP_ERROR;
     }
 
     // Fragment
     if (incomplete->fragment != NULL) {
         normalized->fragment = bstr_strdup(incomplete->fragment);
+        if (normalized->fragment == NULL)
+            return HTP_ERROR;
         htp_uriencoding_normalize_inplace(normalized->fragment);
     }
 
@@ -1277,6 +1294,8 @@ int htp_normalize_parsed_uri(htp_connp_t *connp, htp_uri_t *incomplete, htp_uri_
  * @return normalized hostnanme
  */
 bstr *htp_normalize_hostname_inplace(bstr *hostname) {
+    if (hostname == NULL)
+        return NULL;
     bstr_tolowercase(hostname);
 
     char *data = bstr_ptr(hostname);
@@ -1301,6 +1320,8 @@ bstr *htp_normalize_hostname_inplace(bstr *hostname) {
  * @param hostname
  */
 void htp_replace_hostname(htp_connp_t *connp, htp_uri_t *parsed_uri, bstr *hostname) {
+    if (hostname == NULL)
+        return;
     int colon = bstr_chr(hostname, ':');
     if (colon == -1) {
         // Hostname alone
@@ -1355,6 +1376,7 @@ int htp_is_uri_unreserved(unsigned char c) {
  * @param s
  */
 void htp_uriencoding_normalize_inplace(bstr *s) {
+    if (s == NULL) return;
     unsigned char *data = (unsigned char *) bstr_ptr(s);
     size_t len = bstr_len(s);
 
@@ -1481,6 +1503,7 @@ int htp_prenormalize_uri_path_inplace(bstr *s, int *flags, int case_insensitive,
  * @param s
  */
 void htp_normalize_uri_path_inplace(bstr *s) {
+    if (s == NULL) return;
     char *data = bstr_ptr(s);
     size_t len = bstr_len(s);