struct NetGetJoinableOUs *r)
{
#ifdef HAVE_ADS
+ TALLOC_CTX *tmp_ctx = talloc_stackframe();
+ WERROR ret;
NTSTATUS status;
ADS_STATUS ads_status;
ADS_STRUCT *ads = NULL;
priv = talloc_get_type_abort(ctx->private_data,
struct libnetapi_private_ctx);
- status = dsgetdcname(ctx, priv->msg_ctx, r->in.domain,
+ status = dsgetdcname(tmp_ctx, priv->msg_ctx, r->in.domain,
NULL, NULL, flags, &info);
if (!NT_STATUS_IS_OK(status)) {
libnetapi_set_error_string(ctx, "%s",
get_friendly_nt_error_msg(status));
- return ntstatus_to_werror(status);
+ ret = ntstatus_to_werror(status);
+ goto out;
}
dc = strip_hostname(info->dc_unc);
dc,
ADS_SASL_PLAIN);
if (!ads) {
- return WERR_GEN_FAILURE;
+ ret = WERR_GEN_FAILURE;
+ goto out;
}
SAFE_FREE(ads->auth.user_name);
ads_status = ads_connect_user_creds(ads);
if (!ADS_ERR_OK(ads_status)) {
ads_destroy(&ads);
- return WERR_NERR_DEFAULTJOINREQUIRED;
+ ret = WERR_NERR_DEFAULTJOINREQUIRED;
+ goto out;
}
ads_status = ads_get_joinable_ous(ads, ctx, &p, &s);
if (!ADS_ERR_OK(ads_status)) {
ads_destroy(&ads);
- return WERR_NERR_DEFAULTJOINREQUIRED;
+ ret = WERR_NERR_DEFAULTJOINREQUIRED;
+ goto out;
}
*r->out.ous = discard_const_p(const char *, p);
*r->out.ou_count = s;
ads_destroy(&ads);
- return WERR_OK;
+
+ ret = WERR_OK;
+out:
+ TALLOC_FREE(tmp_ctx);
+
+ return ret;
#else
return WERR_NOT_SUPPORTED;
#endif