3244c62
diff -up cups-1.4b2/scheduler/job.c.str3078 cups-1.4b2/scheduler/job.c
3244c62
--- cups-1.4b2/scheduler/job.c.str3078	2009-01-28 16:59:45.000000000 +0000
3244c62
+++ cups-1.4b2/scheduler/job.c	2009-01-28 17:00:04.000000000 +0000
3244c62
@@ -1049,7 +1049,7 @@ cupsdLoadAllJobs(void)
3244c62
  * 'cupsdLoadJob()' - Load a single job...
3244c62
  */
3244c62
 
3244c62
-void
3244c62
+int					/* O - 1 on success, 0 on failure */
3244c62
 cupsdLoadJob(cupsd_job_t *job)		/* I - Job */
3244c62
 {
3244c62
   char			jobfile[1024];	/* Job filename */
3244c62
@@ -1067,14 +1067,14 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
3244c62
     if (job->state_value > IPP_JOB_STOPPED)
3244c62
       job->access_time = time(NULL);
3244c62
 
3244c62
-    return;
3244c62
+    return (1);
3244c62
   }
3244c62
 
3244c62
   if ((job->attrs = ippNew()) == NULL)
3244c62
   {
3244c62
     cupsdLogMessage(CUPSD_LOG_ERROR,
3244c62
                     "[Job %d] Ran out of memory for job attributes!", job->id);
3244c62
-    return;
3244c62
+    return (0);
3244c62
   }
3244c62
 
