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 <g...@samba.org>
Date:   Mon Apr 19 11:53:11 2010 +0200

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

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

    s3-spoolss: fix samr_ValidatePassword_Change.
    
    Guenther

commit 7277668128e3a8c138e9dc48ce6c2e85d1aac34f
Author: Günther Deschner <g...@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 <g...@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 <g...@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

Reply via email to