summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h4
-rw-r--r--source3/printing/printing.c38
-rw-r--r--source3/rpc_server/srv_spoolss_nt.c11
3 files changed, 31 insertions, 22 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index a98274bcad..6420b15474 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -4743,8 +4743,8 @@ char *print_job_fname(const char* sharename, uint32 jobid);
struct spoolss_DeviceMode *print_job_devmode(const char* sharename, uint32 jobid);
bool print_job_set_name(const char *sharename, uint32 jobid, const char *name);
bool print_job_get_name(TALLOC_CTX *mem_ctx, const char *sharename, uint32_t jobid, char **name);
-bool print_job_delete(struct auth_serversupplied_info *server_info, int snum,
- uint32 jobid, WERROR *errcode);
+WERROR print_job_delete(struct auth_serversupplied_info *server_info,
+ int snum, uint32 jobid);
bool print_job_pause(struct auth_serversupplied_info *server_info, int snum,
uint32 jobid, WERROR *errcode);
bool print_job_resume(struct auth_serversupplied_info *server_info, int snum,
diff --git a/source3/printing/printing.c b/source3/printing/printing.c
index 5f537c5d03..3525f8dc3a 100644
--- a/source3/printing/printing.c
+++ b/source3/printing/printing.c
@@ -2040,16 +2040,14 @@ static bool is_owner(struct auth_serversupplied_info *server_info,
Delete a print job.
****************************************************************************/
-bool print_job_delete(struct auth_serversupplied_info *server_info, int snum,
- uint32 jobid, WERROR *errcode)
+WERROR print_job_delete(struct auth_serversupplied_info *server_info,
+ int snum, uint32_t jobid)
{
- const char* sharename = lp_const_servicename( snum );
+ const char* sharename = lp_const_servicename(snum);
struct printjob *pjob;
bool owner;
char *fname;
- *errcode = WERR_OK;
-
owner = is_owner(server_info, lp_const_servicename(snum), jobid);
/* Check access against security descriptor or whether the user
@@ -2058,7 +2056,6 @@ bool print_job_delete(struct auth_serversupplied_info *server_info, int snum,
if (!owner &&
!print_access_check(server_info, snum, JOB_ACCESS_ADMINISTER)) {
DEBUG(3, ("delete denied by security descriptor\n"));
- *errcode = WERR_ACCESS_DENIED;
/* BEGIN_ADMIN_LOG */
sys_adminlog( LOG_ERR,
@@ -2068,7 +2065,7 @@ pause, or resume print job. User name: %s. Printer name: %s.",
lp_printername(snum) );
/* END_ADMIN_LOG */
- return False;
+ return WERR_ACCESS_DENIED;
}
/*
@@ -2078,19 +2075,18 @@ pause, or resume print job. User name: %s. Printer name: %s.",
* spool file & return.
*/
- if ( (fname = print_job_fname( sharename, jobid )) != NULL )
- {
+ fname = print_job_fname(sharename, jobid);
+ if (fname != NULL) {
/* remove the spool file */
- DEBUG(10,("print_job_delete: Removing spool file [%s]\n", fname ));
- if ( unlink( fname ) == -1 ) {
- *errcode = map_werror_from_unix(errno);
- return False;
+ DEBUG(10, ("print_job_delete: "
+ "Removing spool file [%s]\n", fname));
+ if (unlink(fname) == -1) {
+ return map_werror_from_unix(errno);
}
}
if (!print_job_delete1(snum, jobid)) {
- *errcode = WERR_ACCESS_DENIED;
- return False;
+ return WERR_ACCESS_DENIED;
}
/* force update the database and say the delete failed if the
@@ -2099,10 +2095,11 @@ pause, or resume print job. User name: %s. Printer name: %s.",
print_queue_update(snum, True);
pjob = print_job_find(sharename, jobid);
- if ( pjob && (pjob->status != LPQ_DELETING) )
- *errcode = WERR_ACCESS_DENIED;
+ if (pjob && (pjob->status != LPQ_DELETING)) {
+ return WERR_ACCESS_DENIED;
+ }
- return (pjob == NULL );
+ return WERR_PRINTER_HAS_JOBS_QUEUED;
}
/****************************************************************************
@@ -2243,6 +2240,11 @@ ssize_t print_job_write(int snum, uint32 jobid, const char *buf, SMB_OFF_T pos,
if (pjob->pid != sys_getpid())
return -1;
+ /* if SMBD is spooling this can't be allowed */
+ if (pjob->status == PJOB_SMBD_SPOOLING) {
+ return -1;
+ }
+
return_code = write_data_at_offset(pjob->fd, buf, size, pos);
if (return_code>0) {
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 1f0b36450f..5a33a34ca5 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -5234,6 +5234,7 @@ WERROR _spoolss_WritePrinter(pipes_struct *p,
if (!get_printer_snum(p, r->in.handle, &snum, NULL))
return WERR_BADFID;
+ /* print_job_write takes care of checking for PJOB_SMBD_SPOOLING */
buffer_written = print_job_write(snum, Printer->jobid,
(const char *)r->in.data.data,
(SMB_OFF_T)-1,
@@ -5314,7 +5315,11 @@ WERROR _spoolss_AbortPrinter(pipes_struct *p,
if (!get_printer_snum(p, r->in.handle, &snum, NULL))
return WERR_BADFID;
- print_job_delete(p->server_info, snum, Printer->jobid, &errcode );
+ if (!Printer->document_started) {
+ return WERR_SPL_NO_STARTDOC;
+ }
+
+ errcode = print_job_delete(p->server_info, snum, Printer->jobid);
return errcode;
}
@@ -6573,7 +6578,9 @@ WERROR _spoolss_SetJob(pipes_struct *p,
switch (r->in.command) {
case SPOOLSS_JOB_CONTROL_CANCEL:
case SPOOLSS_JOB_CONTROL_DELETE:
- if (print_job_delete(p->server_info, snum, r->in.job_id, &errcode)) {
+ errcode = print_job_delete(p->server_info,
+ snum, r->in.job_id);
+ if (W_ERROR_EQUAL(errcode, WERR_PRINTER_HAS_JOBS_QUEUED)) {
errcode = WERR_OK;
}
break;