In api_pipe_bind_req(), check for the iface id, not the pipe name
authorVolker Lendecke <vl@samba.org>
Sat, 12 Jul 2008 21:17:23 +0000 (23:17 +0200)
committerVolker Lendecke <vl@samba.org>
Wed, 16 Jul 2008 21:19:48 +0000 (23:19 +0200)
This requires to store the rpc_interface in "struct rpc_table"
(This used to be commit 654f8de8497aff29f9b1f1822b6a8e734ff329e0)

20 files changed:
source3/include/proto.h
source3/librpc/gen_ndr/srv_dfs.c
source3/librpc/gen_ndr/srv_dssetup.c
source3/librpc/gen_ndr/srv_echo.c
source3/librpc/gen_ndr/srv_epmapper.c
source3/librpc/gen_ndr/srv_eventlog.c
source3/librpc/gen_ndr/srv_initshutdown.c
source3/librpc/gen_ndr/srv_lsa.c
source3/librpc/gen_ndr/srv_netlogon.c
source3/librpc/gen_ndr/srv_ntsvcs.c
source3/librpc/gen_ndr/srv_samr.c
source3/librpc/gen_ndr/srv_srvsvc.c
source3/librpc/gen_ndr/srv_svcctl.c
source3/librpc/gen_ndr/srv_winreg.c
source3/librpc/gen_ndr/srv_wkssvc.c
source3/rpc_server/srv_eventlog.c
source3/rpc_server/srv_ntsvcs.c
source3/rpc_server/srv_pipe.c
source3/rpc_server/srv_spoolss.c
source3/rpc_server/srv_svcctl.c

index 246a3b75be972dec65a7cf7986b300efb91ec3f1..03d203b96e3e10532a6416975ec23c3b5637097e 100644 (file)
@@ -8809,7 +8809,10 @@ bool setup_fault_pdu(pipes_struct *p, NTSTATUS status);
 bool setup_cancel_ack_reply(pipes_struct *p, prs_struct *rpc_in_p);
 bool check_bind_req(struct pipes_struct *p, RPC_IFACE* abstract,
                     RPC_IFACE* transfer, uint32 context_id);
-NTSTATUS rpc_pipe_register_commands(int version, const char *clnt, const char *srv, const struct api_struct *cmds, int size);
+NTSTATUS rpc_pipe_register_commands(int version, const char *clnt,
+                                   const char *srv,
+                                   const struct ndr_syntax_id *interface,
+                                   const struct api_struct *cmds, int size);
 bool api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p);
 bool api_pipe_alter_context(pipes_struct *p, prs_struct *rpc_in_p);
 bool api_pipe_ntlmssp_auth_process(pipes_struct *p, prs_struct *rpc_in,
index 1ecd687e3a2576e2284d6933efbfabadc9f3d566..54b21848292288fef6a4fe860e41614c5395f23a 100644 (file)
@@ -1750,5 +1750,5 @@ void netdfs_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_netdfs_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "netdfs", "netdfs", api_netdfs_cmds, sizeof(api_netdfs_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "netdfs", "netdfs", &ndr_table_netdfs.syntax_id, api_netdfs_cmds, sizeof(api_netdfs_cmds) / sizeof(struct api_struct));
 }
index 7a1cae9b5a2698925252604ca74b62cfd330be6a..79bde30d06aff5e14712a9cacc1693d2990a3d11 100644 (file)
@@ -841,5 +841,5 @@ void dssetup_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_dssetup_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "dssetup", "dssetup", api_dssetup_cmds, sizeof(api_dssetup_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "dssetup", "dssetup", &ndr_table_dssetup.syntax_id, api_dssetup_cmds, sizeof(api_dssetup_cmds) / sizeof(struct api_struct));
 }
