]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #752 in SNORT/snort3 from appid_service_plugin_fail_bug to master
authorRuss Combs (rucombs) <rucombs@cisco.com>
Fri, 16 Dec 2016 15:14:08 +0000 (10:14 -0500)
committerRuss Combs (rucombs) <rucombs@cisco.com>
Fri, 16 Dec 2016 15:14:08 +0000 (10:14 -0500)
Squashed commit of the following:

commit e96d17d582906a36eacaad7ba4b8afea3c56fb11
Author: davis mcpherson <davmcphe.cisco.com>
Date:   Thu Dec 15 14:30:12 2016 -0500

    this fixes the service plugin dispatch bug when a service failed and was deleted from the candidate list

src/network_inspectors/appid/service_plugins/service_base.cc

index 5b382f66762e2d6890f22120f6e64af197cd1db3..0b98db2e2a63ec330671429ffad4cb863947a143 100644 (file)
@@ -1850,6 +1850,8 @@ int AppIdDiscoverService(Packet* p, const int dir, AppIdSession* asd)
         ret = SERVICE_INPROCESS;
         SF_LNODE* iter;
         service = (RNAServiceElement*)sflist_first(asd->candidate_service_list, &iter);
+        const RNAServiceElement* failed_svc[MAX_CANDIDATE_SERVICES];
+        unsigned num_failed = 0;
         while (service)
         {
             int result;
@@ -1871,12 +1873,20 @@ int AppIdDiscoverService(Packet* p, const int dir, AppIdSession* asd)
                 break;    /* done */
             }
             else if (result != SERVICE_INPROCESS)    /* fail */
-            {
-                sflist_remove_node(asd->candidate_service_list, iter);
-                service = (RNAServiceElement*)sflist_first(asd->candidate_service_list, &iter);
-            }
-            else
+               failed_svc[num_failed++] = service;
+
+            service = (RNAServiceElement*)sflist_next(&iter);
+        }
+
+        for(unsigned i = 0; i < num_failed; i++)
+        {
+            SF_LNODE* iter;
+            RNAServiceElement* service = (RNAServiceElement*)sflist_first(asd->candidate_service_list, &iter);
+            assert(service);
+
+            while( service != failed_svc[i] )
                 service = (RNAServiceElement*)sflist_next(&iter);
+            sflist_remove_node(asd->candidate_service_list, iter);
         }
 
         /* If we tried everything and found nothing, then fail. */