diff options
author | David Disseldorp <ddiss@samba.org> | 2014-10-30 01:37:47 +0100 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2014-10-30 06:52:04 +0100 |
commit | 3a28ae56977235d3c9e3abcd1f24b220e536c50d (patch) | |
tree | d0bcde5bebd7cbccdd7915c300dc1aacee4ca9a7 /source3/rpc_server/spoolss | |
parent | 77b5be1742ee7aa2733a25bfa6a3af369f5c9401 (diff) | |
download | samba-3a28ae56977235d3c9e3abcd1f24b220e536c50d.tar.gz samba-3a28ae56977235d3c9e3abcd1f24b220e536c50d.tar.xz samba-3a28ae56977235d3c9e3abcd1f24b220e536c50d.zip |
spoolss: fix GetJob jobid lookups
Clients issue GetJob requests using the jobid assigned by the spoolss
server. The corresponding printing backend (sysjob) identifier needs to
be resolved to locate the correct print queue entry.
Bug: https://bugzilla.samba.org/show_bug.cgi?id=10905
Reported-by: Franz Pförtsch <franz.pfoertsch@brose.com>
Signed-off-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/rpc_server/spoolss')
-rw-r--r-- | source3/rpc_server/spoolss/srv_spoolss_nt.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c index 552d4cb8b7..3675fc1e5d 100644 --- a/source3/rpc_server/spoolss/srv_spoolss_nt.c +++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c @@ -9347,13 +9347,14 @@ static WERROR getjob_level_1(TALLOC_CTX *mem_ctx, int count, int snum, struct spoolss_PrinterInfo2 *pinfo2, uint32_t jobid, + int sysjob, struct spoolss_JobInfo1 *r) { int i = 0; bool found = false; for (i=0; i<count; i++) { - if (queue[i].sysjob == (int)jobid) { + if (queue[i].sysjob == sysjob) { found = true; break; } @@ -9380,6 +9381,7 @@ static WERROR getjob_level_2(TALLOC_CTX *mem_ctx, int count, int snum, struct spoolss_PrinterInfo2 *pinfo2, uint32_t jobid, + int sysjob, struct spoolss_JobInfo2 *r) { int i = 0; @@ -9388,7 +9390,7 @@ static WERROR getjob_level_2(TALLOC_CTX *mem_ctx, WERROR result; for (i=0; i<count; i++) { - if (queue[i].sysjob == (int)jobid) { + if (queue[i].sysjob == sysjob) { found = true; break; } @@ -9435,8 +9437,11 @@ WERROR _spoolss_GetJob(struct pipes_struct *p, { WERROR result = WERR_OK; struct spoolss_PrinterInfo2 *pinfo2 = NULL; + const char *svc_name; + int sysjob; int snum; int count; + struct tdb_print_db *pdb; print_queue_struct *queue = NULL; print_status_struct prt_status; @@ -9454,15 +9459,35 @@ WERROR _spoolss_GetJob(struct pipes_struct *p, return WERR_BADFID; } + svc_name = lp_const_servicename(snum); + if (svc_name == NULL) { + return WERR_INVALID_PARAM; + } + result = winreg_get_printer_internal(p->mem_ctx, get_session_info_system(), p->msg_ctx, - lp_const_servicename(snum), + svc_name, &pinfo2); if (!W_ERROR_IS_OK(result)) { return result; } + pdb = get_print_db_byname(svc_name); + if (pdb == NULL) { + DEBUG(3, ("failed to get print db for svc %s\n", svc_name)); + TALLOC_FREE(pinfo2); + return WERR_INVALID_PARAM; + } + + sysjob = jobid_to_sysjob_pdb(pdb, r->in.job_id); + release_print_db(pdb); + if (sysjob == -1) { + DEBUG(3, ("no sysjob for spoolss jobid %u\n", r->in.job_id)); + TALLOC_FREE(pinfo2); + return WERR_INVALID_PARAM; + } + count = print_queue_status(p->msg_ctx, snum, &queue, &prt_status); DEBUGADD(4,("count:[%d], prt_status:[%d], [%s]\n", @@ -9472,12 +9497,14 @@ WERROR _spoolss_GetJob(struct pipes_struct *p, case 1: result = getjob_level_1(p->mem_ctx, queue, count, snum, pinfo2, - r->in.job_id, &r->out.info->info1); + r->in.job_id, sysjob, + &r->out.info->info1); break; case 2: result = getjob_level_2(p->mem_ctx, queue, count, snum, pinfo2, - r->in.job_id, &r->out.info->info2); + r->in.job_id, sysjob, + &r->out.info->info2); break; default: result = WERR_UNKNOWN_LEVEL; |