3244c62
  /*
3244c62
@@ -1089,9 +1089,7 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
3244c62
     cupsdLogMessage(CUPSD_LOG_ERROR,
3244c62
 		    "[Job %d] Unable to open job control file \"%s\" - %s!",
3244c62
 		    job->id, jobfile, strerror(errno));
3244c62
-    ippDelete(job->attrs);
3244c62
-    job->attrs = NULL;
3244c62
-    return;
3244c62
+    goto error;
3244c62
   }
3244c62
 
3244c62
   if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, job->attrs) != IPP_DATA)
3244c62
@@ -1100,10 +1098,7 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
3244c62
 		    "[Job %d] Unable to read job control file \"%s\"!", job->id,
3244c62
 		    jobfile);
3244c62
     cupsFileClose(fp);
3244c62
-    ippDelete(job->attrs);
3244c62
-    job->attrs = NULL;
3244c62
-    unlink(jobfile);
3244c62
-    return;
3244c62
+    goto error;
3244c62
   }
3244c62
 
3244c62
   cupsFileClose(fp);
3244c62
@@ -1117,10 +1112,7 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
3244c62
     cupsdLogMessage(CUPSD_LOG_ERROR,
3244c62
 		    "[Job %d] Missing or bad time-at-creation attribute in "
3244c62
 		    "control file!", job->id);
3244c62
-    ippDelete(job->attrs);
3244c62
-    job->attrs = NULL;
3244c62
-    unlink(jobfile);
3244c62
-    return;
3244c62
+    goto error;
3244c62
   }
3244c62
 
3244c62
   if ((job->state = ippFindAttribute(job->attrs, "job-state",
3244c62
@@ -1129,10 +1121,7 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
3244c62
     cupsdLogMessage(CUPSD_LOG_ERROR,
3244c62
 		    "[Job %d] Missing or bad job-state attribute in control "
3244c62
 		    "file!", job->id);
3244c62
-    ippDelete(job->attrs);
3244c62
-    job->attrs = NULL;
3244c62
-    unlink(jobfile);
3244c62
-    return;
3244c62
+    goto error;
3244c62
   }
3244c62
 
3244c62
   job->state_value = (ipp_jstate_t)job->state->values[0].integer;
3244c62
@@ -1145,10 +1134,7 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
3244c62
       cupsdLogMessage(CUPSD_LOG_ERROR,
3244c62
 		      "[Job %d] No job-printer-uri attribute in control file!",
3244c62
 		      job->id);
3244c62
-      ippDelete(job->attrs);
3244c62
-      job->attrs = NULL;
3244c62
-      unlink(jobfile);
3244c62
-      return;
3244c62
+      goto error;
3244c62
     }
3244c62
 
3244c62
     if ((dest = cupsdValidateDest(attr->values[0].string.text, &(job->dtype),
3244c62
@@ -1157,10 +1143,7 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
3244c62
       cupsdLogMessage(CUPSD_LOG_ERROR,
3244c62
 		      "[Job %d] Unable to queue job for destination \"%s\"!",
3244c62
 		      job->id, attr->values[0].string.text);
3244c62
-      ippDelete(job->attrs);
3244c62
-      job->attrs = NULL;
3244c62
-      unlink(jobfile);
3244c62
-      return;
3244c62
+      goto error;
3244c62
     }
3244c62
 
3244c62
     cupsdSetString(&job->dest, dest);
3244c62
@@ -1170,10 +1153,7 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
3244c62
     cupsdLogMessage(CUPSD_LOG_ERROR,
3244c62
 		    "[Job %d] Unable to queue job for destination \"%s\"!",
3244c62
 		    job->id, job->dest);
3244c62
-    ippDelete(job->attrs);
3244c62
-    job->attrs = NULL;
3244c62
-    unlink(jobfile);
3244c62
-    return;
3244c62
+    goto error;
3244c62
   }
3244c62
 
3244c62
   job->sheets     = ippFindAttribute(job->attrs, "job-media-sheets-completed",
3244c62
@@ -1188,10 +1168,7 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
3244c62
       cupsdLogMessage(CUPSD_LOG_ERROR,
3244c62
 		      "[Job %d] Missing or bad job-priority attribute in "
3244c62
 		      "control file!", job->id);
3244c62
-      ippDelete(job->attrs);
3244c62
-      job->attrs = NULL;
3244c62
-      unlink(jobfile);
3244c62
-      return;
3244c62
+      goto error;
3244c62
     }
3244c62
 
3244c62
     job->priority = attr->values[0].integer;
3244c62
@@ -1205,10 +1182,7 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
3244c62
       cupsdLogMessage(CUPSD_LOG_ERROR,
3244c62
 		      "[Job %d] Missing or bad job-originating-user-name "
3244c62
 		      "attribute in control file!", job->id);
3244c62
-      ippDelete(job->attrs);
3244c62
-      job->attrs = NULL;
3244c62
-      unlink(jobfile);
3244c62
-      return;
3244c62
+      goto error;
3244c62
     }
3244c62
 
3244c62
     cupsdSetString(&job->username, attr->values[0].string.text);
3244c62
@@ -1277,7 +1251,7 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
3244c62
           cupsdLogMessage(CUPSD_LOG_ERROR,
3244c62
 	                  "[Job %d] Ran out of memory for job file types!",
3244c62
 			  job->id);
3244c62
-	  return;
3244c62
+	  return (1);
3244c62
 	}
3244c62
 
3244c62
         job->compressions = compressions;
3244c62
@@ -1335,6 +1309,18 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
3244c62
   }
3244c62
 
3244c62
   job->access_time = time(NULL);
3244c62
+  return (1);
3244c62
+
3244c62
+ /*
3244c62
+  * If we get here then something bad happened...
3244c62
+  */
3244c62
+
3244c62
+  error:
3244c62
+
3244c62
+  ippDelete(job->attrs);
3244c62
+  job->attrs = NULL;
3244c62
+  unlink(jobfile);
3244c62
+  return (0);
3244c62
 }
3244c62
 
3244c62
 
3244c62
diff -up cups-1.4b2/scheduler/job.h.str3078 cups-1.4b2/scheduler/job.h
3244c62
--- cups-1.4b2/scheduler/job.h.str3078	2008-08-28 21:38:13.000000000 +0100
3244c62
+++ cups-1.4b2/scheduler/job.h	2009-01-28 17:00:04.000000000 +0000
3244c62
@@ -3,7 +3,7 @@
3244c62
  *
3244c62
  *   Print job definitions for the Common UNIX Printing System (CUPS) scheduler.
