summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2010-09-10 16:06:24 +0200
committerAndreas Schneider <asn@samba.org>2010-09-10 16:10:46 +0200
commitfc1a5dbffb1330bba0e4deebdf18b812ccc1a823 (patch)
treecfb707a2eb7e8f2eaa2fa050d1d3c6c7735b7f9d
parented2c06f9da0401fb95dcc16b4d3a3bd4f27b09f2 (diff)
downloadsamba-fc1a5dbffb1330bba0e4deebdf18b812ccc1a823.tar.gz
samba-fc1a5dbffb1330bba0e4deebdf18b812ccc1a823.tar.bz2
samba-fc1a5dbffb1330bba0e4deebdf18b812ccc1a823.zip
s3-spoolss: Don't leak memory on the session counter list.
Thanks Günther, please check.
-rw-r--r--source3/include/proto.h1
-rw-r--r--source3/rpc_server/srv_spoolss_nt.c12
-rw-r--r--source3/smbd/server.c9
3 files changed, 21 insertions, 1 deletions
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. */