index 3f725049cdbdf11264d72703fbd6fa91113cd58b..b8b38dad13d17e34494732e3da8d17884dc93f0d 100644 (file)
@@ -801,5 +801,5 @@ void rpcecho_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_rpcecho_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "rpcecho", "rpcecho", api_rpcecho_cmds, sizeof(api_rpcecho_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "rpcecho", "rpcecho", &ndr_table_rpcecho.syntax_id, api_rpcecho_cmds, sizeof(api_rpcecho_cmds) / sizeof(struct api_struct));
 }
index e6c89a553f18e22d2c575cc628a356cd7234f3f8..f42598abd43620e990db0b03445e38c19fde1dc1 100644 (file)
@@ -642,5 +642,5 @@ void epmapper_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_epmapper_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "epmapper", "epmapper", api_epmapper_cmds, sizeof(api_epmapper_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "epmapper", "epmapper", &ndr_table_epmapper.syntax_id, api_epmapper_cmds, sizeof(api_epmapper_cmds) / sizeof(struct api_struct));
 }
index 4d0722bdd740eb9048fb3923877e4a0cfde56e7f..eb3fb1fe6d2923d2a8156c1d591c2ad4a770a5b8 100644 (file)
@@ -1838,5 +1838,5 @@ void eventlog_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_eventlog_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "eventlog", "eventlog", api_eventlog_cmds, sizeof(api_eventlog_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "eventlog", "eventlog", &ndr_table_eventlog.syntax_id, api_eventlog_cmds, sizeof(api_eventlog_cmds) / sizeof(struct api_struct));
 }
index f24530c1c1bbaba74554027309da97c7be06e4d8..00a89661b575c7a7a19623f95d81fab7c2831f93 100644 (file)
@@ -242,5 +242,5 @@ void initshutdown_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_initshutdown_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "initshutdown", "initshutdown", api_initshutdown_cmds, sizeof(api_initshutdown_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "initshutdown", "initshutdown", &ndr_table_initshutdown.syntax_id, api_initshutdown_cmds, sizeof(api_initshutdown_cmds) / sizeof(struct api_struct));
 }
index 249bdc04bb3aafc0bf97546822553d43cdfaa6a5..41d1c9716c7bf64444caa380af7114840d121ef3 100644 (file)
@@ -6371,5 +6371,5 @@ void lsarpc_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_lsarpc_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "lsarpc", "lsarpc", api_lsarpc_cmds, sizeof(api_lsarpc_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "lsarpc", "lsarpc", &ndr_table_lsarpc.syntax_id, api_lsarpc_cmds, sizeof(api_lsarpc_cmds) / sizeof(struct api_struct));
 }
index 67876f11ef82a5bf9d8a2973e275d537f42672f4..154ef71d4038d9e9ebde69042158f14381658524 100644 (file)
@@ -3862,5 +3862,5 @@ void netlogon_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_netlogon_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "netlogon", "netlogon", api_netlogon_cmds, sizeof(api_netlogon_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "netlogon", "netlogon", &ndr_table_netlogon.syntax_id, api_netlogon_cmds, sizeof(api_netlogon_cmds) / sizeof(struct api_struct));
 }
index 523b4d8c91e4c71ec4fa6bc85c2aab3fa1758d2c..d21e86db6e67a803119c8d65939b8b873a78a321 100644 (file)
@@ -4865,5 +4865,5 @@ void ntsvcs_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_ntsvcs_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "ntsvcs", "ntsvcs", api_ntsvcs_cmds, sizeof(api_ntsvcs_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "ntsvcs", "ntsvcs", &ndr_table_ntsvcs.syntax_id, api_ntsvcs_cmds, sizeof(api_ntsvcs_cmds) / sizeof(struct api_struct));
 }
index 39945879811475c8720a7a34ec2ed4d53a20416d..1eaa19eaf720d6a567f54e1d71f48d0df7355302 100644 (file)
@@ -5478,5 +5478,5 @@ void samr_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_samr_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "samr", "samr", api_samr_cmds, sizeof(api_samr_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "samr", "samr", &ndr_table_samr.syntax_id, api_samr_cmds, sizeof(api_samr_cmds) / sizeof(struct api_struct));
 }
