[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Mon Apr 19 03:54:27 MDT 2010


The branch, master has been updated
       via  0b2e5de... s3-smb2: fix some c++ warnings.
       via  7b84d36... s3-spoolss: fix samr_ValidatePassword_Change.
       via  7277668... spoolss: move up enum spoolss_Build in the IDL.
       via  2033314... s3-lanman: use spoolss for api_WPrintJobGetInfo().
       via  0c80d12... s3-lanman: use spoolss for api_WPrintJobEnumerate().
      from  0277143... s3: re-run make samba3-idl.

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


- Log -----------------------------------------------------------------
commit 0b2e5debb004ed586e0ec7d926311c32a8b8f9e6
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 19 11:53:11 2010 +0200

    s3-smb2: fix some c++ warnings.
    
    Guenther

commit 7b84d36f19a29e33735bde08151e540d4c2b86b1
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 19 11:46:03 2010 +0200

    s3-spoolss: fix samr_ValidatePassword_Change.
    
    Guenther

commit 7277668128e3a8c138e9dc48ce6c2e85d1aac34f
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 19 11:45:33 2010 +0200

    spoolss: move up enum spoolss_Build in the IDL.
    
    Guenther

commit 2033314a7ca731e9cea76cb3296c3dc85660ae30
Author: Günther Deschner <gd at samba.org>
Date:   Sat Apr 10 01:44:08 2010 +0200

    s3-lanman: use spoolss for api_WPrintJobGetInfo().
    
    Guenther

commit 0c80d12656267c4e932f8e22750e827d53997f07
Author: Günther Deschner <gd at samba.org>
Date:   Sat Apr 10 01:33:37 2010 +0200

    s3-lanman: use spoolss for api_WPrintJobEnumerate().
    
    Guenther

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

Summary of changes:
 librpc/gen_ndr/ndr_spoolss.c     |   50 ++++----
 librpc/gen_ndr/ndr_spoolss.h     |    2 +-
 librpc/gen_ndr/spoolss.h         |   26 ++--
 librpc/idl/spoolss.idl           |   10 +-
 source3/rpc_server/srv_samr_nt.c |    2 +-
 source3/smbd/lanman.c            |  228 ++++++++++++++++++++++++++++++++------
 source3/smbd/smb2_server.c       |    6 +-
 7 files changed, 244 insertions(+), 80 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c
index a2355b7..552f894 100644
--- a/librpc/gen_ndr/ndr_spoolss.c
+++ b/librpc/gen_ndr/ndr_spoolss.c
@@ -308,6 +308,31 @@ _PUBLIC_ void ndr_print_spoolss_JobStatus(struct ndr_print *ndr, const char *nam
 	ndr->depth--;
 }
 
+static enum ndr_err_code ndr_push_spoolss_Build(struct ndr_push *ndr, int ndr_flags, enum spoolss_Build r)
+{
+	NDR_CHECK(ndr_push_enum_uint32(ndr, NDR_SCALARS, r));
+	return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_Build(struct ndr_pull *ndr, int ndr_flags, enum spoolss_Build *r)
+{
+	uint32_t v;
+	NDR_CHECK(ndr_pull_enum_uint32(ndr, NDR_SCALARS, &v));
+	*r = v;
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_Build(struct ndr_print *ndr, const char *name, enum spoolss_Build r)
+{
+	const char *val = NULL;
+
+	switch (r) {
+		case SPOOLSS_DEBUGGING_BUILD: val = "SPOOLSS_DEBUGGING_BUILD"; break;
+		case SPOOLSS_RELEASE_BUILD: val = "SPOOLSS_RELEASE_BUILD"; break;
+	}
+	ndr_print_enum(ndr, name, "ENUM", val, r);
+}
+
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo0(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PrinterInfo0 *r)
 {
 	if (ndr_flags & NDR_SCALARS) {
@@ -6810,31 +6835,6 @@ _PUBLIC_ void ndr_print_spoolss_PrinterControl(struct ndr_print *ndr, const char
 	ndr_print_enum(ndr, name, "ENUM", val, r);
 }
 
-static enum ndr_err_code ndr_push_spoolss_Build(struct ndr_push *ndr, int ndr_flags, enum spoolss_Build r)
-{
-	NDR_CHECK(ndr_push_enum_uint32(ndr, NDR_SCALARS, r));
-	return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_spoolss_Build(struct ndr_pull *ndr, int ndr_flags, enum spoolss_Build *r)
-{
-	uint32_t v;
-	NDR_CHECK(ndr_pull_enum_uint32(ndr, NDR_SCALARS, &v));
-	*r = v;
-	return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_spoolss_Build(struct ndr_print *ndr, const char *name, enum spoolss_Build r)
-{
-	const char *val = NULL;
-
-	switch (r) {
-		case SPOOLSS_DEBUGGING_BUILD: val = "SPOOLSS_DEBUGGING_BUILD"; break;
-		case SPOOLSS_RELEASE_BUILD: val = "SPOOLSS_RELEASE_BUILD"; break;
-	}
-	ndr_print_enum(ndr, name, "ENUM", val, r);
-}
-
 static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo0(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfo0 *r)
 {
 	if (ndr_flags & NDR_SCALARS) {
diff --git a/librpc/gen_ndr/ndr_spoolss.h b/librpc/gen_ndr/ndr_spoolss.h
index 2ae3466..2f4411e 100644
--- a/librpc/gen_ndr/ndr_spoolss.h
+++ b/librpc/gen_ndr/ndr_spoolss.h
@@ -243,6 +243,7 @@ enum ndr_err_code ndr_push_spoolss_PrinterStatus(struct ndr_push *ndr, int ndr_f
 enum ndr_err_code ndr_pull_spoolss_PrinterStatus(struct ndr_pull *ndr, int ndr_flags, uint32_t *r);
 void ndr_print_spoolss_PrinterStatus(struct ndr_print *ndr, const char *name, uint32_t r);
 void ndr_print_spoolss_JobStatus(struct ndr_print *ndr, const char *name, uint32_t r);
+void ndr_print_spoolss_Build(struct ndr_print *ndr, const char *name, enum spoolss_Build r);
 enum ndr_err_code ndr_push_spoolss_PrinterInfo0(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PrinterInfo0 *r);
 enum ndr_err_code ndr_pull_spoolss_PrinterInfo0(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterInfo0 *r);
 void ndr_print_spoolss_PrinterInfo0(struct ndr_print *ndr, const char *name, const struct spoolss_PrinterInfo0 *r);
@@ -347,7 +348,6 @@ void ndr_print_spoolss_SetJobInfo(struct ndr_print *ndr, const char *name, const
 void ndr_print_spoolss_JobInfoContainer(struct ndr_print *ndr, const char *name, const struct spoolss_JobInfoContainer *r);
 void ndr_print_spoolss_JobControl(struct ndr_print *ndr, const char *name, enum spoolss_JobControl r);
 void ndr_print_spoolss_PrinterControl(struct ndr_print *ndr, const char *name, enum spoolss_PrinterControl r);
-void ndr_print_spoolss_Build(struct ndr_print *ndr, const char *name, enum spoolss_Build r);
 void ndr_print_spoolss_SetPrinterInfo0(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo0 *r);
 void ndr_print_spoolss_SetPrinterInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo1 *r);
 void ndr_print_spoolss_SetPrinterInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo2 *r);
diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h
index f1f0c4f..9d6fb6d 100644
--- a/librpc/gen_ndr/spoolss.h
+++ b/librpc/gen_ndr/spoolss.h
@@ -243,6 +243,19 @@ enum spoolss_MinorVersion
 #define JOB_STATUS_RESTART ( 0x00000800 )
 #define JOB_STATUS_COMPLETE ( 0x00001000 )
 
+enum spoolss_Build
+#ifndef USE_UINT_ENUMS
+ {
+	SPOOLSS_DEBUGGING_BUILD=(int)(0x00000000),
+	SPOOLSS_RELEASE_BUILD=(int)(0x00000001)
+}
+#else
+ { __donnot_use_enum_spoolss_Build=0x7FFFFFFF}
+#define SPOOLSS_DEBUGGING_BUILD ( 0x00000000 )
+#define SPOOLSS_RELEASE_BUILD ( 0x00000001 )
+#endif
+;
+
 struct spoolss_PrinterInfo0 {
 	const char * printername;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
 	const char * servername;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
@@ -1467,19 +1480,6 @@ enum spoolss_PrinterControl
 #endif
 ;
 
-enum spoolss_Build
-#ifndef USE_UINT_ENUMS
- {
-	SPOOLSS_DEBUGGING_BUILD=(int)(0x00000000),
-	SPOOLSS_RELEASE_BUILD=(int)(0x00000001)
-}
-#else
- { __donnot_use_enum_spoolss_Build=0x7FFFFFFF}
-#define SPOOLSS_DEBUGGING_BUILD ( 0x00000000 )
-#define SPOOLSS_RELEASE_BUILD ( 0x00000001 )
-#endif
-;
-
 struct spoolss_SetPrinterInfo0 {
 	const char *servername;/* [unique,charset(UTF16)] */
 	const char *printername;/* [unique,charset(UTF16)] */
diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl
index 1e5d1f2..4127ffb 100644
--- a/librpc/idl/spoolss.idl
+++ b/librpc/idl/spoolss.idl
@@ -119,6 +119,11 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor")
 		JOB_STATUS_COMPLETE		= 0x00001000
 	} spoolss_JobStatus;
 
+	typedef [v1_enum] enum {
+		SPOOLSS_DEBUGGING_BUILD		= 0x00000000,
+		SPOOLSS_RELEASE_BUILD		= 0x00000001
+	} spoolss_Build;
+
 	typedef [public,gensize] struct {
 		[relative] nstring *printername;
 		[relative] nstring *servername;
@@ -1146,11 +1151,6 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor")
 		SPOOLSS_PRINTER_CONTROL_SET_STATUS = 4
 	} spoolss_PrinterControl;
 
-	typedef [v1_enum] enum {
-		SPOOLSS_DEBUGGING_BUILD		= 0x00000000,
-		SPOOLSS_RELEASE_BUILD		= 0x00000001
-	} spoolss_Build;
-
 	typedef struct {
 		[string,charset(UTF16)] uint16 *servername;
 		[string,charset(UTF16)] uint16 *printername;
diff --git a/source3/rpc_server/srv_samr_nt.c b/source3/rpc_server/srv_samr_nt.c
index 3ebfe39..97ed381 100644
--- a/source3/rpc_server/srv_samr_nt.c
+++ b/source3/rpc_server/srv_samr_nt.c
@@ -6698,7 +6698,7 @@ static enum samr_ValidationStatus samr_ValidatePassword_Change(TALLOC_CTX *mem_c
 	NTSTATUS status;
 
 	if (req->password.string == NULL) {
-		SAMR_VALIDATION_STATUS_SUCCESS;
+		return SAMR_VALIDATION_STATUS_SUCCESS;
 	}
 	if (strlen(req->password.string) < dom_pw_info->min_password_length) {
 		ZERO_STRUCT(rep->info);
diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c
index b9d531f..71d1f4d 100644
--- a/source3/smbd/lanman.c
+++ b/source3/smbd/lanman.c
@@ -547,6 +547,19 @@ static int printj_status(int v)
 	return 0;
 }
 
+static int printj_spoolss_status(int v)
+{
+	if (v == JOB_STATUS_QUEUED)
+		return RAP_JOB_STATUS_QUEUED;
+	if (v & JOB_STATUS_PAUSED)
+		return RAP_JOB_STATUS_PAUSED;
+	if (v & JOB_STATUS_SPOOLING)
+		return RAP_JOB_STATUS_SPOOLING;
+	if (v & JOB_STATUS_PRINTING)
+		return RAP_JOB_STATUS_PRINTING;
+	return 0;
+}
+
 /* turn a print queue status into a on the wire status 
 */
 static int printq_status(int v)
@@ -618,6 +631,80 @@ static void fill_printjob_info(connection_struct *conn, int snum, int uLevel,
 	}
 }
 
+static time_t spoolss_Time_to_time_t(const struct spoolss_Time *r)
+{
+	struct tm unixtime;
+
+	unixtime.tm_year	= r->year - 1900;
+	unixtime.tm_mon		= r->month - 1;
+	unixtime.tm_wday	= r->day_of_week;
+	unixtime.tm_mday	= r->day;
+	unixtime.tm_hour	= r->hour;
+	unixtime.tm_min		= r->minute;
+	unixtime.tm_sec		= r->second;
+
+	return mktime(&unixtime);
+}
+
+static void fill_spoolss_printjob_info(int uLevel,
+				       struct pack_desc *desc,
+				       struct spoolss_JobInfo2 *info2,
+				       int n)
+{
+	time_t t = spoolss_Time_to_time_t(&info2->submitted);
+
+	/* the client expects localtime */
+	t -= get_time_zone(t);
+
+	PACKI(desc,"W",pjobid_to_rap(info2->printer_name, info2->job_id)); /* uJobId */
+	if (uLevel == 1) {
+		PACKS(desc,"B21", info2->user_name); /* szUserName */
+		PACKS(desc,"B","");		/* pad */
+		PACKS(desc,"B16","");	/* szNotifyName */
+		PACKS(desc,"B10","PM_Q_RAW"); /* szDataType */
+		PACKS(desc,"z","");		/* pszParms */
+		PACKI(desc,"W",n+1);		/* uPosition */
+		PACKI(desc,"W", printj_spoolss_status(info2->status)); /* fsStatus */
+		PACKS(desc,"z","");		/* pszStatus */
+		PACKI(desc,"D", t); /* ulSubmitted */
+		PACKI(desc,"D", info2->size); /* ulSize */
+		PACKS(desc,"z", info2->document_name); /* pszComment */
+	}
+	if (uLevel == 2 || uLevel == 3 || uLevel == 4) {
+		PACKI(desc,"W", info2->priority);		/* uPriority */
+		PACKS(desc,"z", info2->user_name); /* pszUserName */
+		PACKI(desc,"W",n+1);		/* uPosition */
+		PACKI(desc,"W", printj_spoolss_status(info2->status)); /* fsStatus */
+		PACKI(desc,"D",t); /* ulSubmitted */
+		PACKI(desc,"D", info2->size); /* ulSize */
+		PACKS(desc,"z","Samba");	/* pszComment */
+		PACKS(desc,"z", info2->document_name); /* pszDocument */
+		if (uLevel == 3) {
+			PACKS(desc,"z","");	/* pszNotifyName */
+			PACKS(desc,"z","PM_Q_RAW"); /* pszDataType */
+			PACKS(desc,"z","");	/* pszParms */
+			PACKS(desc,"z","");	/* pszStatus */
+			PACKS(desc,"z", info2->printer_name); /* pszQueue */
+			PACKS(desc,"z","lpd");	/* pszQProcName */
+			PACKS(desc,"z","");	/* pszQProcParms */
+			PACKS(desc,"z","NULL"); /* pszDriverName */
+			PackDriverData(desc);	/* pDriverData */
+			PACKS(desc,"z","");	/* pszPrinterName */
+		} else if (uLevel == 4) {   /* OS2 */
+			PACKS(desc,"z","");       /* pszSpoolFileName  */
+			PACKS(desc,"z","");       /* pszPortName       */
+			PACKS(desc,"z","");       /* pszStatus         */
+			PACKI(desc,"D",0);        /* ulPagesSpooled    */
+			PACKI(desc,"D",0);        /* ulPagesSent       */
+			PACKI(desc,"D",0);        /* ulPagesPrinted    */
+			PACKI(desc,"D",0);        /* ulTimePrinted     */
+			PACKI(desc,"D",0);        /* ulExtendJobStatus */
+			PACKI(desc,"D",0);        /* ulStartPage       */
+			PACKI(desc,"D",0);        /* ulEndPage         */
+		}
+	}
+}
+
 /********************************************************************
  Return a driver name given an snum.
  Returns True if from tdb, False otherwise.
@@ -4184,16 +4271,19 @@ static bool api_WPrintJobGetInfo(connection_struct *conn, uint16 vuid,
 	char *str2 = skip_string(param,tpscnt,str1);
 	char *p = skip_string(param,tpscnt,str2);
 	int uLevel;
-	int count;
-	int i;
-	int snum;
 	fstring sharename;
 	uint32 jobid;
 	struct pack_desc desc;
-	print_queue_struct *queue=NULL;
-	print_status_struct status;
 	char *tmpdata=NULL;
 
+	TALLOC_CTX *mem_ctx = talloc_tos();
+	WERROR werr;
+	NTSTATUS status;
+	struct rpc_pipe_client *cli = NULL;
+	struct policy_handle handle;
+	struct spoolss_DevmodeContainer devmode_ctr;
+	union spoolss_JobInfo info;
+
 	if (!str1 || !str2 || !p) {
 		return False;
 	}
@@ -4217,16 +4307,45 @@ static bool api_WPrintJobGetInfo(connection_struct *conn, uint16 vuid,
 		return False;
 	}
 
-	snum = lp_servicenumber( sharename);
-	if (snum < 0 || !VALID_SNUM(snum)) {
-		return(False);
+	ZERO_STRUCT(handle);
+
+	status = rpc_pipe_open_internal(mem_ctx, &ndr_table_spoolss.syntax_id,
+					rpc_spoolss_dispatch, conn->server_info,
+					&cli);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(0,("api_WPrintJobGetInfo: could not connect to spoolss: %s\n",
+			  nt_errstr(status)));
+		desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
+		goto out;
 	}
 
-	count = print_queue_status(snum,&queue,&status);
-	for (i = 0; i < count; i++) {
-		if (queue[i].job == jobid) {
-			break;
-		}
+	ZERO_STRUCT(devmode_ctr);
+
+	status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+					    sharename,
+					    NULL,
+					    devmode_ctr,
+					    SEC_FLAG_MAXIMUM_ALLOWED,
+					    &handle,
+					    &werr);
+	if (!NT_STATUS_IS_OK(status)) {
+		desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
+		goto out;
+	}
+	if (!W_ERROR_IS_OK(werr)) {
+		desc.errcode = W_ERROR_V(werr);
+		goto out;
+	}
+
+	werr = rpccli_spoolss_getjob(cli, mem_ctx,
+				     &handle,
+				     jobid,
+				     2, /* level */
+				     0, /* offered */
+				     &info);
+	if (!W_ERROR_IS_OK(werr)) {
+		desc.errcode = W_ERROR_V(werr);
+		goto out;
 	}
 
 	if (mdrcnt > 0) {
@@ -4246,13 +4365,15 @@ static bool api_WPrintJobGetInfo(connection_struct *conn, uint16 vuid,
 	}
 
 	if (init_package(&desc,1,0)) {
-		if (i < count) {
-			fill_printjob_info(conn,snum,uLevel,&desc,&queue[i],i);
-			*rdata_len = desc.usedlen;
-		} else {
-			desc.errcode = NERR_JobNotFound;
-			*rdata_len = 0;
-		}
+		fill_spoolss_printjob_info(uLevel, &desc, &info.info2, info.info2.position);
+		*rdata_len = desc.usedlen;
+	} else {
+		desc.errcode = NERR_JobNotFound;
+		*rdata_len = 0;
+	}
+ out:
+	if (is_valid_policy_hnd(&handle)) {
+		rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
 	}
 
 	*rparam_len = 6;
@@ -4264,7 +4385,6 @@ static bool api_WPrintJobGetInfo(connection_struct *conn, uint16 vuid,
 	SSVAL(*rparam,2,0);
 	SSVAL(*rparam,4,desc.neededlen);
 
-	SAFE_FREE(queue);
 	SAFE_FREE(tmpdata);
 
 	DEBUG(4,("WPrintJobGetInfo: errorcode %d\n",desc.errcode));
@@ -4284,12 +4404,17 @@ static bool api_WPrintJobEnumerate(connection_struct *conn, uint16 vuid,
 	char *p = skip_string(param,tpscnt,str2);
 	char *name = p;
 	int uLevel;
-	int count;
 	int i, succnt=0;
-	int snum;
 	struct pack_desc desc;
-	print_queue_struct *queue=NULL;
-	print_status_struct status;
+
+	TALLOC_CTX *mem_ctx = talloc_tos();
+	WERROR werr;
+	NTSTATUS status;
+	struct rpc_pipe_client *cli = NULL;
+	struct policy_handle handle;
+	struct spoolss_DevmodeContainer devmode_ctr;
+	uint32_t count;
+	union spoolss_JobInfo *info;
 
 	if (!str1 || !str2 || !p) {
 		return False;
@@ -4319,12 +4444,49 @@ static bool api_WPrintJobEnumerate(connection_struct *conn, uint16 vuid,
 		return False;
 	}
 
-	snum = find_service(name);
-	if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) {
-		return False;
+	ZERO_STRUCT(handle);
+
+	status = rpc_pipe_open_internal(mem_ctx, &ndr_table_spoolss.syntax_id,
+					rpc_spoolss_dispatch, conn->server_info,
+					&cli);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(0,("api_RDosPrintJobDel: could not connect to spoolss: %s\n",
+			  nt_errstr(status)));
+		desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
+		goto out;
+	}
+
+	ZERO_STRUCT(devmode_ctr);
+
+	status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+					    name,
+					    NULL,
+					    devmode_ctr,
+					    SEC_FLAG_MAXIMUM_ALLOWED,
+					    &handle,
+					    &werr);
+	if (!NT_STATUS_IS_OK(status)) {
+		desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
+		goto out;
+	}
+	if (!W_ERROR_IS_OK(werr)) {
+		desc.errcode = W_ERROR_V(werr);
+		goto out;
+	}
+
+	werr = rpccli_spoolss_enumjobs(cli, mem_ctx,
+				       &handle,
+				       0, /* firstjob */
+				       0xff, /* numjobs */
+				       2, /* level */
+				       0, /* offered */
+				       &count,
+				       &info);
+	if (!W_ERROR_IS_OK(werr)) {
+		desc.errcode = W_ERROR_V(werr);
+		goto out;
 	}
 
-	count = print_queue_status(snum,&queue,&status);
 	if (mdrcnt > 0) {
 		*rdata = smb_realloc_limit(*rdata,mdrcnt);
 		if (!*rdata) {
@@ -4337,12 +4499,16 @@ static bool api_WPrintJobEnumerate(connection_struct *conn, uint16 vuid,
 	if (init_package(&desc,count,0)) {
 		succnt = 0;
 		for (i = 0; i < count; i++) {
-			fill_printjob_info(conn,snum,uLevel,&desc,&queue[i],i);
+			fill_spoolss_printjob_info(uLevel, &desc, &info[i].info2, i);
 			if (desc.errcode == NERR_Success) {
 				succnt = i+1;
 			}
 		}
 	}
+ out:
+	if (is_valid_policy_hnd(&handle)) {
+		rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+	}
 
 	*rdata_len = desc.usedlen;
 
@@ -4356,8 +4522,6 @@ static bool api_WPrintJobEnumerate(connection_struct *conn, uint16 vuid,
 	SSVAL(*rparam,4,succnt);
 	SSVAL(*rparam,6,count);
 
-	SAFE_FREE(queue);
-
 	DEBUG(4,("WPrintJobEnumerate: errorcode %d\n",desc.errcode));
 
 	return True;
diff --git a/source3/smbd/smb2_server.c b/source3/smbd/smb2_server.c
index 0b3222e..55111da 100644
--- a/source3/smbd/smb2_server.c
+++ b/source3/smbd/smb2_server.c
@@ -558,7 +558,7 @@ static NTSTATUS smb2_send_async_interim_response(const struct smbd_smb2_request
 
 	/* Step back to the previous reply. */
 	i = nreq->current_idx - 3;
-	outhdr = nreq->out.vector[i].iov_base;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list