extern struct winbindd_methods msrpc_methods;
-static bool reconnect_need_retry(NTSTATUS status)
+static bool reconnect_need_retry(NTSTATUS status,
+ struct winbindd_domain *domain)
{
if (NT_STATUS_IS_OK(status)) {
return false;
return false;
}
+ if (NT_STATUS_EQUAL(status, NT_STATUS_IO_DEVICE_ERROR)) {
+ /*
+ * RPC call sent on expired session, needs
+ * reauthentication.
+ */
+ invalidate_cm_connection(domain);
+ }
+
return true;
}
result = msrpc_methods.query_user_list(domain, mem_ctx,
num_entries, info);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.query_user_list(domain, mem_ctx,
num_entries, info);
return result;
result = msrpc_methods.enum_dom_groups(domain, mem_ctx,
num_entries, info);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.enum_dom_groups(domain, mem_ctx,
num_entries, info);
return result;
result = msrpc_methods.enum_local_groups(domain, mem_ctx,
num_entries, info);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.enum_local_groups(domain, mem_ctx,
num_entries, info);
result = msrpc_methods.name_to_sid(domain, mem_ctx, domain_name, name,
flags, sid, type);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.name_to_sid(domain, mem_ctx,
domain_name, name, flags,
sid, type);
result = msrpc_methods.sid_to_name(domain, mem_ctx, sid,
domain_name, name, type);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.sid_to_name(domain, mem_ctx, sid,
domain_name, name, type);
result = msrpc_methods.rids_to_names(domain, mem_ctx, sid,
rids, num_rids,
domain_name, names, types);
- if (reconnect_need_retry(result)) {
+ if (reconnect_need_retry(result, domain)) {
result = msrpc_methods.rids_to_names(domain, mem_ctx, sid,
rids, num_rids,
domain_name, names,
result = msrpc_methods.query_user(domain, mem_ctx, user_sid,
user_info);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.query_user(domain, mem_ctx, user_sid,
user_info);
user_sid, num_groups,
user_gids);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.lookup_usergroups(domain, mem_ctx,
user_sid, num_groups,
user_gids);
num_aliases,
alias_rids);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.lookup_useraliases(domain, mem_ctx,
num_sids, sids,
num_aliases,
sid_mem, names,
name_types);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.lookup_groupmem(domain, mem_ctx,
group_sid, type,
num_names,
result = msrpc_methods.sequence_number(domain, seq);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.sequence_number(domain, seq);
return result;
result = msrpc_methods.lockout_policy(domain, mem_ctx, policy);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.lockout_policy(domain, mem_ctx, policy);
return result;
result = msrpc_methods.password_policy(domain, mem_ctx, policy);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.password_policy(domain, mem_ctx, policy);
return result;
result = msrpc_methods.trusted_domains(domain, mem_ctx, trusts);
- if (reconnect_need_retry(result))
+ if (reconnect_need_retry(result, domain))
result = msrpc_methods.trusted_domains(domain, mem_ctx,
trusts);