1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-03 04:22:09 +03:00

Use NDR for netr_DsRGetDCNameInfo un-/marshalling in dsgetdcname.

Guenther
This commit is contained in:
Günther Deschner
2008-03-28 13:36:31 +01:00
parent f8835462f2
commit 7fa5391105

View File

@ -298,8 +298,7 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx,
char *key; char *key;
bool ret = false; bool ret = false;
DATA_BLOB blob; DATA_BLOB blob;
unsigned char *buf = NULL; enum ndr_err_code ndr_err;
int len = 0;
if (!gencache_init()) { if (!gencache_init()) {
return NT_STATUS_INTERNAL_DB_ERROR; return NT_STATUS_INTERNAL_DB_ERROR;
@ -312,14 +311,12 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx,
expire_time = time(NULL) + DSGETDCNAME_CACHE_TTL; expire_time = time(NULL) + DSGETDCNAME_CACHE_TTL;
len = pack_dsdcinfo(info, &buf); ndr_err = ndr_push_struct_blob(&blob, mem_ctx, info,
if (len == -1) { (ndr_push_flags_fn_t)ndr_push_netr_DsRGetDCNameInfo);
return NT_STATUS_UNSUCCESSFUL; if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
return ndr_map_error2ntstatus(ndr_err);
} }
blob = data_blob(buf, len);
SAFE_FREE(buf);
if (gencache_lock_entry(key) != 0) { if (gencache_lock_entry(key) != 0) {
data_blob_free(&blob); data_blob_free(&blob);
return NT_STATUS_LOCK_NOT_GRANTED; return NT_STATUS_LOCK_NOT_GRANTED;
@ -404,12 +401,13 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx,
struct GUID *domain_guid, struct GUID *domain_guid,
uint32_t flags, uint32_t flags,
const char *site_name, const char *site_name,
struct netr_DsRGetDCNameInfo **info, struct netr_DsRGetDCNameInfo **info_p,
bool *expired) bool *expired)
{ {
char *key; char *key;
DATA_BLOB blob; DATA_BLOB blob;
NTSTATUS status; enum ndr_err_code ndr_err;
struct netr_DsRGetDCNameInfo *info;
if (!gencache_init()) { if (!gencache_init()) {
return NT_STATUS_INTERNAL_DB_ERROR; return NT_STATUS_INTERNAL_DB_ERROR;
@ -424,25 +422,37 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx,
return NT_STATUS_OBJECT_NAME_NOT_FOUND; return NT_STATUS_OBJECT_NAME_NOT_FOUND;
} }
status = unpack_dsdcinfo(mem_ctx, blob.data, blob.length, info); info = TALLOC_ZERO_P(mem_ctx, struct netr_DsRGetDCNameInfo);
if (!NT_STATUS_IS_OK(status)) { if (!info) {
data_blob_free(&blob); return NT_STATUS_NO_MEMORY;
return status;
} }
ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, info,
(ndr_pull_flags_fn_t)ndr_pull_netr_DsRGetDCNameInfo);
data_blob_free(&blob); data_blob_free(&blob);
if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
dsgetdcname_cache_delete(mem_ctx, domain_name);
return ndr_map_error2ntstatus(ndr_err);
}
if (DEBUGLEVEL >= 10) {
NDR_PRINT_DEBUG(netr_DsRGetDCNameInfo, info);
}
/* check flags */ /* check flags */
if (!check_cldap_reply_required_flags((*info)->dc_flags, flags)) { if (!check_cldap_reply_required_flags(info->dc_flags, flags)) {
DEBUG(10,("invalid flags\n")); DEBUG(10,("invalid flags\n"));
return NT_STATUS_INVALID_PARAMETER; return NT_STATUS_INVALID_PARAMETER;
} }
if ((flags & DS_IP_REQUIRED) && if ((flags & DS_IP_REQUIRED) &&
((*info)->dc_address_type != DS_ADDRESS_TYPE_INET)) { (info->dc_address_type != DS_ADDRESS_TYPE_INET)) {
return NT_STATUS_INVALID_PARAMETER_MIX; return NT_STATUS_INVALID_PARAMETER_MIX;
} }
*info_p = info;
return NT_STATUS_OK; return NT_STATUS_OK;
} }