summaryrefslogtreecommitdiff
path: root/source4/auth/system_session.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/auth/system_session.c')
-rw-r--r--source4/auth/system_session.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/source4/auth/system_session.c b/source4/auth/system_session.c
index 8e22bd820e..765f53a613 100644
--- a/source4/auth/system_session.c
+++ b/source4/auth/system_session.c
@@ -146,22 +146,37 @@ static NTSTATUS generate_session_info(TALLOC_CTX *mem_ctx,
}
+/*
+ prevent the static system session being freed
+ */
+static int system_session_destructor(struct auth_session_info *info)
+{
+ return -1;
+}
/* Create a security token for a session SYSTEM (the most
* trusted/prvilaged account), including the local machine account as
* the off-host credentials
*/
-_PUBLIC_ struct auth_session_info *system_session(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx)
+_PUBLIC_ struct auth_session_info *system_session(struct loadparm_context *lp_ctx)
{
+ static struct auth_session_info *static_session;
NTSTATUS nt_status;
- struct auth_session_info *session_info = NULL;
- nt_status = auth_system_session_info(mem_ctx,
+
+ if (static_session) {
+ return static_session;
+ }
+
+ nt_status = auth_system_session_info(talloc_autofree_context(),
lp_ctx,
- &session_info);
+ &static_session);
if (!NT_STATUS_IS_OK(nt_status)) {
+ talloc_free(static_session);
+ static_session = NULL;
return NULL;
}
- return session_info;
+ talloc_set_destructor(static_session, system_session_destructor);
+ return static_session;
}
static NTSTATUS _auth_system_session_info(TALLOC_CTX *parent_ctx,