static void SMBC_module_terminate(void) { secrets_shutdown(); gfree_all(); SMBC_initialized = false; }
NET_API_STATUS libnetapi_free(struct libnetapi_ctx *ctx) { if (!ctx) { return NET_API_STATUS_SUCCESS; } libnetapi_samr_free(ctx); libnetapi_shutdown_cm(ctx); if (ctx->krb5_cc_env) { char *env = getenv(KRB5_ENV_CCNAME); if (env && (strequal(ctx->krb5_cc_env, env))) { unsetenv(KRB5_ENV_CCNAME); } } gfree_names(); gfree_loadparm(); gfree_case_tables(); gfree_charcnv(); gfree_interfaces(); gencache_shutdown(); secrets_shutdown(); TALLOC_FREE(ctx); TALLOC_FREE(frame); gfree_debugsyms(); return NET_API_STATUS_SUCCESS; }
static void SMBC_module_terminate(void) { TALLOC_CTX *frame = talloc_stackframe(); secrets_shutdown(); gfree_all(); SMBC_initialized = false; TALLOC_FREE(frame); }
NET_API_STATUS libnetapi_free(struct libnetapi_ctx *ctx) { TALLOC_CTX *frame; if (!ctx) { return NET_API_STATUS_SUCCESS; } frame = talloc_stackframe(); libnetapi_samr_free(ctx); libnetapi_shutdown_cm(ctx); if (ctx->krb5_cc_env) { char *env = getenv(KRB5_ENV_CCNAME); if (env && (strequal(ctx->krb5_cc_env, env))) { unsetenv(KRB5_ENV_CCNAME); } } gfree_names(); gfree_loadparm(); gfree_charcnv(); gfree_interfaces(); secrets_shutdown(); if (ctx == stat_ctx) { stat_ctx = NULL; } TALLOC_FREE(ctx); gfree_debugsyms(); talloc_free(frame); return NET_API_STATUS_SUCCESS; }
/* * Free a context * * Returns 0 on success. Otherwise returns 1, the SMBCCTX is _not_ freed * and thus you'll be leaking memory if not handled properly. * */ int smbc_free_context(SMBCCTX *context, int shutdown_ctx) { if (!context) { errno = EBADF; return 1; } if (shutdown_ctx) { SMBCFILE * f; DEBUG(1,("Performing aggressive shutdown.\n")); f = context->internal->files; while (f) { smbc_getFunctionClose(context)(context, f); f = f->next; } context->internal->files = NULL; /* First try to remove the servers the nice way. */ if (smbc_getFunctionPurgeCachedServers(context)(context)) { SMBCSRV * s; SMBCSRV * next; DEBUG(1, ("Could not purge all servers, " "Nice way shutdown failed.\n")); s = context->internal->servers; while (s) { DEBUG(1, ("Forced shutdown: %p (fd=%d)\n", s, s->cli->fd)); cli_shutdown(s->cli); smbc_getFunctionRemoveCachedServer(context)(context, s); next = s->next; DLIST_REMOVE(context->internal->servers, s); SAFE_FREE(s); s = next; } context->internal->servers = NULL; } } else { /* This is the polite way */ if (smbc_getFunctionPurgeCachedServers(context)(context)) { DEBUG(1, ("Could not purge all servers, " "free_context failed.\n")); errno = EBUSY; return 1; } if (context->internal->servers) { DEBUG(1, ("Active servers in context, " "free_context failed.\n")); errno = EBUSY; return 1; } if (context->internal->files) { DEBUG(1, ("Active files in context, " "free_context failed.\n")); errno = EBUSY; return 1; } } /* Things we have to clean up */ free(smbc_getWorkgroup(context)); smbc_setWorkgroup(context, NULL); free(smbc_getNetbiosName(context)); smbc_setNetbiosName(context, NULL); free(smbc_getUser(context)); smbc_setUser(context, NULL); DEBUG(3, ("Context %p successfully freed\n", context)); SAFE_FREE(context->internal); SAFE_FREE(context); if (initialized_ctx_count) { initialized_ctx_count--; } if (initialized_ctx_count == 0 && SMBC_initialized) { gencache_shutdown(); secrets_shutdown(); gfree_all(); SMBC_initialized = false; } return 0; }