diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/printing.h | 1 | ||||
-rw-r--r-- | source3/printing/printing.c | 2 | ||||
-rw-r--r-- | source3/rpc_server/spoolss/srv_spoolss_nt.c | 32 |
3 files changed, 28 insertions, 7 deletions
diff --git a/source3/include/printing.h b/source3/include/printing.h index 391fb7ae823..ec5a53b7fd6 100644 --- a/source3/include/printing.h +++ b/source3/include/printing.h @@ -193,6 +193,7 @@ uint16_t print_spool_rap_jobid(struct print_file_data *print_file); /* The following definitions come from printing/printing.c */ +uint32 sysjob_to_jobid_pdb(struct tdb_print_db *pdb, int sysjob); uint32 sysjob_to_jobid(int unix_jobid); bool print_notify_register_pid(int snum); bool print_notify_deregister_pid(int snum); diff --git a/source3/printing/printing.c b/source3/printing/printing.c index 43f75e5c438..57d2f0cf714 100644 --- a/source3/printing/printing.c +++ b/source3/printing/printing.c @@ -519,7 +519,7 @@ static int unixjob_traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA key, return 0; } -static uint32 sysjob_to_jobid_pdb(struct tdb_print_db *pdb, int sysjob) +uint32 sysjob_to_jobid_pdb(struct tdb_print_db *pdb, int sysjob) { struct unixjob_traverse_state state; 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; } /**************************************************************** |