]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: Don't assert-crash if client_limit < service_count.
authorTimo Sirainen <tss@iki.fi>
Thu, 18 Mar 2010 02:28:32 +0000 (04:28 +0200)
committerTimo Sirainen <tss@iki.fi>
Thu, 18 Mar 2010 02:28:32 +0000 (04:28 +0200)
--HG--
branch : HEAD

src/lib-master/master-service.c

index 6277cd863c63b5e361d087164681a61f119983d1..43ed8e89a0f5b84a046952bf6a64aab510312bb4 100644 (file)
@@ -541,33 +541,34 @@ void master_service_client_connection_destroyed(struct master_service *service)
        master_service_io_listeners_add(service);
 
        i_assert(service->total_available_count > 0);
+       i_assert(service->service_count_left > 0);
+
+       if (service->service_count_left == service->total_available_count) {
+               service->total_available_count--;
+                service->service_count_left--;
+       } else {
+               if (service->service_count_left != (unsigned int)-1)
+                       service->service_count_left--;
 
-       if (service->service_count_left != service->total_available_count) {
-               i_assert(service->service_count_left == (unsigned int)-1);
                i_assert(service->master_status.available_count <
                         service->total_available_count);
                service->master_status.available_count++;
-               master_status_update(service);
-       } else {
-               /* we have only limited amount of service requests left */
-               i_assert(service->service_count_left > 0);
-                service->service_count_left--;
-               service->total_available_count--;
-
-               if (service->service_count_left == 0) {
-                       i_assert(service->master_status.available_count ==
-                                service->total_available_count);
-                       master_service_stop(service);
-               }
        }
 
-       if ((service->io_status_error == NULL || service->listeners == NULL) &&
-           service->master_status.available_count ==
-           service->total_available_count) {
+       if (service->service_count_left == 0) {
+               i_assert(service->master_status.available_count ==
+                        service->total_available_count);
+               master_service_stop(service);
+       } else if ((service->io_status_error == NULL ||
+                   service->listeners == NULL) &&
+                  service->master_status.available_count ==
+                  service->total_available_count) {
                /* we've finished handling all clients, and
                   a) master has closed the connection
                   b) there are no listeners (std-client?) */
                master_service_stop(service);
+       } else {
+               master_status_update(service);
        }
 }