[SCM] Samba Shared Repository - branch master updated -
release-4-0-0alpha6-755-ge3e03d7
Günther Deschner
gd at samba.org
Tue Feb 10 22:58:10 GMT 2009
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 <gd at 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 <gd at samba.org>
Date: Mon Feb 9 15:16:25 2009 +0100
s3-spoolss: remove old spoolss_ReplyOpenPrinter.
Guenther
commit c1dbcd4cf8adca907f4088b98998c85a07c1c6bc
Author: Günther Deschner <gd at 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 <gd at samba.org>
Date: Mon Feb 9 15:15:26 2009 +0100
s3-spoolss: use rpccli_spoolss_ReplyOpenPrinter.
Guenther
commit 1c82217c01e516ad7ca78b25f659d4e38b2a2753
Author: Günther Deschner <gd at samba.org>
Date: Mon Feb 9 15:14:52 2009 +0100
s3: re-run make samba3-idl.
Guenther
commit f4c46bc2e831eda7483eaa84b060dd193102bd42
Author: Günther Deschner <gd at 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
More information about the samba-cvs
mailing list