]> granicus.if.org Git - pgbouncer/commitdiff
Fix potential use of old connections after config change
authorMarko Kreen <markokr@gmail.com>
Fri, 22 May 2009 14:39:09 +0000 (14:39 +0000)
committerMarko Kreen <markokr@gmail.com>
Fri, 22 May 2009 14:39:09 +0000 (14:39 +0000)
Despite detecting and tagging them for close on config change,
the closing happened only in long-term maintenance.  So there
was time where they could still be reused by clients.

Fix this by strict check in find_server()

src/objects.c

index d1b75c5b2d6e5f17dbae5a2bc9b0be831d7cd066..72120309c10c44006f77be6e6df998470564a309 100644 (file)
@@ -500,9 +500,14 @@ bool find_server(PgSocket *client)
        } else {
                while (1) {
                        server = first_socket(&pool->idle_server_list);
-                       if (!server || server->ready)
+                       if (!server)
+                               break;
+                       else if (server->close_needed)
+                               disconnect_server(server, true, "obsolete connection");
+                       else if (!server->ready)
+                               disconnect_server(server, true, "idle server got dirty");
+                       else
                                break;
-                       disconnect_server(server, true, "idle server got dirty");
                }
        }
        Assert(!server || server->state == SV_IDLE);