From de5d41ab7b2b318b48d487a001a56fd790f29cab Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 14 Oct 2008 15:16:40 +0200 Subject: Remove unused header file. --- source3/include/ndr.h | 1 - 1 file changed, 1 deletion(-) delete mode 100644 source3/include/ndr.h diff --git a/source3/include/ndr.h b/source3/include/ndr.h deleted file mode 100644 index a416866ef2..0000000000 --- a/source3/include/ndr.h +++ /dev/null @@ -1 +0,0 @@ -/* dummy file to deal with pidl autogenerated ndr files */ -- cgit From d8a6f1082ca11f0d16e8eec677e3069fb07e834d Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 14 Oct 2008 15:27:27 +0200 Subject: Remove unused structures. --- source4/lib/samba3/config.mk | 2 - source4/lib/samba3/samba3.h | 190 +------------------------------------------ 2 files changed, 4 insertions(+), 188 deletions(-) diff --git a/source4/lib/samba3/config.mk b/source4/lib/samba3/config.mk index e089149393..365347fe21 100644 --- a/source4/lib/samba3/config.mk +++ b/source4/lib/samba3/config.mk @@ -6,5 +6,3 @@ PRIVATE_DEPENDENCIES = CHARSET LIBSAMBA-UTIL ################################################ SMBPASSWD_OBJ_FILES = $(libsrcdir)/samba3/smbpasswd.o - -$(eval $(call proto_header_template,$(libsrcdir)/samba3/samba3_smbpasswd_proto.h,$(SMBPASSWD_OBJ_FILES:.o=.c))) diff --git a/source4/lib/samba3/samba3.h b/source4/lib/samba3/samba3.h index aea87dac14..1a0ce04143 100644 --- a/source4/lib/samba3/samba3.h +++ b/source4/lib/samba3/samba3.h @@ -24,191 +24,9 @@ #include "librpc/gen_ndr/samr.h" #include "param/param.h" -struct samba3_samaccount { - uint32_t logon_time, - logoff_time, - kickoff_time, - bad_password_time, - pass_last_set_time, - pass_can_change_time, - pass_must_change_time; - char *username; - char *domain; - char *nt_username; - char *dir_drive; - char *unknown_str; - char *munged_dial; - char *fullname; - char *homedir; - char *logon_script; - char *profile_path; - char *acct_desc; - char *workstations; - uint32_t user_rid, group_rid, hours_len, unknown_6; - uint16_t acct_ctrl, logon_divs; - uint16_t bad_password_count, logon_count; - struct samr_Password lm_pw, nt_pw; - uint8_t *nt_pw_hist_ptr; - uint8_t *hours; -}; - -struct samba3_groupmapping { - gid_t gid; - struct dom_sid *sid; - int sid_name_use; - const char *nt_name; - const char *comment; -}; - -struct samba3_alias { - struct dom_sid *sid; - uint32_t member_count; - struct dom_sid **members; -}; - -struct samba3_groupdb { - uint32_t groupmap_count; - struct samba3_groupmapping *groupmappings; - - uint32_t alias_count; - struct samba3_alias *aliases; -}; - -struct samba3_idmap_mapping -{ - enum { IDMAP_GROUP, IDMAP_USER } type; - uint32_t unix_id; - struct dom_sid *sid; -}; - -struct samba3_idmapdb -{ - /* High water marks */ - uint32_t user_hwm; - uint32_t group_hwm; - - uint32_t mapping_count; - struct samba3_idmap_mapping *mappings; -}; - -struct samba3_winsdb_entry -{ - char *name; - int nb_flags; - int type; - time_t ttl; - uint32_t ip_count; - struct in_addr *ips; -}; - -struct samba3_policy -{ - uint32_t min_password_length; - uint32_t password_history; - uint32_t user_must_logon_to_change_password; - uint32_t maximum_password_age; - uint32_t minimum_password_age; - uint32_t lockout_duration; - uint32_t reset_count_minutes; - uint32_t bad_lockout_minutes; - uint32_t disconnect_time; - uint32_t refuse_machine_password_change; -}; - -struct samba3_regval { - char *name; - uint16_t type; - DATA_BLOB data; -}; - -struct samba3_regkey { - char *name; - - uint32_t value_count; - struct samba3_regval *values; - - uint32_t subkey_count; - char **subkeys; -}; - -struct samba3_regdb -{ - uint32_t key_count; - struct samba3_regkey *keys; -}; - -struct samba3_secrets -{ - struct cli_credentials *ipc_cred; - - uint32_t ldappw_count; - struct samba3_ldappw - { - char *dn; - char *password; - } *ldappws; - - uint32_t domain_count; - struct samba3_domainsecrets - { - char *name; - struct dom_sid sid; - struct GUID guid; - char *plaintext_pw; - time_t last_change_time; - struct { - uint8_t hash[16]; - time_t mod_time; - } hash_pw; - int sec_channel_type; - } *domains; - - uint32_t trusted_domain_count; - struct samba3_trusted_dom_pass { - uint32_t uni_name_len; - const char *uni_name[32]; /* unicode domain name */ - const char *pass; /* trust relationship's password */ - time_t mod_time; - struct dom_sid domain_sid; /* remote domain's sid */ - } *trusted_domains; - - uint32_t afs_keyfile_count; - - struct samba3_afs_keyfile { - uint32_t nkeys; - struct { - uint32_t kvno; - char key[8]; - } entry[8]; - char *cell; - } *afs_keyfiles; -}; - -struct samba3_share_info { - char *name; - struct security_descriptor secdesc; -}; - -struct samba3 -{ - struct param_context *configuration; - - uint32_t winsdb_count; - struct samba3_winsdb_entry *winsdb_entries; - - uint32_t samaccount_count; - struct samba3_samaccount *samaccounts; - - uint32_t share_count; - struct samba3_share_info *shares; - - struct samba3_secrets secrets; - struct samba3_groupdb group; - struct samba3_idmapdb idmap; - struct samba3_policy policy; - struct samba3_regdb registry; -}; - -#include "lib/samba3/samba3_smbpasswd_proto.h" +struct samr_Password *smbpasswd_gethexpwd(TALLOC_CTX *mem_ctx, const char *p); +char *smbpasswd_sethexpwd(TALLOC_CTX *mem_ctx, struct samr_Password *pwd, uint16_t acb_info); +uint16_t smbpasswd_decode_acb_info(const char *p); +char *smbpasswd_encode_acb_info(TALLOC_CTX *mem_ctx, uint16_t acb_info); #endif /* _SAMBA3_H */ -- cgit From a9d8ed748e06b6c8d30aa554052ab3b63f4e93ea Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 14 Oct 2008 15:43:04 +0200 Subject: Sync with Samba 3. --- source4/cldap_server/netlogon.c | 2 +- source4/librpc/idl/lsa.idl | 17 ++++++++- source4/librpc/idl/nbt.idl | 81 ++++++++++++++++++++--------------------- source4/torture/ldap/cldap.c | 8 ++-- 4 files changed, 61 insertions(+), 47 deletions(-) diff --git a/source4/cldap_server/netlogon.c b/source4/cldap_server/netlogon.c index 1cb0d50d02..cc2c69b27e 100644 --- a/source4/cldap_server/netlogon.c +++ b/source4/cldap_server/netlogon.c @@ -349,7 +349,7 @@ NTSTATUS fill_netlogon_samlogon_response(struct ldb_context *sam_ctx, if (version & NETLOGON_NT_VERSION_5EX_WITH_IP) { /* Clearly this needs to be fixed up for IPv6 */ extra_flags = NETLOGON_NT_VERSION_5EX_WITH_IP; - netlogon->data.nt5_ex.sockaddr.sa_family = 2; + netlogon->data.nt5_ex.sockaddr.sockaddr_family = 2; netlogon->data.nt5_ex.sockaddr.pdc_ip = pdc_ip; netlogon->data.nt5_ex.sockaddr.remaining = data_blob_talloc_zero(mem_ctx, 8); } diff --git a/source4/librpc/idl/lsa.idl b/source4/librpc/idl/lsa.idl index 4dce6d6d1e..341489ed23 100644 --- a/source4/librpc/idl/lsa.idl +++ b/source4/librpc/idl/lsa.idl @@ -124,12 +124,27 @@ import "misc.idl", "security.idl"; lsa_QosInfo *sec_qos; } lsa_ObjectAttribute; + typedef [public,bitmap32bit] bitmap { + LSA_POLICY_VIEW_LOCAL_INFORMATION = 0x00000001, + LSA_POLICY_VIEW_AUDIT_INFORMATION = 0x00000002, + LSA_POLICY_GET_PRIVATE_INFORMATION = 0x00000004, + LSA_POLICY_TRUST_ADMIN = 0x00000008, + LSA_POLICY_CREATE_ACCOUNT = 0x00000010, + LSA_POLICY_CREATE_SECRET = 0x00000020, + LSA_POLICY_CREATE_PRIVILEGE = 0x00000040, + LSA_POLICY_SET_DEFAULT_QUOTA_LIMITS = 0x00000080, + LSA_POLICY_SET_AUDIT_REQUIREMENTS = 0x00000100, + LSA_POLICY_AUDIT_LOG_ADMIN = 0x00000200, + LSA_POLICY_SERVER_ADMIN = 0x00000400, + LSA_POLICY_LOOKUP_NAMES = 0x00000800 + } lsa_PolicyAccessMask; + /* notice the screwup with the system_name - thats why MS created OpenPolicy2 */ [public] NTSTATUS lsa_OpenPolicy ( [in,unique] uint16 *system_name, [in] lsa_ObjectAttribute *attr, - [in] uint32 access_mask, + [in] lsa_PolicyAccessMask access_mask, [out] policy_handle *handle ); diff --git a/source4/librpc/idl/nbt.idl b/source4/librpc/idl/nbt.idl index 38a2b9596a..b001b0a500 100644 --- a/source4/librpc/idl/nbt.idl +++ b/source4/librpc/idl/nbt.idl @@ -291,7 +291,7 @@ interface nbt [switch_is(smb_command)] smb_body body; } dgram_smb_packet; - const uint32 DGRAM_SMB = 0xff534d42; /* 0xffSMB */ + const uint32 DGRAM_SMB = 0xff534d42; /* 0xffSMB */ typedef [nodiscriminant] union { [case(DGRAM_SMB)] dgram_smb_packet smb; @@ -334,58 +334,57 @@ interface nbt /****************************************** * \MAILSLOT\NET\NETLOGON mailslot requests - * and - * \MAILSLOT\NET\NTLOGON mailslot requests + * and + * \MAILSLOT\NET\NTLOGON mailslot requests */ typedef [public,gensize] struct { - uint32 sa_family; + uint32 sockaddr_family; [flag(NDR_BIG_ENDIAN)] ipv4address pdc_ip; [flag(NDR_REMAINING)] DATA_BLOB remaining; } nbt_sockaddr; typedef [bitmap32bit,public] bitmap { - NBT_SERVER_PDC = 0x00000001, - NBT_SERVER_GC = 0x00000004, - NBT_SERVER_LDAP = 0x00000008, - NBT_SERVER_DS = 0x00000010, - NBT_SERVER_KDC = 0x00000020, - NBT_SERVER_TIMESERV = 0x00000040, - NBT_SERVER_CLOSEST = 0x00000080, - NBT_SERVER_WRITABLE = 0x00000100, - NBT_SERVER_GOOD_TIMESERV = 0x00000200, - NBT_SERVER_NDNC = 0x00000400, - NBT_SERVER_SEL_SEC_DOM_6 = 0x00000800, - NBT_SERVER_FUL_SEC_DOM_6 = 0x00001000, - NBT_SERVER_DS_DNS_CONTR = 0x04000000, - NBT_SERVER_DS_DNS_DOMAIN = 0x02000000, - NBT_SERVER_DS_DNS_FOREST = 0x01000000 + NBT_SERVER_PDC = 0x00000001, + NBT_SERVER_GC = 0x00000004, + NBT_SERVER_LDAP = 0x00000008, + NBT_SERVER_DS = 0x00000010, + NBT_SERVER_KDC = 0x00000020, + NBT_SERVER_TIMESERV = 0x00000040, + NBT_SERVER_CLOSEST = 0x00000080, + NBT_SERVER_WRITABLE = 0x00000100, + NBT_SERVER_GOOD_TIMESERV = 0x00000200, + NBT_SERVER_NDNC = 0x00000400, + NBT_SERVER_SELECT_SECRET_DOMAIN_6 = 0x00000800, + NBT_SERVER_FULL_SECRET_DOMAIN_6 = 0x00001000, + NBT_SERVER_DS_DNS_CONTR = 0x04000000, + NBT_SERVER_DS_DNS_DOMAIN = 0x02000000, + NBT_SERVER_DS_DNS_FOREST = 0x01000000 } nbt_server_type; typedef [bitmap32bit,public] bitmap { - NETLOGON_NT_VERSION_1 = 0x00000001, - NETLOGON_NT_VERSION_5 = 0x00000002, - NETLOGON_NT_VERSION_5EX = 0x00000004, - NETLOGON_NT_VERSION_5EX_WITH_IP = 0x00000008, - NETLOGON_NT_VERSION_WITH_CLOSEST_SITE = 0x00000010, - NETLOGON_NT_VERSION_AVIOD_NT4EMUL = 0x01000000, - NETLOGON_NT_VERSION_PDC = 0x10000000, - NETLOGON_NT_VERSION_IP = 0x20000000, - NETLOGON_NT_VERSION_LOCAL = 0x40000000, - NETLOGON_NT_VERSION_GC = 0x80000000 + NETLOGON_NT_VERSION_1 = 0x00000001, + NETLOGON_NT_VERSION_5 = 0x00000002, + NETLOGON_NT_VERSION_5EX = 0x00000004, + NETLOGON_NT_VERSION_5EX_WITH_IP = 0x00000008, + NETLOGON_NT_VERSION_WITH_CLOSEST_SITE = 0x00000010, + NETLOGON_NT_VERSION_AVIOD_NT4EMUL = 0x01000000, + NETLOGON_NT_VERSION_PDC = 0x10000000, + NETLOGON_NT_VERSION_IP = 0x20000000, + NETLOGON_NT_VERSION_LOCAL = 0x40000000, + NETLOGON_NT_VERSION_GC = 0x80000000 } netlogon_nt_version_flags; - typedef [enum16bit,public] enum { LOGON_PRIMARY_QUERY = 7, /* Was also NETLOGON_QUERY_FOR_PDC */ NETLOGON_ANNOUNCE_UAS = 10, NETLOGON_RESPONSE_FROM_PDC = 12, LOGON_SAM_LOGON_REQUEST = 18, /* Was also NETLOGON_QUERY_FOR_PDC2, NTLOGON_SAM_LOGON */ LOGON_SAM_LOGON_RESPONSE = 19, /* Was also NTLOGON_SAM_LOGON_REPLY */ - LOGON_SAM_LOGON_PAUSE_RESPONSE = 20, + LOGON_SAM_LOGON_PAUSE_RESPONSE = 20, LOGON_SAM_LOGON_USER_UNKNOWN = 21, /* Was also NTLOGON_SAM_LOGON_REPLY15 */ LOGON_SAM_LOGON_RESPONSE_EX = 23, /* was NETLOGON_RESPONSE_FROM_PDC2 */ - LOGON_SAM_LOGON_PAUSE_RESPONSE_EX = 24, + LOGON_SAM_LOGON_PAUSE_RESPONSE_EX = 24, LOGON_SAM_LOGON_USER_UNKNOWN_EX = 25 /* was NETLOGON_RESPONSE_FROM_PDC_USER */ } netlogon_command; @@ -437,7 +436,7 @@ interface nbt nbt_server_type server_type; netlogon_nt_version_flags nt_version; uint16 lmnt_token; - uint16 lm20_token; + uint16 lm20_token; } NETLOGON_SAM_LOGON_RESPONSE; /* response from pdc hand marshaled (we have an additional @@ -458,11 +457,11 @@ interface nbt nbt_string client_site; /* Optional on NETLOGON_NT_VERSION_5EX_WITH_IP */ - [value(ndr_size_nbt_sockaddr(&sockaddr, ndr->flags))] uint8 sockaddr_size; - [subcontext(0),subcontext_size(sockaddr_size)] nbt_sockaddr sockaddr; - + [value(ndr_size_nbt_sockaddr(&sockaddr, ndr->flags))] uint8 sockaddr_size; + [subcontext(0),subcontext_size(sockaddr_size)] nbt_sockaddr sockaddr; + /* Optional on NETLOGON_NT_VERSION_WITH_CLOSEST_SITE */ - nbt_string next_closest_site; + nbt_string next_closest_site; netlogon_nt_version_flags nt_version; uint16 lmnt_token; @@ -548,7 +547,7 @@ interface nbt /********************************************************/ typedef bitmap svcctl_ServerType svcctl_ServerType; - typedef [enum8bit] enum { + typedef [enum8bit] enum { HostAnnouncement = 1, AnnouncementRequest = 2, Election = 8, @@ -576,7 +575,7 @@ interface nbt typedef struct { uint8 Unused; - astring ResponseName; + astring ResponseName; } nbt_browse_announcement_request; typedef struct { @@ -584,7 +583,7 @@ interface nbt uint32 Criteria; uint32 UpTime; /* In milliseconds */ uint32 Reserved; /* Must be zero */ - astring ServerName; + astring ServerName; } nbt_browse_election_request; typedef struct { @@ -649,6 +648,6 @@ interface nbt typedef [public,flag(NDR_NOALIGN)] struct { nbt_browse_opcode opcode; - [switch_is(opcode)] nbt_browse_payload payload; + [switch_is(opcode)] nbt_browse_payload payload; } nbt_browse_packet; } diff --git a/source4/torture/ldap/cldap.c b/source4/torture/ldap/cldap.c index 23b0554c4f..2c95d46058 100644 --- a/source4/torture/ldap/cldap.c +++ b/source4/torture/ldap/cldap.c @@ -280,10 +280,10 @@ static bool test_cldap_netlogon_flags(struct torture_context *tctx, printf("NBT_SERVER_GOOD_TIMESERV "); if (server_type & NBT_SERVER_NDNC) printf("NBT_SERVER_NDNC "); - if (server_type & NBT_SERVER_SEL_SEC_DOM_6) - printf("NBT_SERVER_SEL_SEC_DOM_6 "); - if (server_type & NBT_SERVER_FUL_SEC_DOM_6) - printf("NBT_SERVER_FUL_SEC_DOM_6 "); + if (server_type & NBT_SERVER_SELECT_SECRET_DOMAIN_6) + printf("NBT_SERVER_SELECT_SECRET_DOMAIN_6"); + if (server_type & NBT_SERVER_FULL_SECRET_DOMAIN_6) + printf("NBT_SERVER_FULL_SECRET_DOMAIN_6"); if (server_type & NBT_SERVER_DS_DNS_CONTR) printf("NBT_SERVER_DS_DNS_CONTR "); if (server_type & NBT_SERVER_DS_DNS_DOMAIN) -- cgit From 4577fb5a3b35b8c7ffb1bf3e43f4aa8143c3746d Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 14 Oct 2008 15:57:03 +0200 Subject: Remove unused types. --- source3/librpc/idl/idl_types.h | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/source3/librpc/idl/idl_types.h b/source3/librpc/idl/idl_types.h index f21f3e660d..9885ca5bf6 100644 --- a/source3/librpc/idl/idl_types.h +++ b/source3/librpc/idl/idl_types.h @@ -5,32 +5,15 @@ #define STR_NOTERM LIBNDR_FLAG_STR_NOTERM #define STR_NULLTERM LIBNDR_FLAG_STR_NULLTERM #define STR_BYTESIZE LIBNDR_FLAG_STR_BYTESIZE -#define STR_FIXLEN32 LIBNDR_FLAG_STR_FIXLEN32 -#define STR_FIXLEN15 LIBNDR_FLAG_STR_FIXLEN15 #define STR_CONFORMANT LIBNDR_FLAG_STR_CONFORMANT #define STR_CHARLEN LIBNDR_FLAG_STR_CHARLEN #define STR_UTF8 LIBNDR_FLAG_STR_UTF8 -/* - a UCS2 string prefixed with [size], 32 bits -*/ -#define lstring [flag(STR_SIZE4)] string - /* a null terminated UCS2 string */ #define nstring [flag(STR_NULLTERM)] string -/* - fixed length 32 character UCS-2 string -*/ -#define string32 [flag(STR_FIXLEN32)] string - -/* - fixed length 16 character ascii string -*/ -#define astring15 [flag(STR_ASCII|STR_FIXLEN15)] string - /* an ascii string prefixed with [offset] [length], both 32 bits null terminated -- cgit From 42f0172fe2d3010a346e99f4dc16b1396fdd931c Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 14 Oct 2008 16:21:26 +0200 Subject: Remove unused file. --- source3/librpc/ndr/ndr.c | 1113 ---------------------------------------------- 1 file changed, 1113 deletions(-) delete mode 100644 source3/librpc/ndr/ndr.c diff --git a/source3/librpc/ndr/ndr.c b/source3/librpc/ndr/ndr.c deleted file mode 100644 index d19e861145..0000000000 --- a/source3/librpc/ndr/ndr.c +++ /dev/null @@ -1,1113 +0,0 @@ -/* - Unix SMB/CIFS implementation. - - libndr interface - - Copyright (C) Andrew Tridgell 2003 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - this provides the core routines for NDR parsing functions - - see http://www.opengroup.org/onlinepubs/9629399/chap14.htm for details - of NDR encoding rules -*/ - -#include "includes.h" - -#define NDR_BASE_MARSHALL_SIZE 1024 - -/* this guid indicates NDR encoding in a protocol tower */ -const struct ndr_syntax_id ndr_transfer_syntax = { - { 0x8a885d04, 0x1ceb, 0x11c9, {0x9f, 0xe8}, {0x08,0x00,0x2b,0x10,0x48,0x60} }, - 2 -}; - -const struct ndr_syntax_id ndr64_transfer_syntax = { - { 0x71710533, 0xbeba, 0x4937, {0x83, 0x19}, {0xb5,0xdb,0xef,0x9c,0xcc,0x36} }, - 1 -}; - -/* - work out the number of bytes needed to align on a n byte boundary -*/ -_PUBLIC_ size_t ndr_align_size(uint32_t offset, size_t n) -{ - if ((offset & (n-1)) == 0) return 0; - return n - (offset & (n-1)); -} - -/* - initialise a ndr parse structure from a data blob -*/ -_PUBLIC_ struct ndr_pull *ndr_pull_init_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience) -{ - struct ndr_pull *ndr; - - ndr = talloc_zero(mem_ctx, struct ndr_pull); - if (!ndr) return NULL; - ndr->current_mem_ctx = mem_ctx; - - ndr->data = blob->data; - ndr->data_size = blob->length; - ndr->iconv_convenience = talloc_reference(ndr, iconv_convenience); - - return ndr; -} - -/* - advance by 'size' bytes -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_advance(struct ndr_pull *ndr, uint32_t size) -{ - ndr->offset += size; - if (ndr->offset > ndr->data_size) { - return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, - "ndr_pull_advance by %u failed", - size); - } - return NDR_ERR_SUCCESS; -} - -/* - set the parse offset to 'ofs' -*/ -static enum ndr_err_code ndr_pull_set_offset(struct ndr_pull *ndr, uint32_t ofs) -{ - ndr->offset = ofs; - if (ndr->offset > ndr->data_size) { - return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, - "ndr_pull_set_offset %u failed", - ofs); - } - return NDR_ERR_SUCCESS; -} - -/* create a ndr_push structure, ready for some marshalling */ -_PUBLIC_ struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience) -{ - struct ndr_push *ndr; - - ndr = talloc_zero(mem_ctx, struct ndr_push); - if (!ndr) { - return NULL; - } - - ndr->flags = 0; - ndr->alloc_size = NDR_BASE_MARSHALL_SIZE; - ndr->data = talloc_array(ndr, uint8_t, ndr->alloc_size); - if (!ndr->data) { - return NULL; - } - ndr->iconv_convenience = talloc_reference(ndr, iconv_convenience); - - return ndr; -} - -/* return a DATA_BLOB structure for the current ndr_push marshalled data */ -_PUBLIC_ DATA_BLOB ndr_push_blob(struct ndr_push *ndr) -{ - DATA_BLOB blob; - blob = data_blob_const(ndr->data, ndr->offset); - if (ndr->alloc_size > ndr->offset) { - ndr->data[ndr->offset] = 0; - } - return blob; -} - - -/* - expand the available space in the buffer to ndr->offset + extra_size -*/ -_PUBLIC_ enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_size) -{ - uint32_t size = extra_size + ndr->offset; - - if (size < ndr->offset) { - /* extra_size overflowed the offset */ - return ndr_push_error(ndr, NDR_ERR_BUFSIZE, "Overflow in push_expand to %u", - size); - } - - if (ndr->alloc_size > size) { - return NDR_ERR_SUCCESS; - } - - ndr->alloc_size += NDR_BASE_MARSHALL_SIZE; - if (size+1 > ndr->alloc_size) { - ndr->alloc_size = size+1; - } - ndr->data = talloc_realloc(ndr, ndr->data, uint8_t, ndr->alloc_size); - if (!ndr->data) { - return ndr_push_error(ndr, NDR_ERR_ALLOC, "Failed to push_expand to %u", - ndr->alloc_size); - } - - return NDR_ERR_SUCCESS; -} - -_PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) _PRINTF_ATTRIBUTE(2,3) -{ - va_list ap; - char *s = NULL; - int i, ret; - - va_start(ap, format); - ret = vasprintf(&s, format, ap); - va_end(ap); - - if (ret == -1) { - return; - } - - for (i=0;idepth;i++) { - DEBUGADD(0,(" ")); - } - - DEBUGADD(0,("%s\n", s)); - free(s); -} - -_PUBLIC_ void ndr_print_string_helper(struct ndr_print *ndr, const char *format, ...) -{ - va_list ap; - int i; - - for (i=0;idepth;i++) { - ndr->private_data = talloc_asprintf_append_buffer( - (char *)ndr->private_data, " "); - } - - va_start(ap, format); - ndr->private_data = talloc_vasprintf_append_buffer((char *)ndr->private_data, - format, ap); - va_end(ap); - ndr->private_data = talloc_asprintf_append_buffer((char *)ndr->private_data, - "\n"); -} - -/* - a useful helper function for printing idl structures via DEBUG() -*/ -_PUBLIC_ void ndr_print_debug(ndr_print_fn_t fn, const char *name, void *ptr) -{ - struct ndr_print *ndr; - - ndr = talloc_zero(NULL, struct ndr_print); - if (!ndr) return; - ndr->print = ndr_print_debug_helper; - ndr->depth = 1; - ndr->flags = 0; - fn(ndr, name, ptr); - talloc_free(ndr); -} - -/* - a useful helper function for printing idl unions via DEBUG() -*/ -_PUBLIC_ void ndr_print_union_debug(ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr) -{ - struct ndr_print *ndr; - - ndr = talloc_zero(NULL, struct ndr_print); - if (!ndr) return; - ndr->print = ndr_print_debug_helper; - ndr->depth = 1; - ndr->flags = 0; - ndr_print_set_switch_value(ndr, ptr, level); - fn(ndr, name, ptr); - talloc_free(ndr); -} - -/* - a useful helper function for printing idl function calls via DEBUG() -*/ -_PUBLIC_ void ndr_print_function_debug(ndr_print_function_t fn, const char *name, int flags, void *ptr) -{ - struct ndr_print *ndr; - - ndr = talloc_zero(NULL, struct ndr_print); - if (!ndr) return; - ndr->print = ndr_print_debug_helper; - ndr->depth = 1; - ndr->flags = 0; - fn(ndr, name, flags, ptr); - talloc_free(ndr); -} - -/* - a useful helper function for printing idl structures to a string -*/ -_PUBLIC_ char *ndr_print_struct_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, void *ptr) -{ - struct ndr_print *ndr; - char *ret = NULL; - - ndr = talloc_zero(mem_ctx, struct ndr_print); - if (!ndr) return NULL; - ndr->private_data = talloc_strdup(ndr, ""); - if (!ndr->private_data) { - goto failed; - } - ndr->print = ndr_print_string_helper; - ndr->depth = 1; - ndr->flags = 0; - fn(ndr, name, ptr); - ret = talloc_steal(mem_ctx, (char *)ndr->private_data); -failed: - talloc_free(ndr); - return ret; -} - -/* - a useful helper function for printing idl unions to a string -*/ -_PUBLIC_ char *ndr_print_union_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr) -{ - struct ndr_print *ndr; - char *ret = NULL; - - ndr = talloc_zero(mem_ctx, struct ndr_print); - if (!ndr) return NULL; - ndr->private_data = talloc_strdup(ndr, ""); - if (!ndr->private_data) { - goto failed; - } - ndr->print = ndr_print_string_helper; - ndr->depth = 1; - ndr->flags = 0; - ndr_print_set_switch_value(ndr, ptr, level); - fn(ndr, name, ptr); - ret = talloc_steal(mem_ctx, (char *)ndr->private_data); -failed: - talloc_free(ndr); - return ret; -} - -/* - a useful helper function for printing idl function calls to a string -*/ -_PUBLIC_ char *ndr_print_function_string(TALLOC_CTX *mem_ctx, - ndr_print_function_t fn, const char *name, - int flags, void *ptr) -{ - struct ndr_print *ndr; - char *ret = NULL; - - ndr = talloc_zero(mem_ctx, struct ndr_print); - if (!ndr) return NULL; - ndr->private_data = talloc_strdup(ndr, ""); - if (!ndr->private_data) { - goto failed; - } - ndr->print = ndr_print_string_helper; - ndr->depth = 1; - ndr->flags = 0; - fn(ndr, name, flags, ptr); - ret = talloc_steal(mem_ctx, (char *)ndr->private_data); -failed: - talloc_free(ndr); - return ret; -} - -_PUBLIC_ void ndr_set_flags(uint32_t *pflags, uint32_t new_flags) -{ - /* the big/little endian flags are inter-dependent */ - if (new_flags & LIBNDR_FLAG_LITTLE_ENDIAN) { - (*pflags) &= ~LIBNDR_FLAG_BIGENDIAN; - } - if (new_flags & LIBNDR_FLAG_BIGENDIAN) { - (*pflags) &= ~LIBNDR_FLAG_LITTLE_ENDIAN; - } - if (new_flags & LIBNDR_FLAG_REMAINING) { - (*pflags) &= ~LIBNDR_ALIGN_FLAGS; - } - if (new_flags & LIBNDR_ALIGN_FLAGS) { - (*pflags) &= ~LIBNDR_FLAG_REMAINING; - } - (*pflags) |= new_flags; -} - -/* - return and possibly log an NDR error -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_error(struct ndr_pull *ndr, - enum ndr_err_code ndr_err, - const char *format, ...) _PRINTF_ATTRIBUTE(3,4) -{ - char *s=NULL; - va_list ap; - int ret; - - va_start(ap, format); - ret = vasprintf(&s, format, ap); - va_end(ap); - - if (ret == -1) { - return NDR_ERR_ALLOC; - } - - DEBUG(1,("ndr_pull_error(%u): %s\n", ndr_err, s)); - - free(s); - - return ndr_err; -} - -/* - return and possibly log an NDR error -*/ -_PUBLIC_ enum ndr_err_code ndr_push_error(struct ndr_push *ndr, - enum ndr_err_code ndr_err, - const char *format, ...) _PRINTF_ATTRIBUTE(3,4) -{ - char *s=NULL; - va_list ap; - int ret; - - va_start(ap, format); - ret = vasprintf(&s, format, ap); - va_end(ap); - - if (ret == -1) { - return NDR_ERR_ALLOC; - } - - DEBUG(1,("ndr_push_error(%u): %s\n", ndr_err, s)); - - free(s); - - return ndr_err; -} - -/* - handle subcontext buffers, which in midl land are user-marshalled, but - we use magic in pidl to make them easier to cope with -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_subcontext_start(struct ndr_pull *ndr, - struct ndr_pull **_subndr, - size_t header_size, - ssize_t size_is) -{ - struct ndr_pull *subndr; - uint32_t r_content_size; - bool force_le = false; - bool force_be = false; - - switch (header_size) { - case 0: { - uint32_t content_size = ndr->data_size - ndr->offset; - if (size_is >= 0) { - content_size = size_is; - } - r_content_size = content_size; - break; - } - - case 2: { - uint16_t content_size; - NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &content_size)); - if (size_is >= 0 && size_is != content_size) { - return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) mismatch content_size %d", - (int)size_is, (int)content_size); - } - r_content_size = content_size; - break; - } - - case 4: { - uint32_t content_size; - NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &content_size)); - if (size_is >= 0 && size_is != content_size) { - return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) mismatch content_size %d", - (int)size_is, (int)content_size); - } - r_content_size = content_size; - break; - } - case 0xFFFFFC01: { - /* - * Common Type Header for the Serialization Stream - * See [MS-RPCE] 2.2.6 Type Serialization Version 1 - */ - uint8_t version; - uint8_t drep; - uint16_t hdrlen; - uint32_t filler; - uint32_t content_size; - uint32_t reserved; - - /* version */ - NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &version)); - - if (version != 1) { - return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, - "Bad subcontext (PULL) Common Type Header version %d != 1", - (int)version); - } - - /* - * 0x10 little endian - * 0x00 big endian - */ - NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &drep)); - if (drep == 0x10) { - force_le = true; - } else if (drep == 0x00) { - force_be = true; - } else { - return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, - "Bad subcontext (PULL) Common Type Header invalid drep 0x%02X", - (unsigned int)drep); - } - - /* length of the "Private Header for Constructed Type" */ - NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &hdrlen)); - if (hdrlen != 8) { - return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, - "Bad subcontext (PULL) Common Type Header length %d != 8", - (int)hdrlen); - } - - /* filler should be ignored */ - NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &filler)); - - /* - * Private Header for Constructed Type - */ - /* length - will be updated latter */ - NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &content_size)); - if (size_is >= 0 && size_is != content_size) { - return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) mismatch content_size %d", - (int)size_is, (int)content_size); - } - /* the content size must be a multiple of 8 */ - if ((content_size % 8) != 0) { - return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, - "Bad subcontext (PULL) size_is(%d) not padded to 8 content_size %d", - (int)size_is, (int)content_size); - } - r_content_size = content_size; - - /* reserved */ - NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &reserved)); - break; - } - default: - return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) header_size %d", - (int)header_size); - } - - NDR_PULL_NEED_BYTES(ndr, r_content_size); - - subndr = talloc_zero(ndr, struct ndr_pull); - NDR_ERR_HAVE_NO_MEMORY(subndr); - subndr->flags = ndr->flags; - subndr->current_mem_ctx = ndr->current_mem_ctx; - - subndr->data = ndr->data + ndr->offset; - subndr->offset = 0; - subndr->data_size = r_content_size; - subndr->iconv_convenience = talloc_reference(subndr, ndr->iconv_convenience); - - if (force_le) { - ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN); - } else if (force_be) { - ndr_set_flags(&ndr->flags, LIBNDR_FLAG_BIGENDIAN); - } - - *_subndr = subndr; - return NDR_ERR_SUCCESS; -} - -_PUBLIC_ enum ndr_err_code ndr_pull_subcontext_end(struct ndr_pull *ndr, - struct ndr_pull *subndr, - size_t header_size, - ssize_t size_is) -{ - uint32_t advance; - if (size_is >= 0) { - advance = size_is; - } else if (header_size > 0) { - advance = subndr->data_size; - } else { - advance = subndr->offset; - } - NDR_CHECK(ndr_pull_advance(ndr, advance)); - return NDR_ERR_SUCCESS; -} - -_PUBLIC_ enum ndr_err_code ndr_push_subcontext_start(struct ndr_push *ndr, - struct ndr_push **_subndr, - size_t header_size, - ssize_t size_is) -{ - struct ndr_push *subndr; - - subndr = ndr_push_init_ctx(ndr, ndr->iconv_convenience); - NDR_ERR_HAVE_NO_MEMORY(subndr); - subndr->flags = ndr->flags; - - *_subndr = subndr; - return NDR_ERR_SUCCESS; -} - -/* - push a subcontext header -*/ -_PUBLIC_ enum ndr_err_code ndr_push_subcontext_end(struct ndr_push *ndr, - struct ndr_push *subndr, - size_t header_size, - ssize_t size_is) -{ - ssize_t padding_len; - - if (size_is >= 0) { - padding_len = size_is - subndr->offset; - if (padding_len > 0) { - NDR_CHECK(ndr_push_zero(subndr, padding_len)); - } else if (padding_len < 0) { - return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PUSH) content_size %d is larger than size_is(%d)", - (int)subndr->offset, (int)size_is); - } - } - - switch (header_size) { - case 0: - break; - - case 2: - NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, subndr->offset)); - break; - - case 4: - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, subndr->offset)); - break; - - case 0xFFFFFC01: - /* - * Common Type Header for the Serialization Stream - * See [MS-RPCE] 2.2.6 Type Serialization Version 1 - */ - padding_len = NDR_ROUND(subndr->offset, 8) - subndr->offset; - if (padding_len > 0) { - NDR_CHECK(ndr_push_zero(subndr, padding_len)); - } - - /* version */ - NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, 1)); - - /* - * 0x10 little endian - * 0x00 big endian - */ - NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, NDR_BE(ndr)?0x00:0x10)); - - /* length of the "Private Header for Constructed Type" */ - NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, 8)); - - /* filler */ - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0xCCCCCCCC)); - - /* - * Private Header for Constructed Type - */ - /* length - will be updated latter */ - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, subndr->offset)); - - /* reserved */ - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0)); - break; - - default: - return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext header size %d", - (int)header_size); - } - - NDR_CHECK(ndr_push_bytes(ndr, subndr->data, subndr->offset)); - return NDR_ERR_SUCCESS; -} - -/* - store a token in the ndr context, for later retrieval -*/ -_PUBLIC_ enum ndr_err_code ndr_token_store(TALLOC_CTX *mem_ctx, - struct ndr_token_list **list, - const void *key, - uint32_t value) -{ - struct ndr_token_list *tok; - tok = talloc(mem_ctx, struct ndr_token_list); - NDR_ERR_HAVE_NO_MEMORY(tok); - tok->key = key; - tok->value = value; - DLIST_ADD((*list), tok); - return NDR_ERR_SUCCESS; -} - -/* - retrieve a token from a ndr context, using cmp_fn to match the tokens -*/ -_PUBLIC_ enum ndr_err_code ndr_token_retrieve_cmp_fn(struct ndr_token_list **list, const void *key, uint32_t *v, - comparison_fn_t _cmp_fn, bool _remove_tok) -{ - struct ndr_token_list *tok; - for (tok=*list;tok;tok=tok->next) { - if (_cmp_fn && _cmp_fn(tok->key,key)==0) goto found; - else if (!_cmp_fn && tok->key == key) goto found; - } - return NDR_ERR_TOKEN; -found: - *v = tok->value; - if (_remove_tok) { - DLIST_REMOVE((*list), tok); - talloc_free(tok); - } - return NDR_ERR_SUCCESS; -} - -/* - retrieve a token from a ndr context -*/ -_PUBLIC_ enum ndr_err_code ndr_token_retrieve(struct ndr_token_list **list, const void *key, uint32_t *v) -{ - return ndr_token_retrieve_cmp_fn(list, key, v, NULL, true); -} - -/* - peek at but don't removed a token from a ndr context -*/ -_PUBLIC_ uint32_t ndr_token_peek(struct ndr_token_list **list, const void *key) -{ - enum ndr_err_code status; - uint32_t v; - - status = ndr_token_retrieve_cmp_fn(list, key, &v, NULL, false); - if (!NDR_ERR_CODE_IS_SUCCESS(status)) { - return 0; - } - - return v; -} - -/* - pull an array size field and add it to the array_size_list token list -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_array_size(struct ndr_pull *ndr, const void *p) -{ - uint32_t size; - NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &size)); - return ndr_token_store(ndr, &ndr->array_size_list, p, size); -} - -/* - get the stored array size field -*/ -_PUBLIC_ uint32_t ndr_get_array_size(struct ndr_pull *ndr, const void *p) -{ - return ndr_token_peek(&ndr->array_size_list, p); -} - -/* - check the stored array size field -*/ -_PUBLIC_ enum ndr_err_code ndr_check_array_size(struct ndr_pull *ndr, void *p, uint32_t size) -{ - uint32_t stored; - stored = ndr_token_peek(&ndr->array_size_list, p); - if (stored != size) { - return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, - "Bad array size - got %u expected %u\n", - stored, size); - } - return NDR_ERR_SUCCESS; -} - -/* - pull an array length field and add it to the array_length_list token list -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_array_length(struct ndr_pull *ndr, const void *p) -{ - uint32_t length, offset; - NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &offset)); - if (offset != 0) { - return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, - "non-zero array offset %u\n", offset); - } - NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &length)); - return ndr_token_store(ndr, &ndr->array_length_list, p, length); -} - -/* - get the stored array length field -*/ -_PUBLIC_ uint32_t ndr_get_array_length(struct ndr_pull *ndr, const void *p) -{ - return ndr_token_peek(&ndr->array_length_list, p); -} - -/* - check the stored array length field -*/ -_PUBLIC_ enum ndr_err_code ndr_check_array_length(struct ndr_pull *ndr, void *p, uint32_t length) -{ - uint32_t stored; - stored = ndr_token_peek(&ndr->array_length_list, p); - if (stored != length) { - return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, - "Bad array length - got %u expected %u\n", - stored, length); - } - return NDR_ERR_SUCCESS; -} - -/* - store a switch value - */ -_PUBLIC_ enum ndr_err_code ndr_push_set_switch_value(struct ndr_push *ndr, const void *p, uint32_t val) -{ - return ndr_token_store(ndr, &ndr->switch_list, p, val); -} - -_PUBLIC_ enum ndr_err_code ndr_pull_set_switch_value(struct ndr_pull *ndr, const void *p, uint32_t val) -{ - return ndr_token_store(ndr, &ndr->switch_list, p, val); -} - -_PUBLIC_ enum ndr_err_code ndr_print_set_switch_value(struct ndr_print *ndr, const void *p, uint32_t val) -{ - return ndr_token_store(ndr, &ndr->switch_list, p, val); -} - -/* - retrieve a switch value - */ -_PUBLIC_ uint32_t ndr_push_get_switch_value(struct ndr_push *ndr, const void *p) -{ - return ndr_token_peek(&ndr->switch_list, p); -} - -_PUBLIC_ uint32_t ndr_pull_get_switch_value(struct ndr_pull *ndr, const void *p) -{ - return ndr_token_peek(&ndr->switch_list, p); -} - -_PUBLIC_ uint32_t ndr_print_get_switch_value(struct ndr_print *ndr, const void *p) -{ - return ndr_token_peek(&ndr->switch_list, p); -} - -/* - pull a struct from a blob using NDR -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, - ndr_pull_flags_fn_t fn) -{ - struct ndr_pull *ndr; - ndr = ndr_pull_init_blob(blob, mem_ctx, iconv_convenience); - NDR_ERR_HAVE_NO_MEMORY(ndr); - NDR_CHECK(fn(ndr, NDR_SCALARS|NDR_BUFFERS, p)); - return NDR_ERR_SUCCESS; -} - -/* - pull a struct from a blob using NDR - failing if all bytes are not consumed -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, - struct smb_iconv_convenience *iconv_convenience, - void *p, ndr_pull_flags_fn_t fn) -{ - struct ndr_pull *ndr; - ndr = ndr_pull_init_blob(blob, mem_ctx, iconv_convenience); - NDR_ERR_HAVE_NO_MEMORY(ndr); - NDR_CHECK(fn(ndr, NDR_SCALARS|NDR_BUFFERS, p)); - if (ndr->offset < ndr->data_size) { - return ndr_pull_error(ndr, NDR_ERR_UNREAD_BYTES, - "not all bytes consumed ofs[%u] size[%u]", - ndr->offset, ndr->data_size); - } - return NDR_ERR_SUCCESS; -} - -/* - pull a union from a blob using NDR, given the union discriminator -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, - struct smb_iconv_convenience *iconv_convenience, void *p, - uint32_t level, ndr_pull_flags_fn_t fn) -{ - struct ndr_pull *ndr; - ndr = ndr_pull_init_blob(blob, mem_ctx, iconv_convenience); - NDR_ERR_HAVE_NO_MEMORY(ndr); - NDR_CHECK(ndr_pull_set_switch_value(ndr, p, level)); - NDR_CHECK(fn(ndr, NDR_SCALARS|NDR_BUFFERS, p)); - return NDR_ERR_SUCCESS; -} - -/* - pull a union from a blob using NDR, given the union discriminator, - failing if all bytes are not consumed -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, - struct smb_iconv_convenience *iconv_convenience, void *p, - uint32_t level, ndr_pull_flags_fn_t fn) -{ - struct ndr_pull *ndr; - ndr = ndr_pull_init_blob(blob, mem_ctx, iconv_convenience); - NDR_ERR_HAVE_NO_MEMORY(ndr); - NDR_CHECK(ndr_pull_set_switch_value(ndr, p, level)); - NDR_CHECK(fn(ndr, NDR_SCALARS|NDR_BUFFERS, p)); - if (ndr->offset < ndr->data_size) { - return ndr_pull_error(ndr, NDR_ERR_UNREAD_BYTES, - "not all bytes consumed ofs[%u] size[%u]", - ndr->offset, ndr->data_size); - } - return NDR_ERR_SUCCESS; -} - -/* - push a struct to a blob using NDR -*/ -_PUBLIC_ enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, const void *p, ndr_push_flags_fn_t fn) -{ - struct ndr_push *ndr; - ndr = ndr_push_init_ctx(mem_ctx, iconv_convenience); - NDR_ERR_HAVE_NO_MEMORY(ndr); - - NDR_CHECK(fn(ndr, NDR_SCALARS|NDR_BUFFERS, p)); - - *blob = ndr_push_blob(ndr); - talloc_steal(mem_ctx, blob->data); - talloc_free(ndr); - - return NDR_ERR_SUCCESS; -} - -/* - push a union to a blob using NDR -*/ -_PUBLIC_ enum ndr_err_code ndr_push_union_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, - uint32_t level, ndr_push_flags_fn_t fn) -{ - struct ndr_push *ndr; - ndr = ndr_push_init_ctx(mem_ctx, iconv_convenience); - NDR_ERR_HAVE_NO_MEMORY(ndr); - - NDR_CHECK(ndr_push_set_switch_value(ndr, p, level)); - NDR_CHECK(fn(ndr, NDR_SCALARS|NDR_BUFFERS, p)); - - *blob = ndr_push_blob(ndr); - talloc_steal(mem_ctx, blob->data); - talloc_free(ndr); - - return NDR_ERR_SUCCESS; -} - -/* - generic ndr_size_*() handler for structures -*/ -_PUBLIC_ size_t ndr_size_struct(const void *p, int flags, ndr_push_flags_fn_t push) -{ - struct ndr_push *ndr; - enum ndr_err_code status; - size_t ret; - - /* avoid recursion */ - if (flags & LIBNDR_FLAG_NO_NDR_SIZE) return 0; - - ndr = ndr_push_init_ctx(NULL, NULL); - if (!ndr) return 0; - ndr->flags |= flags | LIBNDR_FLAG_NO_NDR_SIZE; - status = push(ndr, NDR_SCALARS|NDR_BUFFERS, discard_const(p)); - if (!NDR_ERR_CODE_IS_SUCCESS(status)) { - talloc_free(ndr); - return 0; - } - ret = ndr->offset; - talloc_free(ndr); - return ret; -} - -/* - generic ndr_size_*() handler for unions -*/ -_PUBLIC_ size_t ndr_size_union(const void *p, int flags, uint32_t level, ndr_push_flags_fn_t push) -{ - struct ndr_push *ndr; - enum ndr_err_code status; - size_t ret; - - /* avoid recursion */ - if (flags & LIBNDR_FLAG_NO_NDR_SIZE) return 0; - - ndr = ndr_push_init_ctx(NULL, NULL); - if (!ndr) return 0; - ndr->flags |= flags | LIBNDR_FLAG_NO_NDR_SIZE; - - status = ndr_push_set_switch_value(ndr, p, level); - if (!NDR_ERR_CODE_IS_SUCCESS(status)) { - talloc_free(ndr); - return 0; - } - status = push(ndr, NDR_SCALARS|NDR_BUFFERS, p); - if (!NDR_ERR_CODE_IS_SUCCESS(status)) { - talloc_free(ndr); - return 0; - } - ret = ndr->offset; - talloc_free(ndr); - return ret; -} - -/* - get the current base for relative pointers for the push -*/ -_PUBLIC_ uint32_t ndr_push_get_relative_base_offset(struct ndr_push *ndr) -{ - return ndr->relative_base_offset; -} - -/* - restore the old base for relative pointers for the push -*/ -_PUBLIC_ void ndr_push_restore_relative_base_offset(struct ndr_push *ndr, uint32_t offset) -{ - ndr->relative_base_offset = offset; -} - -/* - setup the current base for relative pointers for the push - called in the NDR_SCALAR stage -*/ -_PUBLIC_ enum ndr_err_code ndr_push_setup_relative_base_offset1(struct ndr_push *ndr, const void *p, uint32_t offset) -{ - ndr->relative_base_offset = offset; - return ndr_token_store(ndr, &ndr->relative_base_list, p, offset); -} - -/* - setup the current base for relative pointers for the push - called in the NDR_BUFFERS stage -*/ -_PUBLIC_ enum ndr_err_code ndr_push_setup_relative_base_offset2(struct ndr_push *ndr, const void *p) -{ - return ndr_token_retrieve(&ndr->relative_base_list, p, &ndr->relative_base_offset); -} - -/* - push a relative object - stage1 - this is called during SCALARS processing -*/ -_PUBLIC_ enum ndr_err_code ndr_push_relative_ptr1(struct ndr_push *ndr, const void *p) -{ - if (p == NULL) { - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0)); - return NDR_ERR_SUCCESS; - } - NDR_CHECK(ndr_push_align(ndr, 4)); - NDR_CHECK(ndr_token_store(ndr, &ndr->relative_list, p, ndr->offset)); - return ndr_push_uint32(ndr, NDR_SCALARS, 0xFFFFFFFF); -} - -/* - push a relative object - stage2 - this is called during buffers processing -*/ -_PUBLIC_ enum ndr_err_code ndr_push_relative_ptr2(struct ndr_push *ndr, const void *p) -{ - uint32_t save_offset; - uint32_t ptr_offset = 0xFFFFFFFF; - if (p == NULL) { - return NDR_ERR_SUCCESS; - } - save_offset = ndr->offset; - NDR_CHECK(ndr_token_retrieve(&ndr->relative_list, p, &ptr_offset)); - if (ptr_offset > ndr->offset) { - return ndr_push_error(ndr, NDR_ERR_BUFSIZE, - "ndr_push_relative_ptr2 ptr_offset(%u) > ndr->offset(%u)", - ptr_offset, ndr->offset); - } - ndr->offset = ptr_offset; - if (save_offset < ndr->relative_base_offset) { - return ndr_push_error(ndr, NDR_ERR_BUFSIZE, - "ndr_push_relative_ptr2 save_offset(%u) < ndr->relative_base_offset(%u)", - save_offset, ndr->relative_base_offset); - } - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, save_offset - ndr->relative_base_offset)); - ndr->offset = save_offset; - return NDR_ERR_SUCCESS; -} - -/* - get the current base for relative pointers for the pull -*/ -_PUBLIC_ uint32_t ndr_pull_get_relative_base_offset(struct ndr_pull *ndr) -{ - return ndr->relative_base_offset; -} - -/* - restore the old base for relative pointers for the pull -*/ -_PUBLIC_ void ndr_pull_restore_relative_base_offset(struct ndr_pull *ndr, uint32_t offset) -{ - ndr->relative_base_offset = offset; -} - -/* - setup the current base for relative pointers for the pull - called in the NDR_SCALAR stage -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_setup_relative_base_offset1(struct ndr_pull *ndr, const void *p, uint32_t offset) -{ - ndr->relative_base_offset = offset; - return ndr_token_store(ndr, &ndr->relative_base_list, p, offset); -} - -/* - setup the current base for relative pointers for the pull - called in the NDR_BUFFERS stage -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_setup_relative_base_offset2(struct ndr_pull *ndr, const void *p) -{ - return ndr_token_retrieve(&ndr->relative_base_list, p, &ndr->relative_base_offset); -} - -/* - pull a relative object - stage1 - called during SCALARS processing -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_relative_ptr1(struct ndr_pull *ndr, const void *p, uint32_t rel_offset) -{ - rel_offset += ndr->relative_base_offset; - if (rel_offset > ndr->data_size) { - return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, - "ndr_pull_relative_ptr1 rel_offset(%u) > ndr->data_size(%u)", - rel_offset, ndr->data_size); - } - return ndr_token_store(ndr, &ndr->relative_list, p, rel_offset); -} - -/* - pull a relative object - stage2 - called during BUFFERS processing -*/ -_PUBLIC_ enum ndr_err_code ndr_pull_relative_ptr2(struct ndr_pull *ndr, const void *p) -{ - uint32_t rel_offset; - NDR_CHECK(ndr_token_retrieve(&ndr->relative_list, p, &rel_offset)); - return ndr_pull_set_offset(ndr, rel_offset); -} -- cgit From d940012dc8db9104c929f588f1d28ba18cbbd420 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 14 Oct 2008 16:23:46 +0200 Subject: Move ndr pkg-config file to top-level. --- librpc/ndr.pc.in | 11 +++++++++++ source4/configure.ac | 2 +- source4/librpc/config.mk | 2 +- source4/librpc/ndr.pc.in | 11 ----------- 4 files changed, 13 insertions(+), 13 deletions(-) create mode 100644 librpc/ndr.pc.in delete mode 100644 source4/librpc/ndr.pc.in diff --git a/librpc/ndr.pc.in b/librpc/ndr.pc.in new file mode 100644 index 0000000000..2f4d95006f --- /dev/null +++ b/librpc/ndr.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: ndr +Description: Network Data Representation Core Library +Requires: samba-hostconfig talloc +Version: 0.0.1 +Libs: -L${libdir} -lndr +Cflags: -I${includedir} -DHAVE_IMMEDIATE_STRUCTURES=1 diff --git a/source4/configure.ac b/source4/configure.ac index 62f9dc43a0..97b1174a0f 100644 --- a/source4/configure.ac +++ b/source4/configure.ac @@ -31,7 +31,7 @@ m4_include(../pidl/config.m4) AC_CONFIG_FILES(lib/registry/registry.pc) AC_CONFIG_FILES(lib/events/events.pc) AC_CONFIG_FILES(librpc/dcerpc.pc) -AC_CONFIG_FILES(librpc/ndr.pc) +AC_CONFIG_FILES(../librpc/ndr.pc) AC_CONFIG_FILES(lib/torture/torture.pc) AC_CONFIG_FILES(auth/gensec/gensec.pc) AC_CONFIG_FILES(param/samba-hostconfig.pc) diff --git a/source4/librpc/config.mk b/source4/librpc/config.mk index 9f1d5df96f..44e05dff35 100644 --- a/source4/librpc/config.mk +++ b/source4/librpc/config.mk @@ -12,7 +12,7 @@ LIBNDR_OBJ_FILES = $(addprefix $(ndrsrcdir)/, ndr_string.o) ../librpc/ndr/ndr_ba $(eval $(call proto_header_template,$(ndrsrcdir)/libndr_proto.h,$(LIBNDR_OBJ_FILES:.o=.c))) -PC_FILES += $(librpcsrcdir)/ndr.pc +PC_FILES += ../librpc/ndr.pc LIBNDR_VERSION = 0.0.1 LIBNDR_SOVERSION = 0 diff --git a/source4/librpc/ndr.pc.in b/source4/librpc/ndr.pc.in deleted file mode 100644 index 2f4d95006f..0000000000 --- a/source4/librpc/ndr.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: ndr -Description: Network Data Representation Core Library -Requires: samba-hostconfig talloc -Version: 0.0.1 -Libs: -L${libdir} -lndr -Cflags: -I${includedir} -DHAVE_IMMEDIATE_STRUCTURES=1 -- cgit From da4399c509e9acfb372b90785292dcb1a08cf784 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 14 Oct 2008 15:36:31 +0200 Subject: s3-build: add and use IDL_PATH while building IDL files. Guenther --- source3/Makefile.in | 2 +- source3/script/build_idl.sh | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source3/Makefile.in b/source3/Makefile.in index bd29792701..76fc101af3 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -1198,10 +1198,10 @@ samba3-idl:: epmapper.idl messaging.idl xattr.idl misc.idl samr.idl security.idl \ dssetup.idl krb5pac.idl ntsvcs.idl libnetapi.idl drsuapi.idl drsblobs.idl \ nbt.idl" \ + IDL_PATH="librpc/idl" \ CPP="$(CPP)" PIDL="../pidl/pidl" \ srcdir="$(srcdir)" $(srcdir)/script/build_idl.sh $(PIDL_ARGS) - ##################################################################### diff --git a/source3/script/build_idl.sh b/source3/script/build_idl.sh index 2027fd3937..75f8612957 100755 --- a/source3/script/build_idl.sh +++ b/source3/script/build_idl.sh @@ -20,11 +20,11 @@ for f in ${IDL_FILES}; do ndr="librpc/gen_ndr/ndr_$basename.c" if [ -f $ndr ]; then - if [ "x`find librpc/idl/$f -newer $ndr -print`" = "xlibrpc/idl/$f" ]; then - list="$list librpc/idl/$f" + if [ "x`find ${IDL_PATH}/$f -newer $ndr -print`" = "x${IDL_PATH}/$f" ]; then + list="$list ${IDL_PATH}/$f" fi else - list="$list librpc/idl/$f" + list="$list ${IDL_PATH}/$f" fi done -- cgit From 7fb9007f3dbaa50491b851eec6d303b3c17c2c2e Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Tue, 14 Oct 2008 12:25:18 -0400 Subject: Fix very old bug in ASQ --- source4/lib/ldb/modules/asq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source4/lib/ldb/modules/asq.c b/source4/lib/ldb/modules/asq.c index 17896a006a..835715e7dc 100644 --- a/source4/lib/ldb/modules/asq.c +++ b/source4/lib/ldb/modules/asq.c @@ -222,10 +222,10 @@ static int asq_build_first_request(struct asq_context *ac, struct ldb_request ** base_attrs[1] = NULL; - ret = ldb_build_search_req_ex(base_req, ac->module->ldb, ac, + ret = ldb_build_search_req(base_req, ac->module->ldb, ac, ac->req->op.search.base, LDB_SCOPE_BASE, - ac->req->op.search.tree, + NULL, (const char * const *)base_attrs, NULL, ac, asq_base_callback, -- cgit