A proxy with BE capabilities may define a default-server instance. This
instance is freed when config parser switch to another section. Beside
the server object, <conf.file> is also freed.
This causes a memleak if the default-server configuration is expanded
with keywords triggering dynamic allocations. For example, this is the
case if a cookie name is defined.
To fix this, use srv_free_params() on default-server deletion. This
function is designed to work both for server and default-server. It
ensures that every dynamic elements in it are freed. Only <id> member is
not freed by srv_free_params() : this is expected as it is a static
value for default-server instances.
Note that srv_free_params() is already used when default-server is freed
in deinit_proxy() since the following patch. However, post-parsing
cleanup has been added after it without reusing srv_free_params().
899b547840c340cd129c3831d3858d8d2e5b452a
BUG/MINOR: proxy/server: free default-server on deinit
This should be backported up to 2.8. Prior to it, srv_free_params() does
not exists, so it cannot be picked as is.
/* default proxy specific cleanup */
if (defproxy->defsrv)
- ha_free((char **)&defproxy->defsrv->conf.file);
+ srv_free_params(defproxy->defsrv);
ha_free(&defproxy->defbe.name);
srv_free(&defproxy->defsrv);
*/
if (curproxy->defsrv) {
- ha_free((char **)&curproxy->defsrv->conf.file);
+ srv_free_params(curproxy->defsrv);
srv_free(&curproxy->defsrv);
}
}