summaryrefslogtreecommitdiffstats
path: root/source3/rpc_server/spoolss
diff options
context:
space:
mode:
authorDavid Disseldorp <ddiss@samba.org>2013-09-19 20:31:37 -0700
committerDavid Disseldorp <ddiss@samba.org>2013-11-18 16:03:59 +0100
commit24d025f85d6eea272bff5e1040d4fd2ba0e6b8f3 (patch)
tree7f0f3fd4c70890f28f5f544bbac166baf689acbf /source3/rpc_server/spoolss
parent7e01e4bc64a80ee43f1fe845e0e2eed523f235fa (diff)
downloadsamba-24d025f85d6eea272bff5e1040d4fd2ba0e6b8f3.tar.gz
samba-24d025f85d6eea272bff5e1040d4fd2ba0e6b8f3.tar.xz
samba-24d025f85d6eea272bff5e1040d4fd2ba0e6b8f3.zip
spoolss: return the spoolss job ID in notifications
Print job notifications currently carry the system print job identifier from the queue structure. Instead, the spoolss job identifier should be resolved and returned. Print clients can use notification job-ids in subsequent spoolss SetJob requests. Returning an incorrect identifier can result in the failure of such requests, e.g. spoolss_SetJob(SPOOLSS_JOB_CONTROL_DELETE). BUG: https://bugzilla.samba.org/show_bug.cgi?id=10271 Signed-off-by: David Disseldorp <ddiss@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org> Reviewed-by: Günther Deschner <gd@samba.org>
Diffstat (limited to 'source3/rpc_server/spoolss')
-rw-r--r--source3/rpc_server/spoolss/srv_spoolss_nt.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c
index d37c24df6fd..a6201d4f55e 100644
--- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
+++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
@@ -3612,6 +3612,7 @@ static WERROR printer_notify_info(struct pipes_struct *p,
print_status_struct status;
struct spoolss_PrinterInfo2 *pinfo2 = NULL;
WERROR result;
+ struct tdb_print_db *pdb;
DEBUG(4,("printer_notify_info\n"));
@@ -3635,13 +3636,19 @@ static WERROR printer_notify_info(struct pipes_struct *p,
return WERR_BADFID;
}
+ pdb = get_print_db_byname(Printer->sharename);
+ if (pdb == NULL) {
+ return WERR_BADFID;
+ }
+
/* Maybe we should use the SYSTEM session_info here... */
result = winreg_get_printer_internal(mem_ctx,
get_session_info_system(),
p->msg_ctx,
lp_servicename(talloc_tos(), snum), &pinfo2);
if (!W_ERROR_IS_OK(result)) {
- return WERR_BADFID;
+ result = WERR_BADFID;
+ goto err_pdb_drop;
}
/*
@@ -3650,10 +3657,11 @@ static WERROR printer_notify_info(struct pipes_struct *p,
*/
pinfo2->servername = talloc_strdup(pinfo2, Printer->servername);
if (pinfo2->servername == NULL) {
- return WERR_NOMEM;
+ result = WERR_NOMEM;
+ goto err_pdb_drop;
}
- for (i=0; i<option->count; i++) {
+ for (i = 0; i < option->count; i++) {
option_type = option->types[i];
switch (option_type.type) {
@@ -3672,12 +3680,21 @@ static WERROR printer_notify_info(struct pipes_struct *p,
count = print_queue_status(p->msg_ctx, snum, &queue,
&status);
- for (j=0; j<count; j++) {
+ for (j = 0; j < count; j++) {
+ uint32_t jobid;
+ jobid = sysjob_to_jobid_pdb(pdb,
+ queue[j].sysjob);
+ if (jobid == (uint32_t)-1) {
+ DEBUG(2, ("ignoring untracked job %d\n",
+ queue[j].sysjob));
+ continue;
+ }
+ /* FIXME check return value */
construct_notify_jobs_info(p->msg_ctx,
&queue[j], info,
pinfo2, snum,
&option_type,
- queue[j].sysjob,
+ jobid,
mem_ctx);
}
@@ -3702,7 +3719,10 @@ static WERROR printer_notify_info(struct pipes_struct *p,
*/
talloc_free(pinfo2);
- return WERR_OK;
+ result = WERR_OK;
+err_pdb_drop:
+ release_print_db(pdb);
+ return result;
}
/****************************************************************