Index: cups-2.2.1/scheduler/job.c =================================================================== --- cups-2.2.1.orig/scheduler/job.c +++ cups-2.2.1/scheduler/job.c @@ -1450,6 +1450,19 @@ cupsdFreeAllJobs(void) job; job = (cupsd_job_t *)cupsArrayNext(Jobs)) cupsdDeleteJob(job, CUPSD_JOB_DEFAULT); + /* + * Make sure all the arrays are completely cleared + * duplicate jobs can lead to left-over pointers + */ + for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); + job; + job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) + cupsArrayRemove(ActiveJobs, job); + + for (job = (cupsd_job_t *)cupsArrayFirst(PrintingJobs); + job; + job = (cupsd_job_t *)cupsArrayNext(PrintingJobs)) + cupsArrayRemove(PrintingJobs, job); cupsdReleaseSignals(); } @@ -4199,17 +4212,22 @@ load_job_cache(const char *filename) /* } else if (!_cups_strcasecmp(line, "")) { - cupsArrayAdd(Jobs, job); - if (job->state_value <= IPP_JOB_STOPPED && cupsdLoadJob(job)) - cupsArrayAdd(ActiveJobs, job); - else if (job->state_value > IPP_JOB_STOPPED) - { - if (!job->completed_time || !job->creation_time || !job->name || !job->koctets) - { - cupsdLoadJob(job); - unload_job(job); - } + // do not add duplicated jobs from job.cache + if (!cupsdFindJob(jobid)) { + cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate jobid %d", jobid); + cupsArrayAdd(Jobs, job); + + if (job->state_value <= IPP_JOB_STOPPED && cupsdLoadJob(job)) + cupsArrayAdd(ActiveJobs, job); + else if (job->state_value > IPP_JOB_STOPPED) + { + if (!job->completed_time || !job->creation_time || !job->name || !job->koctets) + { + cupsdLoadJob(job); + unload_job(job); + } + } } job = NULL; Index: cups-2.2.1/scheduler/process.c =================================================================== --- cups-2.2.1.orig/scheduler/process.c +++ cups-2.2.1/scheduler/process.c @@ -404,8 +404,10 @@ cupsdEndProcess(int pid, /* I - Process pid = -pid; } - - if (force) + if (abs(pid) == 1){ + cupsdLogMessage(CUPSD_LOG_ERROR, "Cupsd tried to kill (G)PID %d. Skipped.", pid); + } + else if (force) return (kill(pid, SIGKILL)); else return (kill(pid, SIGTERM));