3244c62
  *
3244c62
- *   Copyright 2007-2008 by Apple Inc.
3244c62
+ *   Copyright 2007-2009 by Apple Inc.
3244c62
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
3244c62
  *
3244c62
  *   These coded instructions, statements, and computer programs are the
3244c62
@@ -117,7 +117,7 @@ extern int		cupsdGetPrinterJobCount(cons
3244c62
 extern int		cupsdGetUserJobCount(const char *username);
3244c62
 extern void		cupsdHoldJob(cupsd_job_t *job);
3244c62
 extern void		cupsdLoadAllJobs(void);
3244c62
-extern void		cupsdLoadJob(cupsd_job_t *job);
3244c62
+extern int		cupsdLoadJob(cupsd_job_t *job);
3244c62
 extern void		cupsdMoveJob(cupsd_job_t *job, cupsd_printer_t *p);
3244c62
 extern void		cupsdReleaseJob(cupsd_job_t *job);
3244c62
 extern void		cupsdRestartJob(cupsd_job_t *job);
3244c62
diff -up cups-1.4b2/scheduler/quotas.c.str3078 cups-1.4b2/scheduler/quotas.c
3244c62
--- cups-1.4b2/scheduler/quotas.c.str3078	2007-09-12 22:09:49.000000000 +0100
3244c62
+++ cups-1.4b2/scheduler/quotas.c	2009-01-28 17:00:04.000000000 +0000
3244c62
@@ -3,7 +3,7 @@
3244c62
  *
3244c62
  *   Quota routines for the Common UNIX Printing System (CUPS).
3244c62
  *
3244c62
- *   Copyright 2007 by Apple Inc.
3244c62
+ *   Copyright 2007-2009 by Apple Inc.
3244c62
  *   Copyright 1997-2007 by Easy Software Products.
3244c62
  *
3244c62
  *   These coded instructions, statements, and computer programs are the
3244c62
@@ -155,10 +155,22 @@ cupsdUpdateQuota(
3244c62
        job;
3244c62
        job = (cupsd_job_t *)cupsArrayNext(Jobs))
3244c62
   {
3244c62
+   /*
3244c62
+    * We only care about the current printer/class and user...
3244c62
+    */
3244c62
+
3244c62
     if (strcasecmp(job->dest, p->name) != 0 ||
3244c62
         strcasecmp(job->username, q->username) != 0)
3244c62
       continue;
3244c62
 
3244c62
+   /*
3244c62
+    * Make sure attributes are loaded; we always call cupsdLoadJob() to ensure
3244c62
+    * the access_time member is updated so the job isn't unloaded right away...
3244c62
+    */
3244c62
+
3244c62
+    if (!cupsdLoadJob(job))
3244c62
+      continue;
3244c62
+
3244c62
     if ((attr = ippFindAttribute(job->attrs, "time-at-completion",
3244c62
                                  IPP_TAG_INTEGER)) == NULL)
3244c62
       if ((attr = ippFindAttribute(job->attrs, "time-at-processing",
3244c62
@@ -166,11 +178,22 @@ cupsdUpdateQuota(
3244c62
         attr = ippFindAttribute(job->attrs, "time-at-creation",
3244c62
                                 IPP_TAG_INTEGER);
3244c62
 
3244c62
-    if (attr == NULL)
3244c62
-      break;
3244c62
+    if (!attr)
3244c62
+    {
3244c62
+     /*
3244c62
+      * This should never happen since cupsdLoadJob() checks for
3244c62
+      * time-at-creation, but if it does just ignore this job...
3244c62
+      */
3244c62
+
3244c62
+      continue;
3244c62
+    }
3244c62
 
3244c62
     if (attr->values[0].integer < curtime)
3244c62
     {
3244c62
+     /*
3244c62
+      * This job is too old to count towards the quota, ignore it...
3244c62
+      */
3244c62
+
3244c62
       if (JobAutoPurge)
3244c62
         cupsdCancelJob(job, 1, IPP_JOB_CANCELED);
3244c62