r12513: Similar change as my previous commit, but now for transfer syntaxes.
authorJelmer Vernooij <jelmer@samba.org>
Tue, 27 Dec 2005 16:47:09 +0000 (16:47 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:47:49 +0000 (13:47 -0500)
Avoids converting a static string to GUID every time we check whether
a transfer syntax is equal to that of NDR.
(This used to be commit 8dcfcaf75ab8cf4a54cf5e56f6be25acc68e3989)

source4/build/smb_build/TODO
source4/librpc/idl/epmapper.idl
source4/librpc/ndr/libndr.h
source4/librpc/ndr/ndr.c
source4/librpc/rpc/dcerpc.c
source4/librpc/rpc/dcerpc_util.c
source4/rpc_server/dcerpc_server.c
source4/rpc_server/epmapper/rpc_epmapper.c

index fb58d6b29f7f5f49416074bfc2994a70f8d279e0..1c2e6c2f61a0eefcb93ddbd05a1337b9985729a5 100644 (file)
@@ -5,7 +5,7 @@
        ldb.h belong in $INCLUDEDIR
 - add register function to smbtorture
 - init functions per shared library / binary
- - gensec
+ - gensec, com
  - rpc/ndr ??
  - list not automatically generated
  - utility function for 'init mutex'
index af0bd2483d4985ed4069f1654d30109d7cc55489..223883c366128af712c8b7623a82e3deae8be1d8 100644 (file)
@@ -33,12 +33,6 @@ interface epmapper
        const int EPMAPPER_STATUS_OK = 0;
 
 
-       /* this guid indicates NDR encoding in a protocol tower */
-       const string NDR_GUID = "8a885d04-1ceb-11c9-9fe8-08002b104860";
-       const string NDR_GUID_VERSION = 2;
-
-       const string NDR64_GUID = "71710533-beba-4937-8319-b5dbef9ccc36";
-       const string NDR64_GUID_VERSION = 1;
 
        typedef [enum8bit] enum {
                
index ca66078614398f06c99fe81c461ccfa5c0f74918..3d8bdf9f36df765b913d6fada5e01c92d7fe3be8 100644 (file)
@@ -278,3 +278,5 @@ typedef NTSTATUS (*ndr_pull_flags_fn_t)(struct ndr_pull *, int ndr_flags, void *
 typedef void (*ndr_print_fn_t)(struct ndr_print *, const char *, const void *);
 typedef void (*ndr_print_function_t)(struct ndr_print *, const char *, int, const void *);
 
+extern const struct dcerpc_syntax_id ndr_transfer_syntax;
+extern const struct dcerpc_syntax_id ndr64_transfer_syntax;
index 2e6fd5b432b5780e2778129e87c550184ba49409..260d44587089566573c7c7489b9bc8dc02afe83d 100644 (file)
 
 #define NDR_BASE_MARSHALL_SIZE 1024
 
+/* this guid indicates NDR encoding in a protocol tower */
+const struct dcerpc_syntax_id ndr_transfer_syntax = {
+  { 0x8a885d04, 0x1ceb, 0x11c9, {0x9f, 0xe8}, {0x08,0x00,0x2b,0x10,0x48,0x60} },
+  2
+};
+
+const struct dcerpc_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
 */
index 10093cfcbb8f1536c59eb788b7841da916e9910d..14305c34497bec3b0b94d1f28797facced082398 100644 (file)
@@ -794,15 +794,10 @@ NTSTATUS dcerpc_init_syntaxes(const struct dcerpc_interface_table *table,
                              struct dcerpc_syntax_id *syntax,
                              struct dcerpc_syntax_id *transfer_syntax)
 {
-       NTSTATUS status;
-
        syntax->uuid = table->uuid;
        syntax->if_version = table->if_version;
 
-       status = GUID_from_string(NDR_GUID, &transfer_syntax->uuid);
-       if (!NT_STATUS_IS_OK(status)) return status;
-
-       transfer_syntax->if_version = NDR_GUID_VERSION;
+       *transfer_syntax = ndr_transfer_syntax;
 
        return NT_STATUS_OK;
 }
index 3a1e3c6cff5720a6ab5bf2819420125e367ecab4..4e7550c70114044e04d04efa73df290abb1ea0ab 100644 (file)
@@ -221,12 +221,16 @@ const char *epm_floor_string(TALLOC_CTX *mem_ctx, struct epm_floor *epm_floor)
                                /* lhs is used: UUID */
                                char *uuidstr;
 
-                               uuidstr = GUID_string(mem_ctx, &uuid);
-
-                               if (strcasecmp(uuidstr, NDR_GUID) == 0) {
+                               if (GUID_equal(&uuid, &ndr_transfer_syntax.uuid)) {
                                        return "NDR";
                                } 
 
+                               if (GUID_equal(&uuid, &ndr64_transfer_syntax.uuid)) {
+                                       return "NDR64";
+                               } 
+
+                               uuidstr = GUID_string(mem_ctx, &uuid);
+
                                return talloc_asprintf(mem_ctx, " uuid %s/0x%02x", uuidstr, if_version);
                        } else { /* IPX */
                                return talloc_asprintf(mem_ctx, "IPX:%s", 
@@ -497,7 +501,7 @@ NTSTATUS dcerpc_floor_get_lhs_data(struct epm_floor *epm_floor, struct GUID *uui
        return status;
 }
 
-static DATA_BLOB dcerpc_floor_pack_lhs_data(TALLOC_CTX *mem_ctx, struct GUID *uuid, uint32_t if_version)
+static DATA_BLOB dcerpc_floor_pack_lhs_data(TALLOC_CTX *mem_ctx, const struct GUID *uuid, uint32_t if_version)
 {
        struct ndr_push *ndr = ndr_push_init_ctx(mem_ctx);
 
@@ -743,7 +747,6 @@ NTSTATUS dcerpc_binding_build_tower(TALLOC_CTX *mem_ctx, struct dcerpc_binding *
 {
        const enum epm_protocol *protseq = NULL;
        int num_protocols = -1, i;
-       struct GUID ndr_guid;
        NTSTATUS status;
        
        /* Find transport */
@@ -773,12 +776,9 @@ NTSTATUS dcerpc_binding_build_tower(TALLOC_CTX *mem_ctx, struct dcerpc_binding *
        /* Floor 1 */
        tower->floors[1].lhs.protocol = EPM_PROTOCOL_UUID;
 
-       status = GUID_from_string(NDR_GUID, &ndr_guid);
-       if (NT_STATUS_IS_ERR(status)) {
-               return status;
-       }
-
-       tower->floors[1].lhs.lhs_data = dcerpc_floor_pack_lhs_data(mem_ctx, &ndr_guid, NDR_GUID_VERSION);
+       tower->floors[1].lhs.lhs_data = dcerpc_floor_pack_lhs_data(mem_ctx, 
+                                                               &ndr_transfer_syntax.uuid, 
+                                                               ndr_transfer_syntax.if_version);
        
        tower->floors[1].rhs.uuid.unknown = data_blob_talloc_zero(mem_ctx, 2);
        
@@ -1340,12 +1340,7 @@ NTSTATUS dcerpc_secondary_context(struct dcerpc_pipe *p,
        p2->syntax.uuid = table->uuid;
        p2->syntax.if_version = table->if_version;
 
-       status = GUID_from_string(NDR_GUID, &p2->transfer_syntax.uuid);
-       if (!NT_STATUS_IS_OK(status)) {
-               talloc_free(p2);
-               return status;
-       }
-       p2->transfer_syntax.if_version = NDR_GUID_VERSION;
+       p2->transfer_syntax = ndr_transfer_syntax;
 
        status = dcerpc_alter_context(p2, p2, &p2->syntax, &p2->transfer_syntax);
        if (!NT_STATUS_IS_OK(status)) {
index facf6bc0af3ce615d30d8f5e0d6546ebf7bbf7fb..927d88a4ecda4ac0e9e44c770b7c20d7638e6e91 100644 (file)
@@ -447,9 +447,8 @@ static NTSTATUS dcesrv_bind_nak(struct dcesrv_call_state *call, uint32_t reason)
 */
 static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
 {
-       const char *transfer_syntax;
        uint32_t if_version, transfer_syntax_version;
-       struct GUID uuid;
+       struct GUID uuid, *transfer_syntax_uuid;
        struct ncacn_packet pkt;
        struct data_blob_list_item *rep;
        NTSTATUS status;
@@ -473,13 +472,13 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
        uuid = call->pkt.u.bind.ctx_list[0].abstract_syntax.uuid;
 
        transfer_syntax_version = call->pkt.u.bind.ctx_list[0].transfer_syntaxes[0].if_version;
-       transfer_syntax = GUID_string(call, 
-                                     &call->pkt.u.bind.ctx_list[0].transfer_syntaxes[0].uuid);
-       if (!transfer_syntax ||
-           strcasecmp(NDR_GUID, transfer_syntax) != 0 ||
-           NDR_GUID_VERSION != transfer_syntax_version) {
+       transfer_syntax_uuid = &call->pkt.u.bind.ctx_list[0].transfer_syntaxes[0].uuid;
+       if (!GUID_equal(&ndr_transfer_syntax.uuid, transfer_syntax_uuid) != 0 ||
+           ndr_transfer_syntax.if_version != transfer_syntax_version) {
+               char *uuid_str = GUID_string(call, transfer_syntax_uuid);
                /* we only do NDR encoded dcerpc */
-               DEBUG(0,("Non NDR transfer syntax requested - %s\n", transfer_syntax));
+               DEBUG(0,("Non NDR transfer syntax requested - %s\n", uuid_str));
+               talloc_free(uuid_str);
                return dcesrv_bind_nak(call, 0);
        }
 
@@ -542,8 +541,7 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
        }
        pkt.u.bind_ack.ctx_list[0].result = result;
        pkt.u.bind_ack.ctx_list[0].reason = reason;
-       GUID_from_string(NDR_GUID, &pkt.u.bind_ack.ctx_list[0].syntax.uuid);
-       pkt.u.bind_ack.ctx_list[0].syntax.if_version = NDR_GUID_VERSION;
+       pkt.u.bind_ack.ctx_list[0].syntax = ndr_transfer_syntax;
        pkt.u.bind_ack.auth_info = data_blob(NULL, 0);
 
        if (!dcesrv_auth_bind_ack(call, &pkt)) {
@@ -605,22 +603,19 @@ static NTSTATUS dcesrv_auth3(struct dcesrv_call_state *call)
 static NTSTATUS dcesrv_alter_new_context(struct dcesrv_call_state *call, uint32_t context_id)
 {
        uint32_t if_version, transfer_syntax_version;
-       const char *transfer_syntax;
        struct dcesrv_connection_context *context;
        const struct dcesrv_interface *iface;
-       struct GUID uuid;
+       struct GUID uuid, *transfer_syntax_uuid;
 
        if_version = call->pkt.u.alter.ctx_list[0].abstract_syntax.if_version;
        uuid = call->pkt.u.alter.ctx_list[0].abstract_syntax.uuid;
 
        transfer_syntax_version = call->pkt.u.alter.ctx_list[0].transfer_syntaxes[0].if_version;
-       transfer_syntax = GUID_string(call, 
-                                     &call->pkt.u.alter.ctx_list[0].transfer_syntaxes[0].uuid);
-       if (!transfer_syntax ||
-           strcasecmp(NDR_GUID, transfer_syntax) != 0 ||
-           NDR_GUID_VERSION != transfer_syntax_version) {
+       transfer_syntax_uuid = &call->pkt.u.alter.ctx_list[0].transfer_syntaxes[0].uuid;
+       if (!GUID_equal(transfer_syntax_uuid, &ndr_transfer_syntax.uuid) ||
+           ndr_transfer_syntax.if_version != transfer_syntax_version) {
                /* we only do NDR encoded dcerpc */
-               return NT_STATUS_NO_MEMORY;
+               return NT_STATUS_RPC_PROTSEQ_NOT_SUPPORTED;
        }
 
        iface = find_interface_by_uuid(call->conn->endpoint, &uuid, if_version);
@@ -694,8 +689,7 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
        }
        pkt.u.alter_resp.ctx_list[0].result = result;
        pkt.u.alter_resp.ctx_list[0].reason = reason;
-       GUID_from_string(NDR_GUID, &pkt.u.alter_resp.ctx_list[0].syntax.uuid);
-       pkt.u.alter_resp.ctx_list[0].syntax.if_version = NDR_GUID_VERSION;
+       pkt.u.alter_resp.ctx_list[0].syntax = ndr_transfer_syntax;
        pkt.u.alter_resp.auth_info = data_blob(NULL, 0);
        pkt.u.alter_resp.secondary_address = "";
 
index e7371a632fad510c2f0764c72f5185b8eab3f89a..8ff4ffdf2de5f35112f8b4c0de9b2f9cbbbd05c8 100644 (file)
@@ -37,18 +37,6 @@ struct dcesrv_ep_iface {
        struct epm_tower ep;
 };
 
-/*
-  simple routine to compare a GUID string to a GUID structure
-*/
-static int guid_cmp(TALLOC_CTX *mem_ctx, const struct GUID *guid, const char *uuid_str)
-{
-       const char *s = GUID_string(mem_ctx, guid);
-       if (!s || strcasecmp(s, uuid_str)) {
-               return -1;
-       }
-       return 0;
-}
-
 /*
   build a list of all interfaces handled by all endpoint servers
 */
@@ -213,8 +201,8 @@ static error_status_t epm_Map(struct dcesrv_call_state *dce_call, TALLOC_CTX *me
        dcerpc_floor_get_lhs_data(&r->in.map_tower->tower.floors[1], &ndr_uuid, &ndr_version);
 
        if (floors[1].lhs.protocol != EPM_PROTOCOL_UUID ||
-           guid_cmp(mem_ctx, &ndr_uuid, NDR_GUID) != 0 ||
-           ndr_version != NDR_GUID_VERSION) {
+               !GUID_equal(&ndr_uuid, &ndr_transfer_syntax.uuid) ||
+           ndr_version != ndr_transfer_syntax.if_version) {
                goto failed;
        }