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 = ¬ify_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