The branch, master has been updated
       via  e3e03d7d83eabfb728cd31c0ae6848ca094c0274 (commit)
       via  fd8e8d5e58a2df09be591852c475e18a11c51ae1 (commit)
       via  c1dbcd4cf8adca907f4088b98998c85a07c1c6bc (commit)
       via  aee462893b0a215ef72ae413d48f58fd8584a9c1 (commit)
       via  1c82217c01e516ad7ca78b25f659d4e38b2a2753 (commit)
       via  f4c46bc2e831eda7483eaa84b060dd193102bd42 (commit)
      from  a45c5c607ab3c43d947dad96b46a94b81b6a9559 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit e3e03d7d83eabfb728cd31c0ae6848ca094c0274
Author: Günther Deschner <g...@samba.org>
Date:   Mon Feb 9 15:50:34 2009 +0100

    s4-spoolss: fix dcerpc_spoolss_ReplyOpenPrinter caller.
    
    Guenther

commit fd8e8d5e58a2df09be591852c475e18a11c51ae1
Author: Günther Deschner <g...@samba.org>
Date:   Mon Feb 9 15:16:25 2009 +0100

    s3-spoolss: remove old spoolss_ReplyOpenPrinter.
    
    Guenther

commit c1dbcd4cf8adca907f4088b98998c85a07c1c6bc
Author: Günther Deschner <g...@samba.org>
Date:   Mon Feb 9 15:15:46 2009 +0100

    s4-smbtorture: fix SPOOLSS test w.r.t. spoolss_ReplyOpenPrinter.
    
    Guenther

commit aee462893b0a215ef72ae413d48f58fd8584a9c1
Author: Günther Deschner <g...@samba.org>
Date:   Mon Feb 9 15:15:26 2009 +0100

    s3-spoolss: use rpccli_spoolss_ReplyOpenPrinter.
    
    Guenther

commit 1c82217c01e516ad7ca78b25f659d4e38b2a2753
Author: Günther Deschner <g...@samba.org>
Date:   Mon Feb 9 15:14:52 2009 +0100

    s3: re-run make samba3-idl.
    
    Guenther

commit f4c46bc2e831eda7483eaa84b060dd193102bd42
Author: Günther Deschner <g...@samba.org>
Date:   Mon Feb 9 15:14:30 2009 +0100

    spoolss: fix spoolss_ReplyOpenPrinter IDL.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 librpc/gen_ndr/cli_spoolss.c                |    8 ++--
 librpc/gen_ndr/cli_spoolss.h                |    4 +-
 librpc/gen_ndr/ndr_spoolss.c                |   42 +++++++++++++--
 librpc/gen_ndr/spoolss.h                    |    4 +-
 librpc/idl/spoolss.idl                      |    4 +-
 source3/include/proto.h                     |    7 ---
 source3/include/rpc_spoolss.h               |   17 ------
 source3/rpc_client/cli_spoolss_notify.c     |   36 -------------
 source3/rpc_parse/parse_spoolss.c           |   73 ---------------------------
 source3/rpc_server/srv_spoolss_nt.c         |   18 ++++---
 source4/rpc_server/spoolss/dcesrv_spoolss.c |    4 +-
 source4/torture/rpc/spoolss.c               |    4 +-
 12 files changed, 60 insertions(+), 161 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/cli_spoolss.c b/librpc/gen_ndr/cli_spoolss.c