index 9f4055c35a22d9742255831896789297d39285aa..66faaaaf7e482489b0750385da4eecbcb3f2167e 100644 (file)
@@ -4195,5 +4195,5 @@ void srvsvc_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_srvsvc_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "srvsvc", "srvsvc", api_srvsvc_cmds, sizeof(api_srvsvc_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "srvsvc", "srvsvc", &ndr_table_srvsvc.syntax_id, api_srvsvc_cmds, sizeof(api_srvsvc_cmds) / sizeof(struct api_struct));
 }
index 264dea347436cf6627ce953a5371474b60025e6f..32317ad8feaf6cf7985d05a0f802aa33de7aa658 100644 (file)
@@ -3617,5 +3617,5 @@ void svcctl_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_svcctl_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "svcctl", "svcctl", api_svcctl_cmds, sizeof(api_svcctl_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "svcctl", "svcctl", &ndr_table_svcctl.syntax_id, api_svcctl_cmds, sizeof(api_svcctl_cmds) / sizeof(struct api_struct));
 }
index 4672944ad0dbd6bd1f50c74249187d971f2dd4ce..c697f44d2a3cebda803d50b1b7c4d87c4acfb6bf 100644 (file)
@@ -2768,5 +2768,5 @@ void winreg_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_winreg_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "winreg", "winreg", api_winreg_cmds, sizeof(api_winreg_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "winreg", "winreg", &ndr_table_winreg.syntax_id, api_winreg_cmds, sizeof(api_winreg_cmds) / sizeof(struct api_struct));
 }
index 90e6f482f4cb348cff75315302957967a7e5c626..227e4c1a484b5e15f3a1eb4e054f495f8517162e 100644 (file)
@@ -2408,5 +2408,5 @@ void wkssvc_get_pipe_fns(struct api_struct **fns, int *n_fns)
 
 NTSTATUS rpc_wkssvc_init(void)
 {
-       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "wkssvc", "wkssvc", api_wkssvc_cmds, sizeof(api_wkssvc_cmds) / sizeof(struct api_struct));
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "wkssvc", "wkssvc", &ndr_table_wkssvc.syntax_id, api_wkssvc_cmds, sizeof(api_wkssvc_cmds) / sizeof(struct api_struct));
 }
index 5679a6acb694be69b72c67db0e8d806c8e3c5be2..da761c905eaee7322a66738119aa493fadad482c 100644 (file)
@@ -106,7 +106,8 @@ struct api_struct api_eventlog_cmds[] =
 NTSTATUS rpc_eventlog2_init(void)
 {
        return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, 
-               "eventlog", "eventlog", api_eventlog_cmds,
+               "eventlog", "eventlog", &ndr_table_eventlog.syntax_id,
+               api_eventlog_cmds,
                sizeof(api_eventlog_cmds)/sizeof(struct api_struct));
 }
 
index 12fffc3e9690bb2630072353fd44ad1e6283cc6f..100d577010fa7cfc7b62691d2ef66f98e2555881 100644 (file)
@@ -155,6 +155,9 @@ void ntsvcs2_get_pipe_fns( struct api_struct **fns, int *n_fns )
 
 NTSTATUS rpc_ntsvcs2_init(void)
 {
-  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "ntsvcs", "ntsvcs", api_ntsvcs_cmds,
+  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION,
+                                   "ntsvcs", "ntsvcs",
+                                   &ndr_table_ntsvcs.syntax_id,
+                                   api_ntsvcs_cmds,
                                    sizeof(api_ntsvcs_cmds) / sizeof(struct api_struct));
 }
index f8ec4bfc91d442367d7b69e2a2bacfe3fa77ed90..48e6646c7529e635da396f291374f0d5db9446fb 100644 (file)
@@ -718,6 +718,7 @@ struct rpc_table {
                const char *clnt;
                const char *srv;
        } pipe;
+       struct ndr_syntax_id rpc_interface;
        const struct api_struct *cmds;
        int n_cmds;
 };
