[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 = &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


More information about the samba-cvs mailing list