index fbbbfd4..4906d23 100644
--- a/librpc/gen_ndr/cli_spoolss.c
+++ b/librpc/gen_ndr/cli_spoolss.c
@@ -2743,8 +2743,8 @@ NTSTATUS rpccli_spoolss_ReplyOpenPrinter(struct 
rpc_pipe_client *cli,
                                         const char *server_name /* [in] 
[charset(UTF16)] */,
                                         uint32_t printer_local /* [in]  */,
                                         enum winreg_Type type /* [in]  */,
-                                        uint32_t unknown1 /* [in]  */,
-                                        uint32_t unknown2 /* [in]  */,
+                                        uint32_t bufsize /* [in] 
[range(0,512)] */,
+                                        uint8_t *buffer /* [in] 
[unique,size_is(bufsize)] */,
                                         struct policy_handle *handle /* [out] 
[ref] */,
                                         WERROR *werror)
 {
@@ -2755,8 +2755,8 @@ NTSTATUS rpccli_spoolss_ReplyOpenPrinter(struct 
rpc_pipe_client *cli,
        r.in.server_name = server_name;
        r.in.printer_local = printer_local;
        r.in.type = type;
-       r.in.unknown1 = unknown1;
-       r.in.unknown2 = unknown2;
+       r.in.bufsize = bufsize;
+       r.in.buffer = buffer;
 
        if (DEBUGLEVEL >= 10) {
                NDR_PRINT_IN_DEBUG(spoolss_ReplyOpenPrinter, &r);
diff --git a/librpc/gen_ndr/cli_spoolss.h b/librpc/gen_ndr/cli_spoolss.h
index 852f53d..9eb43d6 100644
--- a/librpc/gen_ndr/cli_spoolss.h
+++ b/librpc/gen_ndr/cli_spoolss.h
@@ -343,8 +343,8 @@ NTSTATUS rpccli_spoolss_ReplyOpenPrinter(struct 
rpc_pipe_client *cli,
                                         const char *server_name /* [in] 
[charset(UTF16)] */,
                                         uint32_t printer_local /* [in]  */,
                                         enum winreg_Type type /* [in]  */,
-                                        uint32_t unknown1 /* [in]  */,
-                                        uint32_t unknown2 /* [in]  */,
+                                        uint32_t bufsize /* [in] 
[range(0,512)] */,
+                                        uint8_t *buffer /* [in] 
[unique,size_is(bufsize)] */,
                                         struct policy_handle *handle /* [out] 
[ref] */,
                                         WERROR *werror);
 NTSTATUS rpccli_spoolss_RouterReplyPrinter(struct rpc_pipe_client *cli,
diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c
index 8cc9957..c696e53 100644
--- a/librpc/gen_ndr/ndr_spoolss.c
+++ b/librpc/gen_ndr/ndr_spoolss.c
@@ -14289,8 +14289,12 @@ _PUBLIC_ enum ndr_err_code 
ndr_push_spoolss_ReplyOpenPrinter(struct ndr_push *nd
                NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.server_name, 
ndr_charset_length(r->in.server_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 
r->in.printer_local));
                NDR_CHECK(ndr_push_winreg_Type(ndr, NDR_SCALARS, r->in.type));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.unknown1));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.unknown2));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.bufsize));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.buffer));
+               if (r->in.buffer) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 
r->in.bufsize));
+                       NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, 
r->in.buffer, r->in.bufsize));
+               }
        }
        if (flags & NDR_OUT) {
                if (r->out.handle == NULL) {
@@ -14304,6 +14308,8 @@ _PUBLIC_ enum ndr_err_code 
ndr_push_spoolss_ReplyOpenPrinter(struct ndr_push *nd
 
 _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_ReplyOpenPrinter(struct ndr_pull 
*ndr, int flags, struct spoolss_ReplyOpenPrinter *r)
 {
+       uint32_t _ptr_buffer;
+       TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_handle_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
@@ -14317,10 +14323,29 @@ _PUBLIC_ enum ndr_err_code 
ndr_pull_spoolss_ReplyOpenPrinter(struct ndr_pull *nd
                NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, 
&r->in.server_name, ndr_get_array_length(ndr, &r->in.server_name), 
sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, 
&r->in.printer_local));
                NDR_CHECK(ndr_pull_winreg_Type(ndr, NDR_SCALARS, &r->in.type));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.unknown1));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.unknown2));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.bufsize));
+               if (r->in.bufsize > 512) {
+                       return ndr_pull_error(ndr, NDR_ERR_RANGE, "value out of 
range");
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_buffer));
+               if (_ptr_buffer) {
+                       NDR_PULL_ALLOC(ndr, r->in.buffer);
+               } else {
+                       r->in.buffer = NULL;
+               }
+               if (r->in.buffer) {
+                       _mem_save_buffer_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.buffer, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->in.buffer));
+                       NDR_PULL_ALLOC_N(ndr, r->in.buffer, 
ndr_get_array_size(ndr, &r->in.buffer));
+                       NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, 
r->in.buffer, ndr_get_array_size(ndr, &r->in.buffer)));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_buffer_0, 0);
+               }
                NDR_PULL_ALLOC(ndr, r->out.handle);
                ZERO_STRUCTP(r->out.handle);
