The branch, v3-2-test has been updated via 34dd8f32e1b7fe256ab5dfde5ef5bb8abeec121a (commit) via 7fa53911054a39681df3f08d19aad92f60d59e28 (commit) via f8835462f2b88daa687edc79378511ffcb30905d (commit) via 62c876080c1f3afdd143d1f7f66529827b0f2990 (commit) from 565a30ac3208d89de617b28f4553911484033253 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test - Log ----------------------------------------------------------------- commit 34dd8f32e1b7fe256ab5dfde5ef5bb8abeec121a Author: Günther Deschner <[EMAIL PROTECTED]> Date: Fri Mar 28 13:37:25 2008 +0100 Remove unneeded pack_dsdcinfo/unpack_dsdcinfo. Guenther commit 7fa53911054a39681df3f08d19aad92f60d59e28 Author: Günther Deschner <[EMAIL PROTECTED]> Date: Fri Mar 28 13:36:31 2008 +0100 Use NDR for netr_DsRGetDCNameInfo un-/marshalling in dsgetdcname. Guenther commit f8835462f2b88daa687edc79378511ffcb30905d Author: Günther Deschner <[EMAIL PROTECTED]> Date: Fri Mar 28 13:31:40 2008 +0100 Re-run make idl. Guenther commit 62c876080c1f3afdd143d1f7f66529827b0f2990 Author: Günther Deschner <[EMAIL PROTECTED]> Date: Fri Mar 28 13:30:13 2008 +0100 Make netr_DsRGetDCNameInfo public. Guenther ----------------------------------------------------------------------- Summary of changes: source/librpc/gen_ndr/ndr_netlogon.c | 4 +- source/librpc/gen_ndr/ndr_netlogon.h | 2 + source/librpc/gen_ndr/netlogon.h | 2 +- source/librpc/idl/netlogon.idl | 2 +- source/libsmb/dsgetdcname.c | 186 +++++----------------------------- 5 files changed, 32 insertions(+), 164 deletions(-) Changeset truncated at 500 lines: diff --git a/source/librpc/gen_ndr/ndr_netlogon.c b/source/librpc/gen_ndr/ndr_netlogon.c index 86535ca..7f340b6 100644 --- a/source/librpc/gen_ndr/ndr_netlogon.c +++ b/source/librpc/gen_ndr/ndr_netlogon.c @@ -6103,7 +6103,7 @@ _PUBLIC_ void ndr_print_netr_DsR_DcFlags(struct ndr_print *ndr, const char *name ndr->depth--; } -static enum ndr_err_code ndr_push_netr_DsRGetDCNameInfo(struct ndr_push *ndr, int ndr_flags, const struct netr_DsRGetDCNameInfo *r) +_PUBLIC_ enum ndr_err_code ndr_push_netr_DsRGetDCNameInfo(struct ndr_push *ndr, int ndr_flags, const struct netr_DsRGetDCNameInfo *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); @@ -6159,7 +6159,7 @@ static enum ndr_err_code ndr_push_netr_DsRGetDCNameInfo(struct ndr_push *ndr, in return NDR_ERR_SUCCESS; } -static enum ndr_err_code ndr_pull_netr_DsRGetDCNameInfo(struct ndr_pull *ndr, int ndr_flags, struct netr_DsRGetDCNameInfo *r) +_PUBLIC_ enum ndr_err_code ndr_pull_netr_DsRGetDCNameInfo(struct ndr_pull *ndr, int ndr_flags, struct netr_DsRGetDCNameInfo *r) { uint32_t _ptr_dc_unc; TALLOC_CTX *_mem_save_dc_unc_0; diff --git a/source/librpc/gen_ndr/ndr_netlogon.h b/source/librpc/gen_ndr/ndr_netlogon.h index dd9466b..3615e07 100644 --- a/source/librpc/gen_ndr/ndr_netlogon.h +++ b/source/librpc/gen_ndr/ndr_netlogon.h @@ -191,6 +191,8 @@ void ndr_print_netr_Blob(struct ndr_print *ndr, const char *name, const struct n void ndr_print_netr_DsRGetDCName_flags(struct ndr_print *ndr, const char *name, uint32_t r); void ndr_print_netr_DsRGetDCNameInfo_AddressType(struct ndr_print *ndr, const char *name, enum netr_DsRGetDCNameInfo_AddressType r); void ndr_print_netr_DsR_DcFlags(struct ndr_print *ndr, const char *name, uint32_t r); +enum ndr_err_code ndr_push_netr_DsRGetDCNameInfo(struct ndr_push *ndr, int ndr_flags, const struct netr_DsRGetDCNameInfo *r); +enum ndr_err_code ndr_pull_netr_DsRGetDCNameInfo(struct ndr_pull *ndr, int ndr_flags, struct netr_DsRGetDCNameInfo *r); void ndr_print_netr_DsRGetDCNameInfo(struct ndr_print *ndr, const char *name, const struct netr_DsRGetDCNameInfo *r); void ndr_print_netr_BinaryString(struct ndr_print *ndr, const char *name, const struct netr_BinaryString *r); void ndr_print_netr_DomainQuery1(struct ndr_print *ndr, const char *name, const struct netr_DomainQuery1 *r); diff --git a/source/librpc/gen_ndr/netlogon.h b/source/librpc/gen_ndr/netlogon.h index b51c7cb..bcd9f4d 100644 --- a/source/librpc/gen_ndr/netlogon.h +++ b/source/librpc/gen_ndr/netlogon.h @@ -710,7 +710,7 @@ struct netr_DsRGetDCNameInfo { uint32_t dc_flags; const char *dc_site_name;/* [unique,charset(UTF16)] */ const char *client_site_name;/* [unique,charset(UTF16)] */ -}; +}/* [public] */; struct netr_BinaryString { uint16_t length; diff --git a/source/librpc/idl/netlogon.idl b/source/librpc/idl/netlogon.idl index 8f07112..cbf78c7 100644 --- a/source/librpc/idl/netlogon.idl +++ b/source/librpc/idl/netlogon.idl @@ -1009,7 +1009,7 @@ interface netlogon DS_DNS_FOREST = 0x80000000 } netr_DsR_DcFlags; - typedef struct { + typedef [public] struct { [string,charset(UTF16)] uint16 *dc_unc; [string,charset(UTF16)] uint16 *dc_address; netr_DsRGetDCNameInfo_AddressType dc_address_type; diff --git a/source/libsmb/dsgetdcname.c b/source/libsmb/dsgetdcname.c index bc9f4b9..7af4364 100644 --- a/source/libsmb/dsgetdcname.c +++ b/source/libsmb/dsgetdcname.c @@ -107,150 +107,6 @@ void debug_dsdcinfo_flags(int lvl, uint32_t flags) DEBUGADD(lvl,("\n")); } -/********************************************************************* - ********************************************************************/ - -static int pack_dsdcinfo(struct netr_DsRGetDCNameInfo *info, - unsigned char **buf) -{ - unsigned char *buffer = NULL; - int len = 0; - int buflen = 0; - UUID_FLAT guid_flat; - - DEBUG(10,("pack_dsdcinfo: Packing dsdcinfo\n")); - - ZERO_STRUCT(guid_flat); - - if (!GUID_all_zero(&info->domain_guid)) { - smb_uuid_pack(info->domain_guid, &guid_flat); - } - - again: - len = 0; - - if (buflen > 0) { - DEBUG(10,("pack_dsdcinfo: Packing domain %s (%s)\n", - info->domain_name, info->dc_unc)); - } - - len += tdb_pack(buffer+len, buflen-len, "ffdBffdff", - info->dc_unc, - info->dc_address, - info->dc_address_type, - UUID_FLAT_SIZE, guid_flat.info, - info->domain_name, - info->forest_name, - info->dc_flags, - info->dc_site_name, - info->client_site_name); - - if (buflen < len) { - SAFE_FREE(buffer); - if ((buffer = SMB_MALLOC_ARRAY(unsigned char, len)) == NULL ) { - DEBUG(0,("pack_dsdcinfo: failed to alloc buffer!\n")); - buflen = -1; - goto done; - } - buflen = len; - goto again; - } - - *buf = buffer; - - done: - return buflen; -} - -/********************************************************************* - ********************************************************************/ - -static NTSTATUS unpack_dsdcinfo(TALLOC_CTX *mem_ctx, - unsigned char *buf, - int buflen, - struct netr_DsRGetDCNameInfo **info_ret) -{ - int len = 0; - struct netr_DsRGetDCNameInfo *info = NULL; - uint32_t guid_len = 0; - unsigned char *guid_buf = NULL; - UUID_FLAT guid_flat; - - /* forgive me 6 times */ - fstring dc_unc; - fstring dc_address; - fstring domain_name; - fstring forest_name; - fstring dc_site_name; - fstring client_site_name; - - info = TALLOC_ZERO_P(mem_ctx, struct netr_DsRGetDCNameInfo); - NT_STATUS_HAVE_NO_MEMORY(info); - - len += tdb_unpack(buf+len, buflen-len, "ffdBffdff", - &dc_unc, - &dc_address, - &info->dc_address_type, - &guid_len, &guid_buf, - &domain_name, - &forest_name, - &info->dc_flags, - &dc_site_name, - &client_site_name); - if (len == -1) { - DEBUG(5,("unpack_dsdcinfo: Failed to unpack domain\n")); - goto failed; - } - - info->dc_unc = - talloc_strdup(mem_ctx, dc_unc); - info->dc_address = - talloc_strdup(mem_ctx, dc_address); - info->domain_name = - talloc_strdup(mem_ctx, domain_name); - info->forest_name = - talloc_strdup(mem_ctx, forest_name); - info->dc_site_name = - talloc_strdup(mem_ctx, dc_site_name); - info->client_site_name = - talloc_strdup(mem_ctx, client_site_name); - - if (!info->dc_unc || - !info->dc_address || - !info->domain_name || - !info->forest_name || - !info->dc_site_name || - !info->client_site_name) { - goto failed; - } - - if (guid_len > 0) { - struct GUID guid; - - if (guid_len != UUID_FLAT_SIZE) { - goto failed; - } - - memcpy(&guid_flat.info, guid_buf, guid_len); - smb_uuid_unpack(guid_flat, &guid); - - info->domain_guid = guid; - SAFE_FREE(guid_buf); - } - - DEBUG(10,("unpack_dcscinfo: Unpacked domain %s (%s)\n", - info->domain_name, info->dc_unc)); - - *info_ret = info; - - return NT_STATUS_OK; - - failed: - TALLOC_FREE(info); - SAFE_FREE(guid_buf); - return NT_STATUS_NO_MEMORY; -} - /**************************************************************** ****************************************************************/ @@ -298,8 +154,7 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, char *key; bool ret = false; DATA_BLOB blob; - unsigned char *buf = NULL; - int len = 0; + enum ndr_err_code ndr_err; if (!gencache_init()) { return NT_STATUS_INTERNAL_DB_ERROR; @@ -312,14 +167,12 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, expire_time = time(NULL) + DSGETDCNAME_CACHE_TTL; - len = pack_dsdcinfo(info, &buf); - if (len == -1) { - return NT_STATUS_UNSUCCESSFUL; + ndr_err = ndr_push_struct_blob(&blob, mem_ctx, info, + (ndr_push_flags_fn_t)ndr_push_netr_DsRGetDCNameInfo); + 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) { data_blob_free(&blob); return NT_STATUS_LOCK_NOT_GRANTED; @@ -404,12 +257,13 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, struct GUID *domain_guid, uint32_t flags, const char *site_name, - struct netr_DsRGetDCNameInfo **info, + struct netr_DsRGetDCNameInfo **info_p, bool *expired) { char *key; DATA_BLOB blob; - NTSTATUS status; + enum ndr_err_code ndr_err; + struct netr_DsRGetDCNameInfo *info; if (!gencache_init()) { return NT_STATUS_INTERNAL_DB_ERROR; @@ -424,25 +278,37 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, return NT_STATUS_OBJECT_NAME_NOT_FOUND; } - status = unpack_dsdcinfo(mem_ctx, blob.data, blob.length, info); - if (!NT_STATUS_IS_OK(status)) { - data_blob_free(&blob); - return status; + info = TALLOC_ZERO_P(mem_ctx, struct netr_DsRGetDCNameInfo); + if (!info) { + return NT_STATUS_NO_MEMORY; } + ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, info, + (ndr_pull_flags_fn_t)ndr_pull_netr_DsRGetDCNameInfo); + 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 */ - 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")); return NT_STATUS_INVALID_PARAMETER; } 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; } + *info_p = info; + return NT_STATUS_OK; } -- Samba Shared Repository