"error ConflictingRecordFound ()\n"
"error EnumerationNotSupported ()\n";
+bool vl_active = false;
+
struct wb_vl_state {
VarlinkService *service;
struct tevent_context *ev_ctx;
}
DBG_DEBUG("GetUserRecord call parameters: service='%s', "
- "userName='%s', uid='%" PRId64 "'\n",
+ "userName='%s', uid='%" PRId64 ", vl_active=%s'\n",
parm_service,
parm_name,
- parm_uid);
+ parm_uid,
+ vl_active ? "1" : "0");
+
+ if (vl_active) {
+ DBG_DEBUG("Varlink service dispatching call, avoid recursion\n");
+ goto fail;
+ }
+
+ /* Flag will be unset by state talloc destructors */
+ vl_active = true;
/*
* The wb_vl_user_* functions will reply theirselves when return
varlink_call_reply_error(call,
WB_VL_REPLY_ERROR_SERVICE_NOT_AVAILABLE,
NULL);
+ vl_active = false;
return 0;
}
}
DBG_DEBUG("GetGroupRecord call parameters: service='%s', "
- "groupName='%s', gid='%" PRId64 "'\n",
+ "groupName='%s', gid='%" PRId64 "', vl_active=%s\n",
parm_service,
parm_name,
- parm_gid);
+ parm_gid,
+ vl_active ? "1" : "0");
+
+ if (vl_active) {
+ DBG_DEBUG("Varlink service dispatching call, avoid recursion\n");
+ goto fail;
+ }
+ /* Flag will be unset by state talloc destructors */
+ vl_active = true;
/*
* The wb_vl_group_* functions will reply theirselves when return
* NT_STATUS_OK
varlink_call_reply_error(call,
WB_VL_REPLY_ERROR_SERVICE_NOT_AVAILABLE,
NULL);
+ vl_active = false;
return 0;
}
}
DBG_DEBUG("GetMemberships call parameters: service='%s', "
- "userName='%s', groupName='%s'\n",
+ "userName='%s', groupName='%s', vl_active=%s\n",
parm_service,
parm_username,
- parm_groupname);
+ parm_groupname,
+ vl_active ? "1" : "0");
+
+ if (vl_active) {
+ DBG_DEBUG("Varlink service dispatching call, avoid recursion\n");
+ goto fail;
+ }
+
+ /* Flag will be unset by state talloc destructors */
+ vl_active = true;
/*
* The wb_vl_membership_* functions will reply theirselves when return
varlink_call_reply_error(call,
WB_VL_REPLY_ERROR_SERVICE_NOT_AVAILABLE,
NULL);
+ vl_active = false;
return 0;
}
#include <tevent.h>
#include <varlink.h>
+extern bool vl_active;
+
#define WB_VL_SERVICE_NAME "org.samba.winbind"
#define WB_VL_REPLY_ERROR_NO_RECORD_FOUND \
s->call = varlink_call_unref(s->call);
}
+ vl_active = false;
+
return 0;
}
struct tevent_req *req = NULL;
NTSTATUS status;
+ s = talloc_zero(mem_ctx, struct group_enum_state);
+ if (s == NULL) {
+ DBG_ERR("No memory\n");
+ vl_active = false;
+ return NT_STATUS_NO_MEMORY;
+ }
+ talloc_set_destructor(s, group_enum_state_destructor);
+
/* Check if enumeration enabled */
if (!lp_winbind_enum_groups()) {
varlink_call_reply_error(
call,
WB_VL_REPLY_ERROR_ENUMERATION_NOT_SUPPORTED,
NULL);
- return NT_STATUS_OK;
+ status = NT_STATUS_OK;
+ goto fail;
}
/* Check more flag is set */
if (!(flags & VARLINK_CALL_MORE)) {
DBG_WARNING("Enum request without more flag set\n");
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- s = talloc_zero(mem_ctx, struct group_enum_state);
- if (s == NULL) {
- DBG_ERR("No memory\n");
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto fail;
}
- talloc_set_destructor(s, group_enum_state_destructor);
s->fake_cli = talloc_zero(s, struct winbindd_cli_state);
if (s->fake_cli == NULL) {
s->call = varlink_call_unref(s->call);
}
+ vl_active = false;
+
return 0;
}
s = talloc_zero(mem_ctx, struct group_by_gid_state);
if (s == NULL) {
DBG_ERR("No memory\n");
+ vl_active = false;
return NT_STATUS_NO_MEMORY;
}
talloc_set_destructor(s, group_by_gid_state_destructor);
s->call = varlink_call_unref(s->call);
}
+ vl_active = false;
+
return 0;
}
s = talloc_zero(mem_ctx, struct group_by_name_state);
if (s == NULL) {
DBG_ERR("No memory\n");
+ vl_active = false;
return NT_STATUS_NO_MEMORY;
}
talloc_set_destructor(s, group_by_name_state_destructor);
s->call = varlink_call_unref(s->call);
}
+ vl_active = false;
+
return 0;
}
s = talloc_zero(mem_ctx, struct group_by_name_gid_state);
if (s == NULL) {
DBG_ERR("No memory\n");
+ vl_active = false;
return NT_STATUS_NO_MEMORY;
}
talloc_set_destructor(s, group_by_name_gid_state_destructor);
s->call = varlink_call_unref(s->call);
}
+ vl_active = false;
+
return 0;
}
struct tevent_req *req = NULL;
NTSTATUS status;
+ s = talloc_zero(mem_ctx, struct membership_enum_state);
+ if (s == NULL) {
+ DBG_ERR("No memory\n");
+ vl_active = false;
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ talloc_set_destructor(s, membership_enum_state_destructor);
/* Check if enumeration enabled */
if (!lp_winbind_enum_groups()) {
varlink_call_reply_error(
call,
WB_VL_REPLY_ERROR_ENUMERATION_NOT_SUPPORTED,
NULL);
- return NT_STATUS_OK;
+ status = NT_STATUS_OK;
+ goto fail;
}
/* Check if group expansion is enabled */
call,
WB_VL_REPLY_ERROR_ENUMERATION_NOT_SUPPORTED,
NULL);
- return NT_STATUS_OK;
+ status = NT_STATUS_OK;
+ goto fail;
}
/* Check more flag is set */
if (!(flags & VARLINK_CALL_MORE)) {
DBG_WARNING("Enum request without more flag set\n");
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- s = talloc_zero(mem_ctx, struct membership_enum_state);
- if (s == NULL) {
- DBG_ERR("No memory\n");
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto fail;
}
- talloc_set_destructor(s, membership_enum_state_destructor);
s->fake_cli = talloc_zero(s, struct winbindd_cli_state);
if (s->fake_cli == NULL) {
s->call = varlink_call_unref(s->call);
}
+ vl_active = false;
+
return 0;
}
struct tevent_req *req = NULL;
NTSTATUS status;
+ s = talloc_zero(mem_ctx, struct memberships_by_user_state);
+ if (s == NULL) {
+ DBG_ERR("No memory\n");
+ vl_active = false;
+ return NT_STATUS_NO_MEMORY;
+ }
+ talloc_set_destructor(s, memberships_by_user_state_destructor);
+
/* Check if group expansion is enabled */
if (!lp_winbind_expand_groups()) {
varlink_call_reply_error(
call,
WB_VL_REPLY_ERROR_ENUMERATION_NOT_SUPPORTED,
NULL);
- return NT_STATUS_OK;
+ status = NT_STATUS_OK;
+ goto fail;
}
/* Check more flag is set */
if (!(flags & VARLINK_CALL_MORE)) {
DBG_WARNING("Request without more flag set\n");
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- s = talloc_zero(mem_ctx, struct memberships_by_user_state);
- if (s == NULL) {
- DBG_ERR("No memory\n");
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto fail;
}
- talloc_set_destructor(s, memberships_by_user_state_destructor);
s->fake_cli = talloc_zero(s, struct winbindd_cli_state);
if (s->fake_cli == NULL) {
s->call = varlink_call_unref(s->call);
}
+ vl_active = false;
+
return 0;
}
struct tevent_req *req = NULL;
NTSTATUS status;
+ s = talloc_zero(mem_ctx, struct memberships_by_group_state);
+ if (s == NULL) {
+ DBG_ERR("No memory\n");
+ vl_active = false;
+ return NT_STATUS_NO_MEMORY;
+ }
+ talloc_set_destructor(s, memberships_by_group_state_destructor);
+
/* Check if group expansion is enabled */
if (!lp_winbind_expand_groups()) {
varlink_call_reply_error(
call,
WB_VL_REPLY_ERROR_ENUMERATION_NOT_SUPPORTED,
NULL);
- return NT_STATUS_OK;
+ status = NT_STATUS_OK;
+ goto fail;
}
/* Check more flag is set */
if (!(flags & VARLINK_CALL_MORE)) {
DBG_WARNING("Request without more flag set\n");
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- s = talloc_zero(mem_ctx, struct memberships_by_group_state);
- if (s == NULL) {
- DBG_ERR("No memory\n");
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto fail;
}
- talloc_set_destructor(s, memberships_by_group_state_destructor);
s->fake_cli = talloc_zero(s, struct winbindd_cli_state);
if (s->fake_cli == NULL) {
s->call = varlink_call_unref(s->call);
}
+ vl_active = false;
+
return 0;
}
struct tevent_req *req = NULL;
NTSTATUS status;
+ s = talloc_zero(mem_ctx, struct membership_check_state);
+ if (s == NULL) {
+ DBG_ERR("No memory\n");
+ vl_active = false;
+ return NT_STATUS_NO_MEMORY;
+ }
+ talloc_set_destructor(s, membership_check_state_destructor);
+
/* Check if group expansion is enabled */
if (!lp_winbind_expand_groups()) {
varlink_call_reply_error(
call,
WB_VL_REPLY_ERROR_ENUMERATION_NOT_SUPPORTED,
NULL);
- return NT_STATUS_OK;
+ status = NT_STATUS_OK;
+ goto fail;
}
/* Check more flag is set */
if (!(flags & VARLINK_CALL_MORE)) {
DBG_WARNING("Request without more flag set\n");
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- s = talloc_zero(mem_ctx, struct membership_check_state);
- if (s == NULL) {
- DBG_ERR("No memory\n");
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto fail;
}
- talloc_set_destructor(s, membership_check_state_destructor);
s->fake_cli = talloc_zero(s, struct winbindd_cli_state);
if (s->fake_cli == NULL) {
s->call = varlink_call_unref(s->call);
}
+ vl_active = 0;
+
return 0;
}
struct tevent_req *req = NULL;
NTSTATUS status;
+ s = talloc_zero(mem_ctx, struct user_enum_state);
+ if (s == NULL) {
+ DBG_ERR("No memory\n");
+ vl_active = 0;
+ return NT_STATUS_NO_MEMORY;
+ }
+ talloc_set_destructor(s, user_enum_state_destructor);
+
/* Check if enumeration enabled */
if (!lp_winbind_enum_users()) {
varlink_call_reply_error(
call,
WB_VL_REPLY_ERROR_ENUMERATION_NOT_SUPPORTED,
NULL);
- return NT_STATUS_OK;
+ status = NT_STATUS_OK;
+ goto fail;
}
/* Check more flag is set */
if (!(flags & VARLINK_CALL_MORE)) {
DBG_WARNING("Enum request without more flag set\n");
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- s = talloc_zero(mem_ctx, struct user_enum_state);
- if (s == NULL) {
- DBG_ERR("No memory\n");
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto fail;
}
- talloc_set_destructor(s, user_enum_state_destructor);
s->fake_cli = talloc_zero(s, struct winbindd_cli_state);
if (s->fake_cli == NULL) {
s->call = varlink_call_unref(s->call);
}
+ vl_active = 0;
+
return 0;
}
s = talloc_zero(mem_ctx, struct user_by_uid_state);
if (s == NULL) {
DBG_ERR("No memory\n");
+ vl_active = 0;
return NT_STATUS_NO_MEMORY;
}
talloc_set_destructor(s, user_by_uid_state_destructor);
s->call = varlink_call_unref(s->call);
}
+ vl_active = 0;
+
return 0;
}
s = talloc_zero(mem_ctx, struct user_by_name_state);
if (s == NULL) {
DBG_ERR("No memory\n");
+ vl_active = 0;
return NT_STATUS_NO_MEMORY;
}
talloc_set_destructor(s, user_by_name_state_destructor);
s->call = varlink_call_unref(s->call);
}
+ vl_active = false;
+
return 0;
}
s = talloc_zero(mem_ctx, struct user_by_name_uid_state);
if (s == NULL) {
DBG_ERR("No memory\n");
+ vl_active = 0;
return NT_STATUS_NO_MEMORY;
}
talloc_set_destructor(s, user_by_name_uid_state_destructor);