@@ -1039,7 +1040,10 @@ bool check_bind_req(struct pipes_struct *p, RPC_IFACE* abstract,
  Register commands to an RPC pipe
 *******************************************************************/
 
-NTSTATUS rpc_pipe_register_commands(int version, const char *clnt, const char *srv, const struct api_struct *cmds, int size)
+NTSTATUS rpc_pipe_register_commands(int version, const char *clnt,
+                                   const char *srv,
+                                   const struct ndr_syntax_id *interface,
+                                   const struct api_struct *cmds, int size)
 {
         struct rpc_table *rpc_entry;
 
@@ -1079,6 +1083,7 @@ NTSTATUS rpc_pipe_register_commands(int version, const char *clnt, const char *s
         ZERO_STRUCTP(rpc_entry);
         rpc_entry->pipe.clnt = SMB_STRDUP(clnt);
         rpc_entry->pipe.srv = SMB_STRDUP(srv);
+       rpc_entry->rpc_interface = *interface;
         rpc_entry->cmds = cmds;
         rpc_entry->n_cmds = size;
         
@@ -1575,16 +1580,22 @@ bool api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p)
                goto err_exit;
        }
 
+       if (hdr_rb.num_contexts == 0) {
+               DEBUG(0, ("api_pipe_bind_req: no rpc contexts around\n"));
+               goto err_exit;
+       }
+
        /*
         * Try and find the correct pipe name to ensure
         * that this is a pipe name we support.
         */
 
-
        for (i = 0; i < rpc_lookup_size; i++) {
-               if (strequal(rpc_lookup[i].pipe.clnt, p->name)) {
+               if (ndr_syntax_id_equal(&rpc_lookup[i].rpc_interface,
+                                       &hdr_rb.rpc_context[0].abstract)) {
                        DEBUG(3, ("api_pipe_bind_req: \\PIPE\\%s -> \\PIPE\\%s\n",
                                rpc_lookup[i].pipe.clnt, rpc_lookup[i].pipe.srv));
+                       fstrcpy(p->name, rpc_lookup[i].pipe.clnt);
                        fstrcpy(p->pipe_srv_name, rpc_lookup[i].pipe.srv);
                        break;
                }
index 7802fe447e7c20347a84d502111a4d3233a3af55..4744b902633a2a8f80686f50c3f71499a338522e 100644 (file)
@@ -1630,8 +1630,19 @@ void spoolss_get_pipe_fns( struct api_struct **fns, int *n_fns )
        *n_fns = sizeof(api_spoolss_cmds) / sizeof(struct api_struct);
 }
 
+static const struct ndr_syntax_id syntax_spoolss = {
+       {
+               0x12345678, 0x1234, 0xabcd,
+               { 0xef, 0x00 },
+               { 0x01, 0x23,
+                 0x45, 0x67, 0x89, 0xab }
+       }, 0x01
+};
+
 NTSTATUS rpc_spoolss_init(void)
 {
-  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "spoolss", "spoolss", api_spoolss_cmds,
+  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION,
+                                   "spoolss", "spoolss", &syntax_spoolss,
+                                   api_spoolss_cmds,
                                    sizeof(api_spoolss_cmds) / sizeof(struct api_struct));
 }
index e3ff2cc8a05081c6282b267f1857c9c08be96814..483fb8e1e9b65b096d5464ee1f92e665fba70e16 100644 (file)
@@ -266,6 +266,8 @@ void svcctl2_get_pipe_fns( struct api_struct **fns, int *n_fns )
 NTSTATUS rpc_svcctl2_init(void)
 {
        return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION,
-                                         "svcctl", "ntsvcs", api_svcctl_cmds,
+                                         "svcctl", "ntsvcs",
+                                         &ndr_table_svcctl.syntax_id,
+                                         api_svcctl_cmds,
                                          sizeof(api_svcctl_cmds) / sizeof(struct api_struct));
 }