From fc1a5dbffb1330bba0e4deebdf18b812ccc1a823 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 10 Sep 2010 16:06:24 +0200 Subject: s3-spoolss: Don't leak memory on the session counter list. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks Günther, please check. --- source3/include/proto.h | 1 + source3/rpc_server/srv_spoolss_nt.c | 12 ++++++++++++ source3/smbd/server.c | 9 ++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/source3/include/proto.h b/source3/include/proto.h index 0b54932135..5e2e0bff3d 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -4386,6 +4386,7 @@ NTSTATUS np_read_recv(struct tevent_req *req, ssize_t *nread, bool *is_data_outstanding); /* The following definitions come from rpc_server/srv_spoolss_nt.c */ +void srv_spoolss_cleanup(void); void do_drv_upgrade_printer(struct messaging_context *msg, void *private_data, diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index 573faaf979..b5e2ddbdc6 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -1462,6 +1462,18 @@ static bool srv_spoolss_drv_upgrade_printer(const char *drivername, return true; } +void srv_spoolss_cleanup(void) +{ + struct printer_session_counter *session_counter; + + for (session_counter = counter_list; + session_counter != NULL; + session_counter = counter_list) { + DLIST_REMOVE(counter_list, session_counter); + TALLOC_FREE(session_counter); + } +} + /********************************************************************** callback to receive a MSG_PRINTER_DRVUPGRADE message and interate over all printers, upgrading ones as necessary diff --git a/source3/smbd/server.c b/source3/smbd/server.c index c9ae742b99..247cbb84d5 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -807,6 +807,13 @@ static bool spoolss_init_cb(void *ptr) return nt_printing_tdb_migrate(msg_ctx); } +static bool spoolss_shutdown_cb(void *ptr) +{ + srv_spoolss_cleanup(); + + return true; +} + /**************************************************************************** main program. ****************************************************************************/ @@ -1165,7 +1172,7 @@ extern void build_options(bool screen); * can't register it twice. */ spoolss_cb.init = spoolss_init_cb; - spoolss_cb.shutdown = NULL; + spoolss_cb.shutdown = spoolss_shutdown_cb; spoolss_cb.private_data = smbd_server_conn->msg_ctx; /* Spoolss depends on a winreg pipe, so start it first. */ -- cgit