+               if (r->in.buffer) {
+                       NDR_CHECK(ndr_check_array_size(ndr, 
(void*)&r->in.buffer, r->in.bufsize));
+               }
        }
        if (flags & NDR_OUT) {
                if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
@@ -14348,8 +14373,13 @@ _PUBLIC_ void 
ndr_print_spoolss_ReplyOpenPrinter(struct ndr_print *ndr, const ch
                ndr_print_string(ndr, "server_name", r->in.server_name);
                ndr_print_uint32(ndr, "printer_local", r->in.printer_local);
                ndr_print_winreg_Type(ndr, "type", r->in.type);
-               ndr_print_uint32(ndr, "unknown1", r->in.unknown1);
-               ndr_print_uint32(ndr, "unknown2", r->in.unknown2);
+               ndr_print_uint32(ndr, "bufsize", r->in.bufsize);
+               ndr_print_ptr(ndr, "buffer", r->in.buffer);
+               ndr->depth++;
+               if (r->in.buffer) {
+                       ndr_print_array_uint8(ndr, "buffer", r->in.buffer, 
r->in.bufsize);
+               }
+               ndr->depth--;
                ndr->depth--;
        }
        if (flags & NDR_OUT) {
diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h
index 5934cfa..b503f66 100644
--- a/librpc/gen_ndr/spoolss.h
+++ b/librpc/gen_ndr/spoolss.h
@@ -1802,8 +1802,8 @@ struct spoolss_ReplyOpenPrinter {
                const char *server_name;/* [charset(UTF16)] */
                uint32_t printer_local;
                enum winreg_Type type;
-               uint32_t unknown1;
-               uint32_t unknown2;
+               uint32_t bufsize;/* [range(0,512)] */
+               uint8_t *buffer;/* [unique,size_is(bufsize)] */
        } in;
 
        struct {
diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl
index d7513e5..74924c0 100644
--- a/librpc/idl/spoolss.idl
+++ b/librpc/idl/spoolss.idl
@@ -1160,8 +1160,8 @@ import "misc.idl", "security.idl", "winreg.idl";
                [in,string,charset(UTF16)] uint16 server_name[],
                [in] uint32 printer_local,
                [in] winreg_Type type,
-               [in] uint32 unknown1,
-               [in] uint32 unknown2,
+               [in,range(0,512)] uint32 bufsize,
+               [in,unique,size_is(bufsize)] uint8 *buffer,
                [out,ref] policy_handle *handle
        );
 
diff --git a/source3/include/proto.h b/source3/include/proto.h
index fd6ccce..8f05c94 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -5510,9 +5510,6 @@ WERROR rpccli_spoolss_enumprinterkey(struct 
rpc_pipe_client *cli, TALLOC_CTX *me
 
 /* The following definitions come from rpc_client/cli_spoolss_notify.c  */
 
-WERROR rpccli_spoolss_reply_open_printer(struct rpc_pipe_client *cli, 
TALLOC_CTX *mem_ctx, 
-                                     const char *printer, uint32 printerlocal, 
uint32 type, 
-                                     POLICY_HND *handle);
 WERROR rpccli_spoolss_rrpcn(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, 
                         POLICY_HND *pol, uint32 notify_data_len,
                         SPOOL_NOTIFY_INFO_DATA *notify_data,
@@ -6001,10 +5998,6 @@ void free_printer_info_5(PRINTER_INFO_5 *printer);
 void free_printer_info_6(PRINTER_INFO_6 *printer);
 void free_printer_info_7(PRINTER_INFO_7 *printer);
 void free_job_info_2(JOB_INFO_2 *job);
-bool make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u, 
-                              const fstring string, uint32 printer, uint32 
type);
-bool spoolss_io_q_replyopenprinter(const char *desc, SPOOL_Q_REPLYOPENPRINTER 
*q_u, prs_struct *ps, int depth);
-bool spoolss_io_r_replyopenprinter(const char *desc, SPOOL_R_REPLYOPENPRINTER 
*r_u, prs_struct *ps, int depth);
 bool make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
                                uint32 change_low, uint32 change_high,
                                SPOOL_NOTIFY_INFO *info);
diff --git a/source3/include/rpc_spoolss.h b/source3/include/rpc_spoolss.h
index 05b4858..56d4c44 100644
--- a/source3/include/rpc_spoolss.h
+++ b/source3/include/rpc_spoolss.h
@@ -1466,23 +1466,6 @@ typedef struct spool_r_getjob
 }
 SPOOL_R_GETJOB;
 
-typedef struct spool_q_replyopenprinter
-{
-       UNISTR2 string;
-       uint32 printer;
-       uint32 type;
-       uint32 unknown0;
-       uint32 unknown1;
-}
-SPOOL_Q_REPLYOPENPRINTER;
-
-typedef struct spool_r_replyopenprinter
-{
-       POLICY_HND handle;
-       WERROR status;
-}
-SPOOL_R_REPLYOPENPRINTER;
-
 typedef struct spool_q_rrpcn
 {
        POLICY_HND handle;
diff --git a/source3/rpc_client/cli_spoolss_notify.c 
b/source3/rpc_client/cli_spoolss_notify.c
index 1115275..8ae7835 100644
--- a/source3/rpc_client/cli_spoolss_notify.c
+++ b/source3/rpc_client/cli_spoolss_notify.c
@@ -29,42 +29,6 @@
  * back channel.
  */
 
-/* Send a ReplyOpenPrinter request.  This rpc is made by the printer
-   server to the printer client in response to a rffpcnex request.
-   The rrfpcnex request names a printer and a handle (the printerlocal
-   value) and this rpc establishes a back-channel over which printer
-   notifications are performed. */
-
-WERROR rpccli_spoolss_reply_open_printer(struct rpc_pipe_client *cli, 
TALLOC_CTX *mem_ctx, 
-                                     const char *printer, uint32 printerlocal, 
uint32 type, 
-                                     POLICY_HND *handle)
-{
-       prs_struct qbuf, rbuf;
-       SPOOL_Q_REPLYOPENPRINTER q;
-       SPOOL_R_REPLYOPENPRINTER r;
-       WERROR result = W_ERROR(ERRgeneral);
-       
-       /* Initialise input parameters */
-
-       make_spoolss_q_replyopenprinter(&q, printer, printerlocal, type);
-
-       /* Marshall data and send request */
-
-       CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, 
SPOOLSS_REPLYOPENPRINTER,
-               q, r,
-               qbuf, rbuf,
-               spoolss_io_q_replyopenprinter,
-               spoolss_io_r_replyopenprinter,
-               WERR_GENERAL_FAILURE );
-
-       /* Return result */
-
-       memcpy(handle, &r.handle, sizeof(r.handle));
-       result = r.status;
-
-       return result;
-}
-
 /*********************************************************************
  This SPOOLSS_REPLY_RRPCN function is used to send a change 
  notification event when the registration **did** use 
diff --git a/source3/rpc_parse/parse_spoolss.c 
b/source3/rpc_parse/parse_spoolss.c
index af2378b..f11672a 100644
--- a/source3/rpc_parse/parse_spoolss.c
+++ b/source3/rpc_parse/parse_spoolss.c
@@ -5022,79 +5022,6 @@ void free_job_info_2(JOB_INFO_2 *job)
         free_devmode(job->devmode);
 }
 
-/*******************************************************************
- * init a structure.
- ********************************************************************/
-
-bool make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u, 
-                              const fstring string, uint32 printer, uint32 
type)
-{      
-       if (q_u == NULL)
-               return False;
-
-       init_unistr2(&q_u->string, string, UNI_STR_TERMINATE);
-
-       q_u->printer=printer;
-       q_u->type=type;
-
-       q_u->unknown0=0x0;
-       q_u->unknown1=0x0;
-
-       return True;
-}
-
-/*******************************************************************
- Parse a SPOOL_Q_REPLYOPENPRINTER structure.
-********************************************************************/  
-
-bool spoolss_io_q_replyopenprinter(const char *desc, SPOOL_Q_REPLYOPENPRINTER 
*q_u, prs_struct *ps, int depth)
-{
-       prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
-       depth++;
-
-       if(!prs_align(ps))
-               return False;
-
-       if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
-               return False;
-
-       if(!prs_align(ps))
-               return False;
-
-       if(!prs_uint32("printer", ps, depth, &q_u->printer))
-               return False;
-       if(!prs_uint32("type", ps, depth, &q_u->type))
-               return False;
-       
-       if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
-               return False;
-       if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
- Parse a SPOOL_R_REPLYOPENPRINTER structure.
-********************************************************************/  
-
-bool spoolss_io_r_replyopenprinter(const char *desc, SPOOL_R_REPLYOPENPRINTER 
*r_u, prs_struct *ps, int depth)
-{              
-       prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
-       depth++;
-
-       if (!prs_align(ps))
-               return False;
-
-       if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
-               return False;
-
-       if (!prs_werror("status", ps, depth, &r_u->status))
-               return False;
-
-       return True;            
-}
-
 #if 0  /* JERRY - not currently used but could be :-) */
 
 /*******************************************************************
diff --git a/source3/rpc_server/srv_spoolss_nt.c 
b/source3/rpc_server/srv_spoolss_nt.c
index b1c551b..36984fc 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -2589,6 +2589,7 @@ static bool srv_spoolss_replyopenprinter(int snum, const 
char *printer,
                                        POLICY_HND *handle, struct 
sockaddr_storage *client_ss)
 {
        WERROR result;
+       NTSTATUS status;
 
        /*
         * If it's the first connection, contact the client
@@ -2620,14 +2621,15 @@ static bool srv_spoolss_replyopenprinter(int snum, 
const char *printer,
 
        smb_connections++;
 
-       result = rpccli_spoolss_reply_open_printer(notify_cli_pipe,
-                       talloc_tos(),
-                       printer,
-                       localprinter,
-                       type,
-                       handle);
-
-       if (!W_ERROR_IS_OK(result))
+       status = rpccli_spoolss_ReplyOpenPrinter(notify_cli_pipe, talloc_tos(),
+                                                printer,
+                                                localprinter,
+                                                type,
+                                                0,
+                                                NULL,
+                                                handle,
+                                                &result);
+       if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(result))
                DEBUG(5,("srv_spoolss_reply_open_printer: Client RPC returned 
[%s]\n",
                        win_errstr(result)));
 
diff --git a/source4/rpc_server/spoolss/dcesrv_spoolss.c 
b/source4/rpc_server/spoolss/dcesrv_spoolss.c
index e137497..d127837 100644
--- a/source4/rpc_server/spoolss/dcesrv_spoolss.c
+++ b/source4/rpc_server/spoolss/dcesrv_spoolss.c
@@ -1180,8 +1180,8 @@ static WERROR 
dcesrv_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_
        W_ERROR_HAVE_NO_MEMORY(rop.in.server_name);
        rop.in.printer_local = 0;
        rop.in.type = REG_NONE;
-       rop.in.unknown1 = 0;
-       rop.in.unknown2 = 0;
+       rop.in.bufsize = 0;
+       rop.in.buffer = NULL;
        rop.out.handle = &notify_handle;
 
        status = dcerpc_spoolss_ReplyOpenPrinter(p, mem_ctx, &rop);
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index 7da3209..3e72bde 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -1740,8 +1740,8 @@ static bool test_ReplyOpenPrinter(struct torture_context 
*tctx,
        r.in.server_name = "earth";
        r.in.printer_local = 2;
        r.in.type = REG_DWORD;
-       r.in.unknown1 = 0;
-       r.in.unknown2 = 0;
+       r.in.bufsize = 0;
+       r.in.buffer = NULL;
        r.out.handle = &h;
 
        torture_assert_ntstatus_ok(tctx, 


-- 
Samba Shared Repository

Reply via email to