From 11fbd76145ffa366f2d36217e95b81c0abc3e43b Mon Sep 17 00:00:00 2001
From: Tim Waugh
Date: Tue, 5 Feb 2008 15:37:24 +0000
Subject: [PATCH] - Include fixes from svn up to revision 7287. No longer need
str2650 or str2664 patches.
---
cups-1.3.x.patch | 7990 ++++++++++++++++++++++++++++++++++++++++++++
cups-lspp.patch | 10 +-
cups-str2650.patch | 25 -
cups-str2664.patch | 12 -
cups.spec | 12 +-
5 files changed, 8002 insertions(+), 47 deletions(-)
create mode 100644 cups-1.3.x.patch
delete mode 100644 cups-str2650.patch
delete mode 100644 cups-str2664.patch
diff --git a/cups-1.3.x.patch b/cups-1.3.x.patch
new file mode 100644
index 0000000..1d5f34a
--- /dev/null
+++ b/cups-1.3.x.patch
@@ -0,0 +1,7990 @@
+diff -up cups-1.3.5/cgi-bin/template.c.1.3.x cups-1.3.5/cgi-bin/template.c
+--- cups-1.3.5/cgi-bin/template.c.1.3.x 2007-08-15 20:33:36.000000000 +0100
++++ cups-1.3.5/cgi-bin/template.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * CGI template function.
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -54,6 +54,13 @@ cgiCopyTemplateFile(FILE *out, /*
+ tmpl ? tmpl : "(null)");
+
+ /*
++ * Range check input...
++ */
++
++ if (!tmpl || !out)
++ return;
++
++ /*
+ * Open the template file...
+ */
+
+diff -up cups-1.3.5/cgi-bin/admin.c.1.3.x cups-1.3.5/cgi-bin/admin.c
+--- cups-1.3.5/cgi-bin/admin.c.1.3.x 2007-11-30 07:00:59.000000000 +0000
++++ cups-1.3.5/cgi-bin/admin.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Administration CGI for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -1647,14 +1647,15 @@ do_config_server(http_t *http) /* I - H
+ * Allocate memory and load the file into a string buffer...
+ */
+
+- buffer = calloc(1, info.st_size + 1);
++ if ((buffer = calloc(1, info.st_size + 1)) != NULL)
++ {
++ cupsFileRead(cupsd, buffer, info.st_size);
++ cgiSetVariable("CUPSDCONF", buffer);
++ free(buffer);
++ }
+
+- cupsFileRead(cupsd, buffer, info.st_size);
+ cupsFileClose(cupsd);
+
+- cgiSetVariable("CUPSDCONF", buffer);
+- free(buffer);
+-
+ /*
+ * Then get the default cupsd.conf file and put that into a string as
+ * well...
+@@ -1665,37 +1666,39 @@ do_config_server(http_t *http) /* I - H
+ if (!stat(filename, &info) && info.st_size < (1024 * 1024) &&
+ (cupsd = cupsFileOpen(filename, "r")) != NULL)
+ {
+- buffer = calloc(1, 2 * info.st_size + 1);
+- bufend = buffer + 2 * info.st_size - 1;
+-
+- for (bufptr = buffer;
+- bufptr < bufend && (ch = cupsFileGetChar(cupsd)) != EOF;)
++ if ((buffer = calloc(1, 2 * info.st_size + 1)) != NULL)
+ {
+- if (ch == '\\' || ch == '\"')
+- {
+- *bufptr++ = '\\';
+- *bufptr++ = ch;
+- }
+- else if (ch == '\n')
+- {
+- *bufptr++ = '\\';
+- *bufptr++ = 'n';
+- }
+- else if (ch == '\t')
++ bufend = buffer + 2 * info.st_size - 1;
++
++ for (bufptr = buffer;
++ bufptr < bufend && (ch = cupsFileGetChar(cupsd)) != EOF;)
+ {
+- *bufptr++ = '\\';
+- *bufptr++ = 't';
++ if (ch == '\\' || ch == '\"')
++ {
++ *bufptr++ = '\\';
++ *bufptr++ = ch;
++ }
++ else if (ch == '\n')
++ {
++ *bufptr++ = '\\';
++ *bufptr++ = 'n';
++ }
++ else if (ch == '\t')
++ {
++ *bufptr++ = '\\';
++ *bufptr++ = 't';
++ }
++ else if (ch >= ' ')
++ *bufptr++ = ch;
+ }
+- else if (ch >= ' ')
+- *bufptr++ = ch;
+- }
+
+- *bufptr = '\0';
++ *bufptr = '\0';
+
+- cupsFileClose(cupsd);
++ cgiSetVariable("CUPSDCONF_DEFAULT", buffer);
++ free(buffer);
++ }
+
+- cgiSetVariable("CUPSDCONF_DEFAULT", buffer);
+- free(buffer);
++ cupsFileClose(cupsd);
+ }
+
+ /*
+@@ -3084,7 +3087,7 @@ do_set_options(http_t *http, /* I - HTT
+ * Binary protocol support...
+ */
+
+- if (ppd->protocols && strstr(ppd->protocols, "BCP"))
++ if (ppd && ppd->protocols && strstr(ppd->protocols, "BCP"))
+ {
+ protocol = ppdFindAttr(ppd, "cupsProtocol", NULL);
+
+diff -up cups-1.3.5/cgi-bin/search.c.1.3.x cups-1.3.5/cgi-bin/search.c
+--- cups-1.3.5/cgi-bin/search.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/cgi-bin/search.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Search routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -53,7 +53,8 @@ cgiCompileSearch(const char *query) /* I
+ * Allocate a regular expression storage structure...
+ */
+
+- re = (regex_t *)calloc(1, sizeof(regex_t));
++ if ((re = (regex_t *)calloc(1, sizeof(regex_t))) == NULL)
++ return (NULL);
+
+ /*
+ * Allocate a buffer to hold the regular expression string, starting
+@@ -65,7 +66,11 @@ cgiCompileSearch(const char *query) /* I
+ if (slen < 1024)
+ slen = 1024;
+
+- s = (char *)malloc(slen);
++ if ((s = (char *)malloc(slen)) == NULL)
++ {
++ free(re);
++ return (NULL);
++ }
+
+ /*
+ * Copy the query string to the regular expression, handling basic
+@@ -227,7 +232,13 @@ cgiCompileSearch(const char *query) /* I
+ char *lword2; /* New "last word" */
+
+
+- lword2 = strdup(sword);
++ if ((lword2 = strdup(sword)) == NULL)
++ {
++ free(lword);
++ free(s);
++ free(re);
++ return (NULL);
++ }
+
+ strcpy(sptr, ".*|.*");
+ sptr += 5;
+diff -up cups-1.3.5/cgi-bin/ipp-var.c.1.3.x cups-1.3.5/cgi-bin/ipp-var.c
+--- cups-1.3.5/cgi-bin/ipp-var.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/cgi-bin/ipp-var.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * CGI <-> IPP variable routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -158,6 +158,8 @@ cgiGetAttributes(ipp_t *request, /*
+ for (i = 0; i < num_attrs; i ++)
+ free(attrs[i]);
+ }
++
++ fclose(in);
+ }
+
+
+@@ -523,8 +525,7 @@ cgiPrintTestPage(http_t *http, /* I
+ * See who is logged in...
+ */
+
+- if ((user = getenv("REMOTE_USER")) == NULL)
+- user = "guest";
++ user = getenv("REMOTE_USER");
+
+ /*
+ * Locate the test page file...
+@@ -562,8 +563,9 @@ cgiPrintTestPage(http_t *http, /* I
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
+ NULL, uri);
+
+- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
+- "requesting-user-name", NULL, user);
++ if (user)
++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
++ "requesting-user-name", NULL, user);
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
+ NULL, "Test Page");
+@@ -593,6 +595,11 @@ cgiPrintTestPage(http_t *http, /* I
+ snprintf(refresh, sizeof(refresh), "2;URL=%s", uri);
+ cgiSetVariable("refresh_page", refresh);
+ }
++ else if (cupsLastError() == IPP_NOT_AUTHORIZED)
++ {
++ puts("Status: 401\n");
++ exit(0);
++ }
+
+ cgiStartHTML(cgiText(_("Print Test Page")));
+
+diff -up cups-1.3.5/cgi-bin/jobs.c.1.3.x cups-1.3.5/cgi-bin/jobs.c
+--- cups-1.3.5/cgi-bin/jobs.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/cgi-bin/jobs.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Job status CGI for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -185,6 +185,11 @@ do_job_op(http_t *http, /* I - HTT
+ cgiFormEncode(url + 6, getenv("HTTP_REFERER"), sizeof(url) - 6);
+ cgiSetVariable("refresh_page", url);
+ }
++ else if (cupsLastError() == IPP_NOT_AUTHORIZED)
++ {
++ puts("Status: 401\n");
++ exit(0);
++ }
+
+ cgiStartHTML(cgiText(_("Jobs")));
+
+diff -up cups-1.3.5/cgi-bin/var.c.1.3.x cups-1.3.5/cgi-bin/var.c
+--- cups-1.3.5/cgi-bin/var.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/cgi-bin/var.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * CGI form variable and array functions.
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -322,9 +322,15 @@ cgiSetArray(const char *name, /* I - Na
+ {
+ if (element >= var->avalues)
+ {
++ const char **temp; /* Temporary pointer */
++
++ temp = (const char **)realloc((void *)(var->values),
++ sizeof(char *) * (element + 16));
++ if (!temp)
++ return;
++
+ var->avalues = element + 16;
+- var->values = (const char **)realloc((void *)(var->values),
+- sizeof(char *) * var->avalues);
++ var->values = temp;
+ }
+
+ if (element >= var->nvalues)
+@@ -362,9 +368,15 @@ cgiSetSize(const char *name, /* I - Nam
+
+ if (size >= var->avalues)
+ {
++ const char **temp; /* Temporary pointer */
++
++ temp = (const char **)realloc((void *)(var->values),
++ sizeof(char *) * (size + 16));
++ if (!temp)
++ return;
++
+ var->avalues = size + 16;
+- var->values = (const char **)realloc((void *)(var->values),
+- sizeof(char *) * var->avalues);
++ var->values = temp;
+ }
+
+ if (size > var->nvalues)
+@@ -426,7 +438,7 @@ cgi_add_variable(const char *name, /* I
+ int element, /* I - Array element number */
+ const char *value) /* I - Variable value */
+ {
+- _cgi_var_t *var; /* New variable */
++ _cgi_var_t *var; /* New variable */
+
+
+ if (name == NULL || value == NULL || element < 0 || element > 100000)
+@@ -438,19 +450,29 @@ cgi_add_variable(const char *name, /* I
+
+ if (form_count >= form_alloc)
+ {
++ _cgi_var_t *temp_vars; /* Temporary form pointer */
++
++
+ if (form_alloc == 0)
+- form_vars = malloc(sizeof(_cgi_var_t) * 16);
++ temp_vars = malloc(sizeof(_cgi_var_t) * 16);
+ else
+- form_vars = realloc(form_vars, (form_alloc + 16) * sizeof(_cgi_var_t));
++ temp_vars = realloc(form_vars, (form_alloc + 16) * sizeof(_cgi_var_t));
++
++ if (!temp_vars)
++ return;
+
++ form_vars = temp_vars;
+ form_alloc += 16;
+ }
+
+- var = form_vars + form_count;
++ var = form_vars + form_count;
++
++ if ((var->values = calloc(element + 1, sizeof(char *))) == NULL)
++ return;
++
+ var->name = strdup(name);
+ var->nvalues = element + 1;
+ var->avalues = element + 1;
+- var->values = calloc(element + 1, sizeof(char *));
+ var->values[element] = strdup(value);
+
+ form_count ++;
+@@ -784,11 +806,15 @@ cgi_initialize_post(void)
+
+ for (tbytes = 0; tbytes < length; tbytes += nbytes)
+ if ((nbytes = read(0, data + tbytes, length - tbytes)) < 0)
++ {
+ if (errno != EAGAIN)
+ {
+ free(data);
+ return (0);
+ }
++ else
++ nbytes = 0;
++ }
+
+ data[length] = '\0';
+
+diff -up cups-1.3.5/cgi-bin/printers.c.1.3.x cups-1.3.5/cgi-bin/printers.c
+--- cups-1.3.5/cgi-bin/printers.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/cgi-bin/printers.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Printer status CGI for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -280,6 +280,11 @@ print_command(http_t *http, /* I -
+ snprintf(refresh, sizeof(refresh), "2;URL=%s", uri);
+ cgiSetVariable("refresh_page", refresh);
+ }
++ else if (cupsLastError() == IPP_NOT_AUTHORIZED)
++ {
++ puts("Status: 401\n");
++ exit(0);
++ }
+
+ cgiStartHTML(cgiText(_("Printer Maintenance")));
+
+diff -up cups-1.3.5/locale/checkpo.c.1.3.x cups-1.3.5/locale/checkpo.c
+--- cups-1.3.5/locale/checkpo.c.1.3.x 2007-09-06 15:34:31.000000000 +0100
++++ cups-1.3.5/locale/checkpo.c 2008-02-05 15:08:55.000000000 +0000
+@@ -50,8 +50,7 @@ main(int argc, /* I - Number of comm
+ *strfmts; /* Format strings in msgstr */
+ char *idfmt, /* Current msgid format string */
+ *strfmt; /* Current msgstr format string */
+- int fmtidx, /* Format index */
+- fmtcount; /* Format count */
++ int fmtidx; /* Format index */
+ int status, /* Exit status */
+ pass, /* Pass/fail status */
+ untranslated; /* Untranslated messages */
+@@ -135,8 +134,6 @@ main(int argc, /* I - Number of comm
+
+ if (!idfmt || strcmp(strfmt, idfmt))
+ break;
+-
+- fmtcount ++;
+ }
+
+ if (cupsArrayCount(strfmts) != cupsArrayCount(idfmts) || strfmt)
+diff -up cups-1.3.5/backend/usb-unix.c.1.3.x cups-1.3.5/backend/usb-unix.c
+--- cups-1.3.5/backend/usb-unix.c.1.3.x 2007-11-30 07:00:59.000000000 +0000
++++ cups-1.3.5/backend/usb-unix.c 2008-02-05 15:08:55.000000000 +0000
+@@ -516,7 +516,7 @@ open_device(const char *uri, /* I - Dev
+ }
+ #else
+ {
+- if (use_bc)
++ if (*use_bc)
+ fd = open(uri + 4, O_RDWR | O_EXCL);
+ else
+ fd = -1;
+diff -up cups-1.3.5/backend/snmp.c.1.3.x cups-1.3.5/backend/snmp.c
+--- cups-1.3.5/backend/snmp.c.1.3.x 2007-12-17 22:12:45.000000000 +0000
++++ cups-1.3.5/backend/snmp.c 2008-02-05 15:08:55.000000000 +0000
+@@ -1090,7 +1090,7 @@ asn1_get_string(
+ * String is larger than the buffer...
+ */
+
+- memcpy(string, buffer, strsize - 1);
++ memcpy(string, *buffer, strsize - 1);
+ string[strsize - 1] = '\0';
+ }
+
+diff -up cups-1.3.5/backend/pap.c.1.3.x cups-1.3.5/backend/pap.c
+--- cups-1.3.5/backend/pap.c.1.3.x 2007-10-10 22:25:29.000000000 +0100
++++ cups-1.3.5/backend/pap.c 2008-02-05 15:08:55.000000000 +0000
+@@ -1,7 +1,7 @@
+ /*
+ * "$Id: pap.c 7013 2007-10-10 21:25:29Z mike $"
+ *
+-* © Copyright 2004 Apple Computer, Inc. All rights reserved.
++* © Copyright 2004-2008 Apple Computer, Inc. All rights reserved.
+ *
+ * IMPORTANT: This Apple software is supplied to you by Apple Computer,
+ * Inc. ("Apple") in consideration of your agreement to the following
+@@ -70,6 +70,16 @@
+ * signalHandler() - handle SIGINT to close the session before quiting.
+ */
+
++/*
++ * This backend uses deprecated APIs for AppleTalk; we know this, so
++ * silence any warnings about it...
++ */
++
++#ifdef MAC_OS_X_VERSION_MIN_REQUIRED
++# undef MAC_OS_X_VERSION_MIN_REQUIRED
++#endif /* MAX_OS_X_VERSION_MIN_REQUIRED */
++#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_0
++
+ #include
+
+ #include
+@@ -85,17 +95,17 @@
+ #include
+ #include
+
++#include
++#include
++#include
++#include
++
+ #include
+ #include
+ #include
+ #include
+ #include
+
+-#include
+-#include
+-#include
+-#include
+-
+ #include
+
+ #ifdef HAVE_APPLETALK_AT_PROTO_H
+diff -up cups-1.3.5/backend/runloop.c.1.3.x cups-1.3.5/backend/runloop.c
+--- cups-1.3.5/backend/runloop.c.1.3.x 2007-08-22 19:34:34.000000000 +0100
++++ cups-1.3.5/backend/runloop.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Common run loop APIs for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -216,7 +216,7 @@ backendRunLoop(
+ FD_SET(CUPS_SC_FD, &input);
+
+ FD_ZERO(&output);
+- if (print_bytes || !use_bc)
++ if (print_bytes || (!use_bc && !side_cb))
+ FD_SET(device_fd, &output);
+
+ if (use_bc || side_cb)
+diff -up cups-1.3.5/backend/ipp.c.1.3.x cups-1.3.5/backend/ipp.c
+--- cups-1.3.5/backend/ipp.c.1.3.x 2007-11-09 19:54:09.000000000 +0000
++++ cups-1.3.5/backend/ipp.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * IPP backend for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -521,8 +521,8 @@ main(int argc, /* I - Number of comm
+ _("INFO: Unable to contact printer, queuing on next "
+ "printer in class...\n"));
+
+- if (argc == 6 || strcmp(filename, argv[6]))
+- unlink(filename);
++ if (tmpfilename[0])
++ unlink(tmpfilename);
+
+ /*
+ * Sleep 5 seconds to keep the job from requeuing too rapidly...
+@@ -579,8 +579,8 @@ main(int argc, /* I - Number of comm
+
+ if (job_cancelled)
+ {
+- if (argc == 6 || strcmp(filename, argv[6]))
+- unlink(filename);
++ if (tmpfilename[0])
++ unlink(tmpfilename);
+
+ return (CUPS_BACKEND_FAILED);
+ }
+@@ -765,8 +765,8 @@ main(int argc, /* I - Number of comm
+ ippDelete(supported);
+ httpClose(http);
+
+- if (argc == 6 || strcmp(filename, argv[6]))
+- unlink(filename);
++ if (tmpfilename[0])
++ unlink(tmpfilename);
+
+ /*
+ * Sleep 5 seconds to keep the job from requeuing too rapidly...
+@@ -865,12 +865,13 @@ main(int argc, /* I - Number of comm
+ num_options = cupsParseOptions(argv[5], 0, &options);
+
+ #ifdef __APPLE__
+- if (!strcasecmp(content_type, "application/pictwps") && num_files == 1)
++ if (!strcasecmp(final_content_type, "application/pictwps") &&
++ num_files == 1)
+ {
+ if (format_sup != NULL)
+ {
+ for (i = 0; i < format_sup->num_values; i ++)
+- if (!strcasecmp(content_type, format_sup->values[i].string.text))
++ if (!strcasecmp(final_content_type, format_sup->values[i].string.text))
+ break;
+ }
+
+@@ -881,10 +882,18 @@ main(int argc, /* I - Number of comm
+ * so convert the document to PostScript...
+ */
+
+- if (run_pictwps_filter(argv, filename))
++ if (run_pictwps_filter(argv, files[0]))
++ {
++ if (pstmpname[0])
++ unlink(pstmpname);
++
++ if (tmpfilename[0])
++ unlink(tmpfilename);
++
+ return (CUPS_BACKEND_FAILED);
++ }
+
+- filename = pstmpname;
++ files[0] = pstmpname;
+
+ /*
+ * Change the MIME type to application/postscript and change the
+@@ -1680,7 +1689,6 @@ run_pictwps_filter(char **argv, /*
+
+ _cupsLangPrintf(stderr, _("ERROR: Unable to fork pictwpstops: %s\n"),
+ strerror(errno));
+- unlink(filename);
+ if (ppdfile)
+ unlink(ppdfile);
+ return (-1);
+@@ -1695,7 +1703,6 @@ run_pictwps_filter(char **argv, /*
+ _cupsLangPrintf(stderr, _("ERROR: Unable to wait for pictwpstops: %s\n"),
+ strerror(errno));
+ close(fd);
+- unlink(filename);
+ if (ppdfile)
+ unlink(ppdfile);
+ return (-1);
+@@ -1715,7 +1722,6 @@ run_pictwps_filter(char **argv, /*
+ _cupsLangPrintf(stderr, _("ERROR: pictwpstops exited on signal %d!\n"),
+ status);
+
+- unlink(filename);
+ return (status);
+ }
+
+diff -up cups-1.3.5/cups/adminutil.c.1.3.x cups-1.3.5/cups/adminutil.c
+--- cups-1.3.5/cups/adminutil.c.1.3.x 2007-11-30 07:00:59.000000000 +0000
++++ cups-1.3.5/cups/adminutil.c 2008-02-05 15:08:55.000000000 +0000
+@@ -4,7 +4,7 @@
+ * Administration utility API definitions for the Common UNIX Printing
+ * System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 2001-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -1057,7 +1057,7 @@ _cupsAdminGetServerSettings(
+ in_admin_location = 0;
+ in_location = 0;
+ }
+- else if (!strcasecmp(line, "Allow") && in_admin_location &&
++ else if (!strcasecmp(line, "Allow") &&
+ strcasecmp(value, "localhost") && strcasecmp(value, "127.0.0.1")
+ #ifdef AF_LOCAL
+ && *value != '/'
+@@ -1067,9 +1067,9 @@ _cupsAdminGetServerSettings(
+ #endif /* AF_INET6 */
+ )
+ {
+- remote_admin = 1;
+-
+- if (!strcasecmp(value, "all"))
++ if (in_admin_location)
++ remote_admin = 1;
++ else if (!strcasecmp(value, "all"))
+ remote_any = 1;
+ }
+ else if (line[0] != '<' && !in_location && !in_policy)
+@@ -1578,8 +1578,6 @@ _cupsAdminSetServerSettings(
+ if (remote_admin)
+ cupsFilePrintf(temp, " Allow %s\n",
+ remote_any > 0 ? "all" : "@LOCAL");
+- else
+- cupsFilePuts(temp, " Allow localhost\n");
+ }
+ else if (in_conf_location && remote_admin >= 0)
+ {
+@@ -1597,8 +1595,6 @@ _cupsAdminSetServerSettings(
+ if (remote_admin)
+ cupsFilePrintf(temp, " Allow %s\n",
+ remote_any > 0 ? "all" : "@LOCAL");
+- else
+- cupsFilePuts(temp, " Allow localhost\n");
+ }
+ else if (in_root_location && (remote_admin >= 0 || share_printers >= 0))
+ {
+@@ -1619,8 +1615,6 @@ _cupsAdminSetServerSettings(
+ if (remote_admin > 0 || share_printers > 0)
+ cupsFilePrintf(temp, " Allow %s\n",
+ remote_any > 0 ? "all" : "@LOCAL");
+- else
+- cupsFilePuts(temp, " Allow localhost\n");
+ }
+
+ in_admin_location = 0;
+@@ -1841,8 +1835,6 @@ _cupsAdminSetServerSettings(
+
+ if (remote_admin > 0 || share_printers > 0)
+ cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL");
+- else
+- cupsFilePuts(temp, " Allow localhost\n");
+
+ cupsFilePuts(temp, "\n");
+ }
+@@ -1859,8 +1851,6 @@ _cupsAdminSetServerSettings(
+
+ if (remote_admin)
+ cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL");
+- else
+- cupsFilePuts(temp, " Allow localhost\n");
+
+ cupsFilePuts(temp, "\n");
+ }
+@@ -1880,8 +1870,6 @@ _cupsAdminSetServerSettings(
+
+ if (remote_admin)
+ cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL");
+- else
+- cupsFilePuts(temp, " Allow localhost\n");
+
+ cupsFilePuts(temp, "\n");
+ }
+diff -up cups-1.3.5/cups/transcode.c.1.3.x cups-1.3.5/cups/transcode.c
+--- cups-1.3.5/cups/transcode.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/cups/transcode.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Transcoding support for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -132,8 +132,6 @@ _cupsCharmapFlush(void)
+ vnext = vmap->next;
+
+ free_vbcs_charmap(vmap);
+-
+- free(vmap);
+ }
+
+ vmap_cache = NULL;
+@@ -330,13 +328,8 @@ cupsCharsetToUTF8(
+
+ if (encoding < CUPS_ENCODING_SBCS_END)
+ bytes = conv_sbcs_to_utf8(dest, (cups_sbcs_t *)src, maxout, encoding);
+- else if (encoding < CUPS_ENCODING_VBCS_END)
+- bytes = conv_vbcs_to_utf8(dest, (cups_sbcs_t *)src, maxout, encoding);
+ else
+- {
+- DEBUG_puts(" Bad encoding, returning -1");
+- bytes = -1;
+- }
++ bytes = conv_vbcs_to_utf8(dest, (cups_sbcs_t *)src, maxout, encoding);
+
+ #ifdef HAVE_PTHREAD_H
+ pthread_mutex_unlock(&map_mutex);
+@@ -437,10 +430,8 @@ cupsUTF8ToCharset(
+
+ if (encoding < CUPS_ENCODING_SBCS_END)
+ bytes = conv_utf8_to_sbcs((cups_sbcs_t *)dest, src, maxout, encoding);
+- else if (encoding < CUPS_ENCODING_VBCS_END)
+- bytes = conv_utf8_to_vbcs((cups_sbcs_t *)dest, src, maxout, encoding);
+ else
+- bytes = -1;
++ bytes = conv_utf8_to_vbcs((cups_sbcs_t *)dest, src, maxout, encoding);
+
+ #ifdef HAVE_PTHREAD_H
+ pthread_mutex_unlock(&map_mutex);
+@@ -1468,6 +1459,8 @@ get_vbcs_charmap(
+ {
+ DEBUG_puts(" Unable to get charmap count!");
+
++ cupsFileClose(fp);
++
+ return (NULL);
+ }
+
+@@ -1479,9 +1472,10 @@ get_vbcs_charmap(
+
+ if ((vmap = (_cups_vmap_t *)calloc(1, sizeof(_cups_vmap_t))) == NULL)
+ {
+- cupsFileClose(fp);
+ DEBUG_puts(" Unable to allocate memory!");
+
++ cupsFileClose(fp);
++
+ return (NULL);
+ }
+
+diff -up cups-1.3.5/cups/testcups.c.1.3.x cups-1.3.5/cups/testcups.c
+--- cups-1.3.5/cups/testcups.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/cups/testcups.c 2008-02-05 15:08:55.000000000 +0000
+@@ -106,6 +106,7 @@ main(int argc, /* I - Number of comm
+ {
+ status = 1;
+ puts("FAIL");
++ return (1);
+ }
+ else
+ puts("PASS");
+diff -up cups-1.3.5/cups/http.c.1.3.x cups-1.3.5/cups/http.c
+--- cups-1.3.5/cups/http.c.1.3.x 2007-07-25 21:39:33.000000000 +0100
++++ cups-1.3.5/cups/http.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * HTTP routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * This file contains Kerberos support code, copyright 2006 by
+@@ -402,9 +402,11 @@ httpConnectEncrypt(
+ * Allocate memory for the structure...
+ */
+
+- http = calloc(sizeof(http_t), 1);
+- if (http == NULL)
++ if ((http = calloc(sizeof(http_t), 1)) == NULL)
++ {
++ httpAddrFreeList(addrlist);
+ return (NULL);
++ }
+
+ http->version = HTTP_1_1;
+ http->blocking = 1;
+@@ -1735,9 +1737,15 @@ httpSetAuthString(http_t *http, /* I
+ */
+
+ int len = (int)strlen(scheme) + (data ? (int)strlen(data) + 1 : 0) + 1;
++ char *temp;
+
+ if (len > (int)sizeof(http->_authstring))
+- http->authstring = malloc(len);
++ {
++ if ((temp = malloc(len)) == NULL)
++ len = sizeof(http->_authstring);
++ else
++ http->authstring = temp;
++ }
+
+ if (data)
+ snprintf(http->authstring, len, "%s %s", scheme, data);
+diff -up cups-1.3.5/cups/libcups.exp.1.3.x cups-1.3.5/cups/libcups.exp
+--- cups-1.3.5/cups/libcups.exp.1.3.x 2007-07-25 18:19:09.000000000 +0100
++++ cups-1.3.5/cups/libcups.exp 2008-02-05 15:08:55.000000000 +0000
+@@ -1,6 +1,7 @@
+ __cups_strcpy
+ __cupsAdminGetServerSettings
+ __cupsAdminSetServerSettings
++__cupsAppleLanguage
+ __cupsCharmapFlush
+ __cupsCharmapFree
+ __cupsCharmapGet
+diff -up cups-1.3.5/cups/auth.c.1.3.x cups-1.3.5/cups/auth.c
+--- cups-1.3.5/cups/auth.c.1.3.x 2007-10-31 18:35:56.000000000 +0000
++++ cups-1.3.5/cups/auth.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Authentication functions for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
+ *
+ * This file contains Kerberos support code, copyright 2006 by
+@@ -91,8 +91,7 @@ cupsDoAuthentication(http_t *http, /
+ const char *password; /* Password string */
+ char prompt[1024], /* Prompt for user */
+ realm[HTTP_MAX_VALUE], /* realm="xyz" string */
+- nonce[HTTP_MAX_VALUE], /* nonce="xyz" string */
+- encode[4096]; /* Encoded username:password */
++ nonce[HTTP_MAX_VALUE]; /* nonce="xyz" string */
+ int localauth; /* Local authentication result */
+ _cups_globals_t *cg; /* Global data */
+
+@@ -301,14 +300,40 @@ cupsDoAuthentication(http_t *http, /
+ if (major_status == GSS_S_CONTINUE_NEEDED)
+ DEBUG_gss_printf(major_status, minor_status, "Continuation needed!");
+
+- if (output_token.length)
++ if (output_token.length > 0 && output_token.length <= 65536)
+ {
+- httpEncode64_2(encode, sizeof(encode), output_token.value,
++ /*
++ * Allocate the authorization string since Windows KDCs can have
++ * arbitrarily large credentials...
++ */
++
++ int authsize = 10 + /* "Negotiate " */
++ output_token.length * 4 / 3 + 1 + /* Base64 */
++ 1; /* nul */
++
++ httpSetAuthString(http, NULL, NULL);
++
++ if ((http->authstring = malloc(authsize)) == NULL)
++ {
++ http->authstring = http->_authstring;
++ authsize = sizeof(http->_authstring);
++ }
++
++ strcpy(http->authstring, "Negotiate ");
++ httpEncode64_2(http->authstring + 10, authsize - 10, output_token.value,
+ output_token.length);
+- httpSetAuthString(http, "Negotiate", encode);
+
+ major_status = gss_release_buffer(&minor_status, &output_token);
+ }
++ else
++ {
++ DEBUG_printf(("cupsDoAuthentication: Kerberos credentials too large - "
++ "%d bytes!\n", output_token.length));
++
++ major_status = gss_release_buffer(&minor_status, &output_token);
++
++ return (-1);
++ }
+ #endif /* HAVE_GSSAPI */
+ }
+ else if (strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Digest", 6))
+@@ -317,6 +342,9 @@ cupsDoAuthentication(http_t *http, /
+ * Basic authentication...
+ */
+
++ char encode[256]; /* Base64 buffer */
++
++
+ httpEncode64_2(encode, sizeof(encode), http->userpass,
+ (int)strlen(http->userpass));
+ httpSetAuthString(http, "Basic", encode);
+@@ -327,7 +355,8 @@ cupsDoAuthentication(http_t *http, /
+ * Digest authentication...
+ */
+
+- char digest[1024]; /* Digest auth data */
++ char encode[33], /* MD5 buffer */
++ digest[1024]; /* Digest auth data */
+
+
+ httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "realm", realm);
+diff -up cups-1.3.5/cups/options.c.1.3.x cups-1.3.5/cups/options.c
+--- cups-1.3.5/cups/options.c.1.3.x 2007-07-20 22:28:10.000000000 +0100
++++ cups-1.3.5/cups/options.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Option routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -470,18 +470,28 @@ cupsParseOptions(
+ char *copyarg, /* Copy of input string */
+ *ptr, /* Pointer into string */
+ *name, /* Pointer to name */
+- *value; /* Pointer to value */
++ *value, /* Pointer to value */
++ quote; /* Quote character */
+
+
+- if (arg == NULL || options == NULL || num_options < 0)
++ /*
++ * Range check input...
++ */
++
++ if (!arg)
++ return (num_options);
++
++ if (!options || num_options < 0)
+ return (0);
+
+ /*
+ * Make a copy of the argument string and then divide it up...
+ */
+
+- copyarg = strdup(arg);
+- ptr = copyarg;
++ if ((copyarg = strdup(arg)) == NULL)
++ return (num_options);
++
++ ptr = copyarg;
+
+ /*
+ * Skip leading spaces...
+@@ -501,7 +511,7 @@ cupsParseOptions(
+ */
+
+ name = ptr;
+- while (!isspace(*ptr & 255) && *ptr != '=' && *ptr != '\0')
++ while (!isspace(*ptr & 255) && *ptr != '=' && *ptr)
+ ptr ++;
+
+ /*
+@@ -521,10 +531,10 @@ cupsParseOptions(
+ if (*ptr != '=')
+ {
+ /*
+- * Start of another option...
++ * Boolean option...
+ */
+
+- if (strncasecmp(name, "no", 2) == 0)
++ if (!strncasecmp(name, "no", 2))
+ num_options = cupsAddOption(name + 2, "false", num_options,
+ options);
+ else
+@@ -539,38 +549,18 @@ cupsParseOptions(
+
+ *ptr++ = '\0';
+
+- if (*ptr == '\'')
++ if (*ptr == '\'' || *ptr == '\"')
+ {
+ /*
+ * Quoted string constant...
+ */
+
+- ptr ++;
+- value = ptr;
+-
+- while (*ptr != '\'' && *ptr != '\0')
+- {
+- if (*ptr == '\\')
+- _cups_strcpy(ptr, ptr + 1);
+-
+- ptr ++;
+- }
+-
+- if (*ptr != '\0')
+- *ptr++ = '\0';
+- }
+- else if (*ptr == '\"')
+- {
+- /*
+- * Double-quoted string constant...
+- */
+-
+- ptr ++;
++ quote = *ptr++;
+ value = ptr;
+
+- while (*ptr != '\"' && *ptr != '\0')
++ while (*ptr != quote && *ptr)
+ {
+- if (*ptr == '\\')
++ if (*ptr == '\\' && ptr[1])
+ _cups_strcpy(ptr, ptr + 1);
+
+ ptr ++;
+@@ -603,7 +593,7 @@ cupsParseOptions(
+ break;
+ }
+ }
+- else if (*ptr == '\\')
++ else if (*ptr == '\\' && ptr[1])
+ _cups_strcpy(ptr, ptr + 1);
+
+ if (*ptr != '\0')
+@@ -617,9 +607,9 @@ cupsParseOptions(
+
+ value = ptr;
+
+- while (!isspace(*ptr & 255) && *ptr != '\0')
++ while (!isspace(*ptr & 255) && *ptr)
+ {
+- if (*ptr == '\\')
++ if (*ptr == '\\' && ptr[1])
+ _cups_strcpy(ptr, ptr + 1);
+
+ ptr ++;
+diff -up cups-1.3.5/cups/i18n.h.1.3.x cups-1.3.5/cups/i18n.h
+--- cups-1.3.5/cups/i18n.h.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/cups/i18n.h 2008-02-05 15:08:55.000000000 +0000
+@@ -82,6 +82,10 @@ typedef struct _cups_vmap_s /**** VBCS
+ * Prototypes...
+ */
+
++#ifdef __APPLE__
++extern const char *_cupsAppleLanguage(const char *locale, char *language,
++ size_t langsize);
++#endif /* __APPLE__ */
+ extern void _cupsCharmapFlush(void);
+ extern void _cupsCharmapFree(const cups_encoding_t encoding);
+ extern void *_cupsCharmapGet(const cups_encoding_t encoding);
+diff -up cups-1.3.5/cups/util.c.1.3.x cups-1.3.5/cups/util.c
+--- cups-1.3.5/cups/util.c.1.3.x 2007-10-10 23:00:43.000000000 +0100
++++ cups-1.3.5/cups/util.c 2008-02-05 15:08:55.000000000 +0000
+@@ -846,9 +846,6 @@ cupsGetPPD2(http_t *http, /* I - HT
+
+ close(fd);
+
+- if (http2 != http)
+- httpClose(http2);
+-
+ /*
+ * See if we actually got the file or an error...
+ */
+@@ -877,6 +874,9 @@ cupsGetPPD2(http_t *http, /* I - HT
+ return (NULL);
+ }
+
++ if (http2 != http)
++ httpClose(http2);
++
+ /*
+ * Return the PPD file...
+ */
+diff -up cups-1.3.5/cups/language.c.1.3.x cups-1.3.5/cups/language.c
+--- cups-1.3.5/cups/language.c.1.3.x 2007-10-31 18:51:08.000000000 +0000
++++ cups-1.3.5/cups/language.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * I18N/language support for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -16,6 +16,8 @@
+ *
+ * Contents:
+ *
++ * _cupsAppleLanguage() - Get the Apple language identifier associated
++ * with a locale ID.
+ * _cupsEncodingName() - Return the character encoding name string
+ * for the given encoding enumeration.
+ * cupsLangDefault() - Return the default language.
+@@ -65,26 +67,6 @@ static pthread_mutex_t lang_mutex = PTHR
+ #endif /* HAVE_PTHREAD_H */
+ static cups_lang_t *lang_cache = NULL;
+ /* Language string cache */
+-
+-
+-/*
+- * Local functions...
+- */
+-
+-#ifdef __APPLE__
+-static const char *appleLangDefault(void);
+-#endif /* __APPLE__ */
+-static cups_lang_t *cups_cache_lookup(const char *name,
+- cups_encoding_t encoding);
+-static int cups_message_compare(_cups_message_t *m1,
+- _cups_message_t *m2);
+-static void cups_unquote(char *d, const char *s);
+-
+-
+-/*
+- * Local globals...
+- */
+-
+ static const char * const lang_encodings[] =
+ { /* Encoding strings */
+ "us-ascii", "iso-8859-1",
+@@ -155,6 +137,123 @@ static const char * const lang_encodings
+ "euc-kr", "euc-tw"
+ };
+
++#ifdef __APPLE__
++typedef struct
++{
++ const char * const language; /* Language ID */
++ const char * const locale; /* Locale ID */
++} _apple_language_locale_t;
++
++static const _apple_language_locale_t apple_language_locale[] =
++{ /* Locale to language ID LUT */
++ { "en" , "en_US" },
++ { "nb" , "no" },
++ { "zh-Hans" , "zh_CN" },
++ { "zh-Hant" , "zh_TW" }
++};
++#endif /* __APPLE__ */
++
++
++/*
++ * Local functions...
++ */
++
++#ifdef __APPLE__
++static const char *appleLangDefault(void);
++#endif /* __APPLE__ */
++static cups_lang_t *cups_cache_lookup(const char *name,
++ cups_encoding_t encoding);
++static int cups_message_compare(_cups_message_t *m1,
++ _cups_message_t *m2);
++static void cups_unquote(char *d, const char *s);
++
++
++#ifdef __APPLE__
++/*
++ * _cupsAppleLanguage() - Get the Apple language identifier associated
++ * with a locale ID.
++ */
++
++const char * /* O - Language ID */
++_cupsAppleLanguage(const char *locale, /* I - Locale ID */
++ char *language,/* I - Language ID buffer */
++ size_t langsize) /* I - Size of language ID buffer */
++{
++ int i; /* Looping var */
++ CFStringRef localeid, /* CF locale identifier */
++ langid; /* CF language identifier */
++
++
++ /*
++ * Copy the locale name and convert, as needed, to the Apple-specific
++ * locale identifier...
++ */
++
++ switch (strlen(locale))
++ {
++ default :
++ /*
++ * Invalid locale...
++ */
++
++ strlcpy(language, "en", langsize);
++ break;
++
++ case 2 :
++ strlcpy(language, locale, langsize);
++ break;
++
++ case 5 :
++ strlcpy(language, locale, langsize);
++
++ if (language[2] == '-')
++ {
++ /*
++ * Convert ll-cc to ll_CC...
++ */
++
++ language[2] = '_';
++ language[3] = toupper(language[3] & 255);
++ language[4] = toupper(language[4] & 255);
++ }
++ break;
++ }
++
++ for (i = 0;
++ i < (int)(sizeof(apple_language_locale) /
++ sizeof(apple_language_locale[0]));
++ i ++)
++ if (!strcmp(locale, apple_language_locale[i].locale))
++ {
++ strlcpy(language, apple_language_locale[i].language, sizeof(language));
++ break;
++ }
++
++ /*
++ * Attempt to map the locale ID to a language ID...
++ */
++
++ if ((localeid = CFStringCreateWithCString(kCFAllocatorDefault, language,
++ kCFStringEncodingASCII)) != NULL)
++ {
++ if ((langid = CFLocaleCreateCanonicalLanguageIdentifierFromString(
++ kCFAllocatorDefault, localeid)) != NULL)
++ {
++ CFStringGetCString(langid, language, langsize, kCFStringEncodingASCII);
++ CFRelease(langid);
++ }
++
++ CFRelease(localeid);
++ }
++
++ /*
++ * Return what we got...
++ */
++
++ return (language);
++}
++#endif /* __APPLE__ */
++
+
+ /*
+ * '_cupsEncodingName()' - Return the character encoding name string
+@@ -876,7 +975,12 @@ _cupsMessageLoad(const char *filename) /
+ return (a);
+ }
+
+- m->id = strdup(ptr);
++ if ((m->id = strdup(ptr)) == NULL)
++ {
++ free(m);
++ cupsFileClose(fp);
++ return (a);
++ }
+ }
+ else if (s[0] == '\"' && m)
+ {
+@@ -924,7 +1028,11 @@ _cupsMessageLoad(const char *filename) /
+ * Set the string...
+ */
+
+- m->str = strdup(ptr);
++ if ((m->str = strdup(ptr)) == NULL)
++ {
++ cupsFileClose(fp);
++ return (a);
++ }
+ }
+ }
+
+@@ -974,30 +1082,6 @@ _cupsMessageLookup(cups_array_t *a, /* I
+
+ #ifdef __APPLE__
+ /*
+- * Code & data to translate OSX's language names to their ISO 639-1 locale.
+- *
+- * The first version uses the new CoreFoundation API added in 10.3 (Panther),
+- * the second is for 10.2 (Jaguar).
+- */
+-
+-# ifdef HAVE_CF_LOCALE_ID
+-
+-typedef struct
+-{
+- const char * const name; /* Language name */
+- const char * const locale; /* Locale name */
+-} _apple_name_locale_t;
+-
+-static const _apple_name_locale_t apple_name_locale[] =
+-{
+- { "en" , "en_US" },
+- { "nb" , "no" },
+- { "zh-Hans" , "zh_CN" },
+- { "zh-Hant" , "zh_TW" }
+-};
+-
+-
+-/*
+ * 'appleLangDefault()' - Get the default locale string.
+ */
+
+@@ -1067,14 +1151,15 @@ appleLangDefault(void)
+ */
+
+ for (i = 0;
+- i < sizeof(apple_name_locale) / sizeof(apple_name_locale[0]);
+- i++)
++ i < (int)(sizeof(apple_language_locale) /
++ sizeof(apple_language_locale[0]));
++ i ++)
+ {
+- if (!strcmp(cg->language, apple_name_locale[i].name))
++ if (!strcmp(cg->language, apple_language_locale[i].language))
+ {
+ DEBUG_printf(("appleLangDefault: mapping \"%s\" to \"%s\"...\n",
+- cg->language, apple_name_locale[i].locale));
+- strlcpy(cg->language, apple_name_locale[i].locale,
++ cg->language, apple_language_locale[i].locale));
++ strlcpy(cg->language, apple_language_locale[i].locale,
+ sizeof(cg->language));
+ break;
+ }
+@@ -1110,166 +1195,6 @@ appleLangDefault(void)
+
+ return (cg->language);
+ }
+-# else
+-/*
+- * Code & data to translate OSX 10.2's language names to their ISO 639-1
+- * locale.
+- */
+-
+-typedef struct
+-{
+- const char * const name; /* Language name */
+- const char * const locale; /* Locale name */
+-} _apple_name_locale_t;
+-
+-static const _apple_name_locale_t apple_name_locale[] =
+-{
+- { "English" , "en_US.UTF-8" }, { "French" , "fr.UTF-8" },
+- { "German" , "de.UTF-8" }, { "Italian" , "it.UTF-8" },
+- { "Dutch" , "nl.UTF-8" }, { "Swedish" , "sv.UTF-8" },
+- { "Spanish" , "es.UTF-8" }, { "Danish" , "da.UTF-8" },
+- { "Portuguese" , "pt.UTF-8" }, { "Norwegian" , "no.UTF-8" },
+- { "Hebrew" , "he.UTF-8" }, { "Japanese" , "ja.UTF-8" },
+- { "Arabic" , "ar.UTF-8" }, { "Finnish" , "fi.UTF-8" },
+- { "Greek" , "el.UTF-8" }, { "Icelandic" , "is.UTF-8" },
+- { "Maltese" , "mt.UTF-8" }, { "Turkish" , "tr.UTF-8" },
+- { "Croatian" , "hr.UTF-8" }, { "Chinese" , "zh.UTF-8" },
+- { "Urdu" , "ur.UTF-8" }, { "Hindi" , "hi.UTF-8" },
+- { "Thai" , "th.UTF-8" }, { "Korean" , "ko.UTF-8" },
+- { "Lithuanian" , "lt.UTF-8" }, { "Polish" , "pl.UTF-8" },
+- { "Hungarian" , "hu.UTF-8" }, { "Estonian" , "et.UTF-8" },
+- { "Latvian" , "lv.UTF-8" }, { "Sami" , "se.UTF-8" },
+- { "Faroese" , "fo.UTF-8" }, { "Farsi" , "fa.UTF-8" },
+- { "Russian" , "ru.UTF-8" }, { "Chinese" , "zh.UTF-8" },
+- { "Dutch" , "nl.UTF-8" }, { "Irish" , "ga.UTF-8" },
+- { "Albanian" , "sq.UTF-8" }, { "Romanian" , "ro.UTF-8" },
+- { "Czech" , "cs.UTF-8" }, { "Slovak" , "sk.UTF-8" },
+- { "Slovenian" , "sl.UTF-8" }, { "Yiddish" , "yi.UTF-8" },
+- { "Serbian" , "sr.UTF-8" }, { "Macedonian" , "mk.UTF-8" },
+- { "Bulgarian" , "bg.UTF-8" }, { "Ukrainian" , "uk.UTF-8" },
+- { "Byelorussian", "be.UTF-8" }, { "Uzbek" , "uz.UTF-8" },
+- { "Kazakh" , "kk.UTF-8" }, { "Azerbaijani", "az.UTF-8" },
+- { "Azerbaijani" , "az.UTF-8" }, { "Armenian" , "hy.UTF-8" },
+- { "Georgian" , "ka.UTF-8" }, { "Moldavian" , "mo.UTF-8" },
+- { "Kirghiz" , "ky.UTF-8" }, { "Tajiki" , "tg.UTF-8" },
+- { "Turkmen" , "tk.UTF-8" }, { "Mongolian" , "mn.UTF-8" },
+- { "Mongolian" , "mn.UTF-8" }, { "Pashto" , "ps.UTF-8" },
+- { "Kurdish" , "ku.UTF-8" }, { "Kashmiri" , "ks.UTF-8" },
+- { "Sindhi" , "sd.UTF-8" }, { "Tibetan" , "bo.UTF-8" },
+- { "Nepali" , "ne.UTF-8" }, { "Sanskrit" , "sa.UTF-8" },
+- { "Marathi" , "mr.UTF-8" }, { "Bengali" , "bn.UTF-8" },
+- { "Assamese" , "as.UTF-8" }, { "Gujarati" , "gu.UTF-8" },
+- { "Punjabi" , "pa.UTF-8" }, { "Oriya" , "or.UTF-8" },
+- { "Malayalam" , "ml.UTF-8" }, { "Kannada" , "kn.UTF-8" },
+- { "Tamil" , "ta.UTF-8" }, { "Telugu" , "te.UTF-8" },
+- { "Sinhalese" , "si.UTF-8" }, { "Burmese" , "my.UTF-8" },
+- { "Khmer" , "km.UTF-8" }, { "Lao" , "lo.UTF-8" },
+- { "Vietnamese" , "vi.UTF-8" }, { "Indonesian" , "id.UTF-8" },
+- { "Tagalog" , "tl.UTF-8" }, { "Malay" , "ms.UTF-8" },
+- { "Malay" , "ms.UTF-8" }, { "Amharic" , "am.UTF-8" },
+- { "Tigrinya" , "ti.UTF-8" }, { "Oromo" , "om.UTF-8" },
+- { "Somali" , "so.UTF-8" }, { "Swahili" , "sw.UTF-8" },
+- { "Kinyarwanda" , "rw.UTF-8" }, { "Rundi" , "rn.UTF-8" },
+- { "Nyanja" , "" }, { "Malagasy" , "mg.UTF-8" },
+- { "Esperanto" , "eo.UTF-8" }, { "Welsh" , "cy.UTF-8" },
+- { "Basque" , "eu.UTF-8" }, { "Catalan" , "ca.UTF-8" },
+- { "Latin" , "la.UTF-8" }, { "Quechua" , "qu.UTF-8" },
+- { "Guarani" , "gn.UTF-8" }, { "Aymara" , "ay.UTF-8" },
+- { "Tatar" , "tt.UTF-8" }, { "Uighur" , "ug.UTF-8" },
+- { "Dzongkha" , "dz.UTF-8" }, { "Javanese" , "jv.UTF-8" },
+- { "Sundanese" , "su.UTF-8" }, { "Galician" , "gl.UTF-8" },
+- { "Afrikaans" , "af.UTF-8" }, { "Breton" , "br.UTF-8" },
+- { "Inuktitut" , "iu.UTF-8" }, { "Scottish" , "gd.UTF-8" },
+- { "Manx" , "gv.UTF-8" }, { "Irish" , "ga.UTF-8" },
+- { "Tongan" , "to.UTF-8" }, { "Greek" , "el.UTF-8" },
+- { "Greenlandic" , "kl.UTF-8" }, { "Azerbaijani", "az.UTF-8" }
+-};
+-
+-
+-/*
+- * 'appleLangDefault()' - Get the default locale string.
+- */
+-
+-static const char * /* O - Locale string */
+-appleLangDefault(void)
+-{
+- int i; /* Looping var */
+- CFPropertyListRef localizationList;
+- /* List of localization data */
+- CFStringRef localizationName;
+- /* Current name */
+- char buff[256]; /* Temporary buffer */
+- _cups_globals_t *cg = _cupsGlobals();
+- /* Pointer to library globals */
+- char *lang; /* LANG environment variable */
+-
+-
+- /*
+- * Only do the lookup and translation the first time.
+- */
+-
+- if (!cg->language[0])
+- {
+- if ((lang = getenv("LANG")))
+- strlcpy(cg->language, lang, sizeof(cg->language));
+- else
+- {
+- localizationList =
+- CFPreferencesCopyAppValue(CFSTR("AppleLanguages"),
+- kCFPreferencesCurrentApplication);
+-
+- if (localizationList != NULL)
+- {
+- if (CFGetTypeID(localizationList) == CFArrayGetTypeID() &&
+- CFArrayGetCount(localizationList) > 0)
+- {
+- localizationName = CFArrayGetValueAtIndex(localizationList, 0);
+-
+- if (localizationName != NULL &&
+- CFGetTypeID(localizationName) == CFStringGetTypeID())
+- {
+- CFIndex length = CFStringGetLength(localizationName);
+-
+- if (length <= sizeof(buff) &&
+- CFStringGetCString(localizationName, buff, sizeof(buff),
+- kCFStringEncodingASCII))
+- {
+- buff[sizeof(buff) - 1] = '\0';
+-
+- for (i = 0;
+- i < sizeof(apple_name_locale) / sizeof(apple_name_locale[0]);
+- i++)
+- {
+- if (!strcasecmp(buff, apple_name_locale[i].name))
+- {
+- strlcpy(cg->language, apple_name_locale[i].locale,
+- sizeof(cg->language));
+- break;
+- }
+- }
+- }
+- }
+- }
+-
+- CFRelease(localizationList);
+- }
+- }
+-
+- /*
+- * If we didn't find the language, default to en_US...
+- */
+-
+- if (!cg->language[0])
+- strlcpy(cg->language, apple_name_locale[0].locale, sizeof(cg->language));
+- }
+-
+- /*
+- * Return the cached locale...
+- */
+-
+- return (cg->language);
+-}
+-# endif /* HAVE_CF_LOCALE_ID */
+ #endif /* __APPLE__ */
+
+
+diff -up cups-1.3.5/cups/emit.c.1.3.x cups-1.3.5/cups/emit.c
+--- cups-1.3.5/cups/emit.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/cups/emit.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * PPD code emission routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -106,15 +106,24 @@ ppdCollect2(ppd_file_t *ppd, /* I -
+ DEBUG_printf(("ppdCollect2(ppd=%p, section=%d, min_order=%f, choices=%p)\n",
+ ppd, section, min_order, choices));
+
+- if (ppd == NULL)
++ if (!ppd || !choices)
++ {
++ if (choices)
++ *choices = NULL;
++
+ return (0);
++ }
+
+ /*
+ * Allocate memory for up to 1000 selected choices...
+ */
+
+- count = 0;
+- collect = calloc(sizeof(ppd_choice_t *), 1000);
++ count = 0;
++ if ((collect = calloc(sizeof(ppd_choice_t *), 1000)) == NULL)
++ {
++ *choices = NULL;
++ return (0);
++ }
+
+ /*
+ * Loop through all options and add choices as needed...
+diff -up cups-1.3.5/cups/ipp-private.h.1.3.x cups-1.3.5/cups/ipp-private.h
+--- cups-1.3.5/cups/ipp-private.h.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/cups/ipp-private.h 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Private IPP definitions for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -40,6 +40,7 @@ extern "C" {
+
+ typedef struct /**** Attribute mapping data ****/
+ {
++ int multivalue; /* Option has multiple values? */
+ const char *name; /* Option/attribute name */
+ ipp_tag_t value_tag; /* Value tag for this attribute */
+ ipp_tag_t group_tag; /* Group tag for this attribute */
+diff -up cups-1.3.5/cups/http-addrlist.c.1.3.x cups-1.3.5/cups/http-addrlist.c
+--- cups-1.3.5/cups/http-addrlist.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/cups/http-addrlist.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * HTTP address list routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -202,9 +202,11 @@ httpAddrGetList(const char *hostname, /*
+ * Domain socket address...
+ */
+
+- first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
+- first->addr.un.sun_family = AF_LOCAL;
+- strlcpy(first->addr.un.sun_path, hostname, sizeof(first->addr.un.sun_path));
++ if ((first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t))) != NULL)
++ {
++ first->addr.un.sun_family = AF_LOCAL;
++ strlcpy(first->addr.un.sun_path, hostname, sizeof(first->addr.un.sun_path));
++ }
+ }
+ else
+ #endif /* AF_LOCAL */
+diff -up cups-1.3.5/cups/http-private.h.1.3.x cups-1.3.5/cups/http-private.h
+--- cups-1.3.5/cups/http-private.h.1.3.x 2007-09-10 17:46:20.000000000 +0100
++++ cups-1.3.5/cups/http-private.h 2008-02-05 15:08:55.000000000 +0000
+@@ -26,12 +26,6 @@
+ # include
+
+ # ifdef __sun
+-/*
+- * Define FD_SETSIZE to CUPS_MAX_FDS on Solaris to get the correct version of
+- * select() for large numbers of file descriptors.
+- */
+-
+-# define FD_SETSIZE CUPS_MAX_FDS
+ # include
+ # endif /* __sun */
+
+diff -up cups-1.3.5/cups/ppd.c.1.3.x cups-1.3.5/cups/ppd.c
+--- cups-1.3.5/cups/ppd.c.1.3.x 2007-11-30 19:29:50.000000000 +0000
++++ cups-1.3.5/cups/ppd.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * PPD file routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -814,6 +814,13 @@ ppdOpen2(cups_file_t *fp) /* I - File t
+ profile = realloc(ppd->profiles, sizeof(ppd_profile_t) *
+ (ppd->num_profiles + 1));
+
++ if (!profile)
++ {
++ cg->ppd_status = PPD_ALLOC_ERROR;
++
++ goto error;
++ }
++
+ ppd->profiles = profile;
+ profile += ppd->num_profiles;
+ ppd->num_profiles ++;
+@@ -1102,7 +1109,12 @@ ppdOpen2(cups_file_t *fp) /* I - File t
+ }
+
+ ppd->num_emulations = count;
+- ppd->emulations = calloc(count, sizeof(ppd_emul_t));
++ if ((ppd->emulations = calloc(count, sizeof(ppd_emul_t))) == NULL)
++ {
++ cg->ppd_status = PPD_ALLOC_ERROR;
++
++ goto error;
++ }
+
+ for (i = 0, sptr = string; i < count; i ++)
+ {
+@@ -1866,7 +1878,12 @@ ppdOpen2(cups_file_t *fp) /* I - File t
+ * Add the option choice...
+ */
+
+- choice = ppd_add_choice(option, name);
++ if ((choice = ppd_add_choice(option, name)) == NULL)
++ {
++ cg->ppd_status = PPD_ALLOC_ERROR;
++
++ goto error;
++ }
+
+ if (text[0])
+ cupsCharsetToUTF8((cups_utf8_t *)choice->text, text,
+diff -up cups-1.3.5/cups/cups.h.1.3.x cups-1.3.5/cups/cups.h
+--- cups-1.3.5/cups/cups.h.1.3.x 2007-11-01 23:29:14.000000000 +0000
++++ cups-1.3.5/cups/cups.h 2008-02-05 15:08:55.000000000 +0000
+@@ -59,10 +59,10 @@ extern "C" {
+ * Constants...
+ */
+
+-# define CUPS_VERSION 1.0305
++# define CUPS_VERSION 1.0306
+ # define CUPS_VERSION_MAJOR 1
+ # define CUPS_VERSION_MINOR 3
+-# define CUPS_VERSION_PATCH 5
++# define CUPS_VERSION_PATCH 6
+ # define CUPS_DATE_ANY -1
+
+
+diff -up cups-1.3.5/cups/ipp.c.1.3.x cups-1.3.5/cups/ipp.c
+--- cups-1.3.5/cups/ipp.c.1.3.x 2007-10-31 18:35:56.000000000 +0000
++++ cups-1.3.5/cups/ipp.c 2008-02-05 15:08:55.000000000 +0000
+@@ -4,7 +4,7 @@
+ * Internet Printing Protocol support functions for the Common UNIX
+ * Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -361,7 +361,12 @@ ippAddOctetString(ipp_t *ipp, /* I
+
+ if (data)
+ {
+- attr->values[0].unknown.data = malloc(datalen);
++ if ((attr->values[0].unknown.data = malloc(datalen)) == NULL)
++ {
++ ippDeleteAttribute(ipp, attr);
++ return (NULL);
++ }
++
+ memcpy(attr->values[0].unknown.data, data, datalen);
+ }
+
+@@ -1182,17 +1187,15 @@ ippReadIO(void *src, /* I - Data
+
+ attr->value_tag = tag;
+ }
+- else if (value_tag == IPP_TAG_STRING ||
+- (value_tag >= IPP_TAG_TEXTLANG &&
+- value_tag <= IPP_TAG_MIMETYPE))
++ else if (value_tag >= IPP_TAG_TEXTLANG &&
++ value_tag <= IPP_TAG_MIMETYPE)
+ {
+ /*
+ * String values can sometimes come across in different
+ * forms; accept sets of differing values...
+ */
+
+- if (tag != IPP_TAG_STRING &&
+- (tag < IPP_TAG_TEXTLANG || tag > IPP_TAG_MIMETYPE))
++ if (tag < IPP_TAG_TEXTLANG || tag > IPP_TAG_MIMETYPE)
+ return (IPP_ERROR);
+ }
+ else if (value_tag != tag)
+@@ -1277,7 +1280,11 @@ ippReadIO(void *src, /* I - Data
+ if (ipp->current)
+ ipp->prev = ipp->current;
+
+- attr = ipp->current = _ippAddAttr(ipp, 1);
++ if ((attr = ipp->current = _ippAddAttr(ipp, 1)) == NULL)
++ {
++ DEBUG_puts("ippReadIO: unable to allocate attribute!");
++ return (IPP_ERROR);
++ }
+
+ DEBUG_printf(("ippReadIO: name=\'%s\', ipp->current=%p, ipp->prev=%p\n",
+ buffer, ipp->current, ipp->prev));
+@@ -1325,6 +1332,7 @@ ippReadIO(void *src, /* I - Data
+
+ value->integer = n;
+ break;
++
+ case IPP_TAG_BOOLEAN :
+ if (n != 1)
+ {
+@@ -1340,10 +1348,10 @@ ippReadIO(void *src, /* I - Data
+
+ value->boolean = buffer[0];
+ break;
++
+ case IPP_TAG_TEXT :
+ case IPP_TAG_NAME :
+ case IPP_TAG_KEYWORD :
+- case IPP_TAG_STRING :
+ case IPP_TAG_URI :
+ case IPP_TAG_URISCHEME :
+ case IPP_TAG_CHARSET :
+@@ -1366,6 +1374,7 @@ ippReadIO(void *src, /* I - Data
+ DEBUG_printf(("ippReadIO: value = \'%s\'\n",
+ value->string.text));
+ break;
++
+ case IPP_TAG_DATE :
+ if (n != 11)
+ {
+@@ -1379,6 +1388,7 @@ ippReadIO(void *src, /* I - Data
+ return (IPP_ERROR);
+ }
+ break;
++
+ case IPP_TAG_RESOLUTION :
+ if (n != 9)
+ {
+@@ -1401,6 +1411,7 @@ ippReadIO(void *src, /* I - Data
+ value->resolution.units =
+ (ipp_res_t)buffer[8];
+ break;
++
+ case IPP_TAG_RANGE :
+ if (n != 8)
+ {
+@@ -1421,6 +1432,7 @@ ippReadIO(void *src, /* I - Data
+ (((((buffer[4] << 8) | buffer[5]) << 8) | buffer[6]) << 8) |
+ buffer[7];
+ break;
++
+ case IPP_TAG_TEXTLANG :
+ case IPP_TAG_NAMELANG :
+ if (n >= sizeof(buffer) || n < 4)
+@@ -1538,7 +1550,7 @@ ippReadIO(void *src, /* I - Data
+ break;
+
+ default : /* Other unsupported values */
+- if (n > sizeof(buffer))
++ if (n > IPP_MAX_LENGTH)
+ {
+ DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
+ return (IPP_ERROR);
+@@ -1547,7 +1559,12 @@ ippReadIO(void *src, /* I - Data
+ value->unknown.length = n;
+ if (n > 0)
+ {
+- value->unknown.data = malloc(n);
++ if ((value->unknown.data = malloc(n)) == NULL)
++ {
++ DEBUG_puts("ippReadIO: Unable to allocate value");
++ return (IPP_ERROR);
++ }
++
+ if ((*cb)(src, value->unknown.data, n) < n)
+ {
+ DEBUG_puts("ippReadIO: Unable to read unsupported value!");
+@@ -1941,7 +1958,6 @@ ippWriteIO(void *dst, /* I - Dest
+ case IPP_TAG_TEXT :
+ case IPP_TAG_NAME :
+ case IPP_TAG_KEYWORD :
+- case IPP_TAG_STRING :
+ case IPP_TAG_URI :
+ case IPP_TAG_URISCHEME :
+ case IPP_TAG_CHARSET :
+@@ -2507,7 +2523,6 @@ _ippFreeAttr(ipp_attribute_t *attr) /* I
+ case IPP_TAG_TEXT :
+ case IPP_TAG_NAME :
+ case IPP_TAG_KEYWORD :
+- case IPP_TAG_STRING :
+ case IPP_TAG_URI :
+ case IPP_TAG_URISCHEME :
+ case IPP_TAG_CHARSET :
+@@ -2546,6 +2561,13 @@ _ippFreeAttr(ipp_attribute_t *attr) /* I
+ ippDelete(value->collection);
+ break;
+
++ case IPP_TAG_STRING :
++ for (i = 0, value = attr->values;
++ i < attr->num_values;
++ i ++, value ++)
++ free(value->unknown.data);
++ break;
++
+ default :
+ if (!((int)attr->value_tag & IPP_TAG_COPY))
+ {
+@@ -2634,7 +2656,6 @@ ipp_length(ipp_t *ipp, /* I - IPP mess
+ case IPP_TAG_TEXT :
+ case IPP_TAG_NAME :
+ case IPP_TAG_KEYWORD :
+- case IPP_TAG_STRING :
+ case IPP_TAG_URI :
+ case IPP_TAG_URISCHEME :
+ case IPP_TAG_CHARSET :
+diff -up cups-1.3.5/cups/encode.c.1.3.x cups-1.3.5/cups/encode.c
+--- cups-1.3.5/cups/encode.c.1.3.x 2007-11-02 19:15:27.000000000 +0000
++++ cups-1.3.5/cups/encode.c 2008-02-05 15:08:55.000000000 +0000
+@@ -43,98 +43,98 @@
+
+ static const _ipp_option_t ipp_options[] =
+ {
+- { "auth-info", IPP_TAG_TEXT, IPP_TAG_JOB },
+- { "auth-info-required", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
+- { "blackplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
+- { "blackplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
+- { "brightness", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "brightness-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "columns", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "columns-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "copies", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "copies-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "document-format", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION },
+- { "document-format-default", IPP_TAG_MIMETYPE, IPP_TAG_PRINTER },
+- { "finishings", IPP_TAG_ENUM, IPP_TAG_JOB },
+- { "finishings-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
+- { "fitplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
+- { "fitplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
+- { "gamma", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "gamma-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "hue", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "hue-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "job-k-limit", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "job-page-limit", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "job-priority", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "job-quota-period", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "job-uuid", IPP_TAG_URI, IPP_TAG_JOB },
+- { "landscape", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
+- { "media", IPP_TAG_KEYWORD, IPP_TAG_JOB },
+- { "mirror", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
+- { "mirror-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
+- { "natural-scaling", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "natural-scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "notify-charset", IPP_TAG_CHARSET, IPP_TAG_SUBSCRIPTION },
+- { "notify-events", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION },
+- { "notify-events-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
+- { "notify-lease-duration", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION },
+- { "notify-lease-duration-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "notify-natural-language", IPP_TAG_LANGUAGE, IPP_TAG_SUBSCRIPTION },
+- { "notify-pull-method", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION },
+- { "notify-recipient-uri", IPP_TAG_URI, IPP_TAG_SUBSCRIPTION },
+- { "notify-time-interval", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION },
+- { "notify-user-data", IPP_TAG_STRING, IPP_TAG_SUBSCRIPTION },
+- { "number-up", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "number-up-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "orientation-requested", IPP_TAG_ENUM, IPP_TAG_JOB },
+- { "orientation-requested-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
+- { "page-bottom", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "page-bottom-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "page-left", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "page-left-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "page-ranges", IPP_TAG_RANGE, IPP_TAG_JOB },
+- { "page-ranges-default", IPP_TAG_RANGE, IPP_TAG_PRINTER },
+- { "page-right", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "page-right-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "page-top", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "page-top-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "penwidth", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "penwidth-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "port-monitor", IPP_TAG_NAME, IPP_TAG_PRINTER },
+- { "ppi", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "ppi-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "prettyprint", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
+- { "prettyprint-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
+- { "print-quality", IPP_TAG_ENUM, IPP_TAG_JOB },
+- { "print-quality-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
+- { "printer-error-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
+- { "printer-info", IPP_TAG_TEXT, IPP_TAG_PRINTER },
+- { "printer-is-accepting-jobs",IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
+- { "printer-is-shared", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
+- { "printer-location", IPP_TAG_TEXT, IPP_TAG_PRINTER },
+- { "printer-make-and-model", IPP_TAG_TEXT, IPP_TAG_PRINTER },
+- { "printer-more-info", IPP_TAG_URI, IPP_TAG_PRINTER },
+- { "printer-op-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
+- { "printer-resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB },
+- { "printer-state", IPP_TAG_ENUM, IPP_TAG_PRINTER },
+- { "printer-state-change-time",IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "printer-state-reasons", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
+- { "printer-type", IPP_TAG_ENUM, IPP_TAG_PRINTER },
+- { "printer-uri", IPP_TAG_URI, IPP_TAG_OPERATION },
+- { "queued-job-count", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "raw", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION },
+- { "requesting-user-name-allowed", IPP_TAG_NAME, IPP_TAG_PRINTER },
+- { "requesting-user-name-denied", IPP_TAG_NAME, IPP_TAG_PRINTER },
+- { "resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB },
+- { "resolution-default", IPP_TAG_RESOLUTION, IPP_TAG_PRINTER },
+- { "saturation", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "saturation-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "scaling", IPP_TAG_INTEGER, IPP_TAG_JOB },
+- { "scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+- { "sides", IPP_TAG_KEYWORD, IPP_TAG_JOB },
+- { "sides-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
+- { "wrap", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
+- { "wrap-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }
++ { 1, "auth-info", IPP_TAG_TEXT, IPP_TAG_JOB },
++ { 1, "auth-info-required", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
++ { 0, "blackplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
++ { 0, "blackplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
++ { 0, "brightness", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "brightness-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "columns", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "columns-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "copies", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "copies-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "document-format", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION },
++ { 0, "document-format-default", IPP_TAG_MIMETYPE, IPP_TAG_PRINTER },
++ { 1, "finishings", IPP_TAG_ENUM, IPP_TAG_JOB },
++ { 1, "finishings-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
++ { 0, "fitplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
++ { 0, "fitplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
++ { 0, "gamma", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "gamma-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "hue", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "hue-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "job-k-limit", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "job-page-limit", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "job-priority", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "job-quota-period", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "job-uuid", IPP_TAG_URI, IPP_TAG_JOB },
++ { 0, "landscape", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
++ { 1, "media", IPP_TAG_KEYWORD, IPP_TAG_JOB },
++ { 0, "mirror", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
++ { 0, "mirror-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
++ { 0, "natural-scaling", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "natural-scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "notify-charset", IPP_TAG_CHARSET, IPP_TAG_SUBSCRIPTION },
++ { 1, "notify-events", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION },
++ { 1, "notify-events-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
++ { 0, "notify-lease-duration", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION },
++ { 0, "notify-lease-duration-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "notify-natural-language", IPP_TAG_LANGUAGE, IPP_TAG_SUBSCRIPTION },
++ { 0, "notify-pull-method", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION },
++ { 0, "notify-recipient-uri", IPP_TAG_URI, IPP_TAG_SUBSCRIPTION },
++ { 0, "notify-time-interval", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION },
++ { 0, "notify-user-data", IPP_TAG_STRING, IPP_TAG_SUBSCRIPTION },
++ { 0, "number-up", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "number-up-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "orientation-requested", IPP_TAG_ENUM, IPP_TAG_JOB },
++ { 0, "orientation-requested-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
++ { 0, "page-bottom", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "page-bottom-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "page-left", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "page-left-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 1, "page-ranges", IPP_TAG_RANGE, IPP_TAG_JOB },
++ { 1, "page-ranges-default", IPP_TAG_RANGE, IPP_TAG_PRINTER },
++ { 0, "page-right", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "page-right-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "page-top", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "page-top-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "penwidth", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "penwidth-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "port-monitor", IPP_TAG_NAME, IPP_TAG_PRINTER },
++ { 0, "ppi", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "ppi-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "prettyprint", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
++ { 0, "prettyprint-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
++ { 0, "print-quality", IPP_TAG_ENUM, IPP_TAG_JOB },
++ { 0, "print-quality-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
++ { 0, "printer-error-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
++ { 0, "printer-info", IPP_TAG_TEXT, IPP_TAG_PRINTER },
++ { 0, "printer-is-accepting-jobs", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
++ { 0, "printer-is-shared", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
++ { 0, "printer-location", IPP_TAG_TEXT, IPP_TAG_PRINTER },
++ { 0, "printer-make-and-model", IPP_TAG_TEXT, IPP_TAG_PRINTER },
++ { 0, "printer-more-info", IPP_TAG_URI, IPP_TAG_PRINTER },
++ { 0, "printer-op-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
++ { 0, "printer-resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB },
++ { 0, "printer-state", IPP_TAG_ENUM, IPP_TAG_PRINTER },
++ { 0, "printer-state-change-time", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 1, "printer-state-reasons", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
++ { 0, "printer-type", IPP_TAG_ENUM, IPP_TAG_PRINTER },
++ { 0, "printer-uri", IPP_TAG_URI, IPP_TAG_OPERATION },
++ { 0, "queued-job-count", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "raw", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION },
++ { 1, "requesting-user-name-allowed", IPP_TAG_NAME, IPP_TAG_PRINTER },
++ { 1, "requesting-user-name-denied", IPP_TAG_NAME, IPP_TAG_PRINTER },
++ { 0, "resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB },
++ { 0, "resolution-default", IPP_TAG_RESOLUTION, IPP_TAG_PRINTER },
++ { 0, "saturation", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "saturation-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "scaling", IPP_TAG_INTEGER, IPP_TAG_JOB },
++ { 0, "scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
++ { 0, "sides", IPP_TAG_KEYWORD, IPP_TAG_JOB },
++ { 0, "sides-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
++ { 0, "wrap", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
++ { 0, "wrap-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }
+ };
+
+
+@@ -192,7 +192,8 @@ cupsEncodeOptions2(
+ char *s, /* Pointer into option value */
+ *val, /* Pointer to option value */
+ *copy, /* Copy of option value */
+- *sep; /* Option separator */
++ *sep, /* Option separator */
++ quote; /* Quote character */
+ ipp_attribute_t *attr; /* IPP attribute */
+ ipp_tag_t value_tag; /* IPP value tag */
+ cups_option_t *option; /* Current option */
+@@ -284,41 +285,28 @@ cupsEncodeOptions2(
+ * Count the number of values...
+ */
+
+- for (count = 1, sep = option->value; *sep; sep ++)
++ if (match && match->multivalue)
+ {
+- if (*sep == '\'')
++ for (count = 1, sep = option->value, quote = 0; *sep; sep ++)
+ {
+- /*
+- * Skip quoted option value...
+- */
+-
+- sep ++;
+-
+- while (*sep && *sep != '\'')
+- sep ++;
+-
+- if (!*sep)
+- sep --;
+- }
+- else if (*sep == '\"')
+- {
+- /*
+- * Skip quoted option value...
+- */
+-
+- sep ++;
+-
+- while (*sep && *sep != '\"')
++ if (*sep == quote)
++ quote = 0;
++ else if (!quote && (*sep == '\'' || *sep == '\"'))
++ {
++ /*
++ * Skip quoted option value...
++ */
++
++ quote = *sep++;
++ }
++ else if (*sep == ',' && !quote)
++ count ++;
++ else if (*sep == '\\' && sep[1])
+ sep ++;
+-
+- if (!*sep)
+- sep --;
+ }
+- else if (*sep == ',')
+- count ++;
+- else if (*sep == '\\' && sep[1])
+- sep ++;
+ }
++ else
++ count = 1;
+
+ DEBUG_printf(("cupsEncodeOptions2: option = \'%s\', count = %d\n",
+ option->name, count));
+@@ -390,16 +378,47 @@ cupsEncodeOptions2(
+ * Scan the value string for values...
+ */
+
+- for (j = 0; j < count; val = sep, j ++)
++ for (j = 0, sep = val; j < count; val = sep, j ++)
+ {
+ /*
+ * Find the end of this value and mark it if needed...
+ */
+
+- if ((sep = strchr(val, ',')) != NULL)
+- *sep++ = '\0';
+- else
+- sep = val + strlen(val);
++ if (count > 1)
++ {
++ for (quote = 0; *sep; sep ++)
++ {
++ if (*sep == quote)
++ {
++ /*
++ * Finish quoted value...
++ */
++
++ quote = 0;
++ }
++ else if (!quote && (*sep == '\'' || *sep == '\"'))
++ {
++ /*
++ * Handle quoted option value...
++ */
++
++ quote = *sep;
++ }
++ else if (*sep == ',' && count > 1)
++ break;
++ else if (*sep == '\\' && sep[1])
++ {
++ /*
++ * Skip quoted character...
++ */
++
++ sep ++;
++ }
++ }
++
++ if (*sep == ',')
++ *sep++ = '\0';
++ }
+
+ /*
+ * Copy the option value(s) over as needed by the type...
+@@ -413,7 +432,7 @@ cupsEncodeOptions2(
+ * Integer/enumeration value...
+ */
+
+- attr->values[j].integer = strtol(val, &s, 0);
++ attr->values[j].integer = strtol(val, &s, 10);
+
+ DEBUG_printf(("cupsEncodeOptions2: Added integer option value %d...\n",
+ attr->values[j].integer));
+@@ -455,12 +474,12 @@ cupsEncodeOptions2(
+ s = val;
+ }
+ else
+- attr->values[j].range.lower = strtol(val, &s, 0);
++ attr->values[j].range.lower = strtol(val, &s, 10);
+
+ if (*s == '-')
+ {
+ if (s[1])
+- attr->values[j].range.upper = strtol(s + 1, NULL, 0);
++ attr->values[j].range.upper = strtol(s + 1, NULL, 10);
+ else
+ attr->values[j].range.upper = 2147483647;
+ }
+@@ -477,10 +496,10 @@ cupsEncodeOptions2(
+ * Resolution...
+ */
+
+- attr->values[j].resolution.xres = strtol(val, &s, 0);
++ attr->values[j].resolution.xres = strtol(val, &s, 10);
+
+ if (*s == 'x')
+- attr->values[j].resolution.yres = strtol(s + 1, &s, 0);
++ attr->values[j].resolution.yres = strtol(s + 1, &s, 10);
+ else
+ attr->values[j].resolution.yres = attr->values[j].resolution.xres;
+
+@@ -499,7 +518,7 @@ cupsEncodeOptions2(
+ */
+
+ attr->values[j].unknown.length = (int)strlen(val);
+- attr->values[j].unknown.data = _cupsStrAlloc(val);
++ attr->values[j].unknown.data = strdup(val);
+
+ DEBUG_printf(("cupsEncodeOptions2: Added octet-string value \"%s\"...\n",
+ attr->values[j].unknown.data));
+diff -up cups-1.3.5/notifier/Makefile.1.3.x cups-1.3.5/notifier/Makefile
+--- cups-1.3.5/notifier/Makefile.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/notifier/Makefile 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ #
+ # Notifier makefile for the Common UNIX Printing System (CUPS).
+ #
+-# Copyright 2007 by Apple Inc.
++# Copyright 2007-2008 by Apple Inc.
+ # Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ #
+ # These coded instructions, statements, and computer programs are the
+@@ -44,7 +44,7 @@ install: all
+ for file in $(TARGETS); do \
+ $(INSTALL_BIN) $$file $(SERVERBIN)/notifier; \
+ done
+- $(INSTALL_DIR) -m 755 $(CACHEDIR)/rss
++ $(INSTALL_DIR) -m 775 $(CACHEDIR)/rss
+ -chgrp $(CUPS_GROUP) $(CACHEDIR)/rss
+ if test "x$(SYMROOT)" != "x"; then \
+ $(INSTALL_DIR) $(SYMROOT); \
+diff -up cups-1.3.5/pdftops/pdftops.cxx.1.3.x cups-1.3.5/pdftops/pdftops.cxx
+--- cups-1.3.5/pdftops/pdftops.cxx.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/pdftops/pdftops.cxx 2008-02-05 15:08:55.000000000 +0000
+@@ -308,8 +308,7 @@ main(int argc, // I - Number of comm
+ // write PostScript file
+ psOut = new PSOutputDev(psFileName->getCString(), doc->getXRef(),
+ doc->getCatalog(), 1, doc->getNumPages(),
+- psModePS, 0, 0, 0, 0, gFalse,
+- cupsGetOption("page-ranges", num_options, options));
++ psModePS, 0, 0, 0, 0, gFalse, NULL);
+ if (psOut->isOk())
+ doc->displayPages(psOut, 1, doc->getNumPages(), 72.0, 72.0, 0,
+ gTrue, gFalse, gFalse);
+diff -up cups-1.3.5/scheduler/testspeed.c.1.3.x cups-1.3.5/scheduler/testspeed.c
+--- cups-1.3.5/scheduler/testspeed.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scheduler/testspeed.c 2008-02-05 15:08:55.000000000 +0000
+@@ -166,7 +166,7 @@ main(int argc, /* I - Number of comm
+ * Exit with no errors...
+ */
+
+- return (status);
++ return (0);
+ }
+
+
+diff -up cups-1.3.5/scheduler/banners.c.1.3.x cups-1.3.5/scheduler/banners.c
+--- cups-1.3.5/scheduler/banners.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scheduler/banners.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Banner routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -147,8 +147,8 @@ add_banner(const char *name, /* I - Nam
+ if ((filetype = mimeFileType(MimeDatabase, filename, NULL, NULL)) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_WARN,
+- "add_banner: Banner \"%s\" (\"%s\") is of an unknown file type - skipping!",
+- name, filename);
++ "add_banner: Banner \"%s\" (\"%s\") is of an unknown file "
++ "type - skipping!", name, filename);
+ return;
+ }
+
+@@ -156,13 +156,27 @@ add_banner(const char *name, /* I - Nam
+ * Allocate memory...
+ */
+
+- temp = calloc(1, sizeof(cupsd_banner_t));
++ if ((temp = calloc(1, sizeof(cupsd_banner_t))) == NULL)
++ {
++ cupsdLogMessage(CUPSD_LOG_WARN,
++ "add_banner: Unable to allocate memory for banner \"%s\" - "
++ "skipping!", name);
++ return;
++ }
+
+ /*
+ * Copy the new banner data over...
+ */
+
+- temp->name = strdup(name);
++ if ((temp->name = strdup(name)) == NULL)
++ {
++ cupsdLogMessage(CUPSD_LOG_WARN,
++ "add_banner: Unable to allocate memory for banner \"%s\" - "
++ "skipping!", name);
++ free(temp);
++ return;
++ }
++
+ temp->filetype = filetype;
+
+ cupsArrayAdd(Banners, temp);
+diff -up cups-1.3.5/scheduler/printers.h.1.3.x cups-1.3.5/scheduler/printers.h
+--- cups-1.3.5/scheduler/printers.h.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scheduler/printers.h 2008-02-05 15:08:55.000000000 +0000
+@@ -86,6 +86,7 @@ typedef struct cupsd_printer_s
+ const char *auth_info_required[4]; /* Required authentication fields */
+ char *alert, /* PSX printer-alert value */
+ *alert_description; /* PSX printer-alert-description value */
++ time_t marker_time; /* Last time marker attributes were updated */
+
+ #ifdef __APPLE__
+ char *recoverable; /* com.apple.print.recoverable-message */
+@@ -150,6 +151,8 @@ extern void cupsdSaveAllPrinters(void);
+ extern int cupsdSetAuthInfoRequired(cupsd_printer_t *p,
+ const char *values,
+ ipp_attribute_t *attr);
++extern void cupsdSetPrinterAttr(cupsd_printer_t *p,
++ const char *name, char *value);
+ extern void cupsdSetPrinterAttrs(cupsd_printer_t *p);
+ extern void cupsdSetPrinterReasons(cupsd_printer_t *p,
+ const char *s);
+diff -up cups-1.3.5/scheduler/cupsfilter.c.1.3.x cups-1.3.5/scheduler/cupsfilter.c
+--- cups-1.3.5/scheduler/cupsfilter.c.1.3.x 2007-08-20 21:16:00.000000000 +0100
++++ cups-1.3.5/scheduler/cupsfilter.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * CUPS filtering program for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -131,6 +131,7 @@ main(int argc, /* I - Number of comm
+
+ mime = NULL;
+ srctype = NULL;
++ compression = 0;
+ dsttype = "application/pdf";
+ infile = NULL;
+ outfile = NULL;
+@@ -456,7 +457,8 @@ escape_options(
+ for (i = num_options, option = options, bytes = 1; i > 0; i --, option ++)
+ bytes += 2 * (strlen(option->name) + strlen(option->value)) + 2;
+
+- s = malloc(bytes);
++ if ((s = malloc(bytes)) == NULL)
++ return (NULL);
+
+ /*
+ * Copy the options to the string...
+@@ -806,6 +808,8 @@ exec_filters(cups_array_t *filters, /*
+ }
+ }
+
++ cupsArrayDelete(pids);
++
+ return (retval);
+ }
+
+diff -up cups-1.3.5/scheduler/main.c.1.3.x cups-1.3.5/scheduler/main.c
+--- cups-1.3.5/scheduler/main.c.1.3.x 2007-11-09 19:54:09.000000000 +0000
++++ cups-1.3.5/scheduler/main.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Scheduler main loop for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -133,10 +133,7 @@ main(int argc, /* I - Number of comm
+ browse_time, /* Next browse send time */
+ senddoc_time, /* Send-Document time */
+ expire_time, /* Subscription expire time */
+- mallinfo_time; /* Malloc information time */
+- size_t string_count, /* String count */
+- alloc_bytes, /* Allocated string bytes */
+- total_bytes; /* Total string bytes */
++ report_time; /* Malloc/client/job report time */
+ long timeout; /* Timeout for cupsdDoSelect() */
+ struct rlimit limit; /* Runtime limit */
+ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+@@ -149,6 +146,8 @@ main(int argc, /* I - Number of comm
+ #ifdef __APPLE__
+ int run_as_child = 0;
+ /* Needed for Mac OS X fork/exec */
++#else
++ time_t netif_time = 0; /* Time since last network update */
+ #endif /* __APPLE__ */
+ #if HAVE_LAUNCHD
+ int launchd_idle_exit;
+@@ -226,11 +225,22 @@ main(int argc, /* I - Number of comm
+ * are passed a NULL pointer.
+ */
+
+- current = malloc(1024);
+- getcwd(current, 1024);
++ if ((current = malloc(1024)) == NULL)
++ {
++ _cupsLangPuts(stderr,
++ _("cupsd: Unable to get current directory!\n"));
++ return (1);
++ }
++
++ if (!getcwd(current, 1024))
++ {
++ _cupsLangPuts(stderr,
++ _("cupsd: Unable to get current directory!\n"));
++ free(current);
++ return (1);
++ }
+
+ cupsdSetStringf(&ConfigurationFile, "%s/%s", current, argv[i]);
+-
+ free(current);
+ }
+ break;
+@@ -632,11 +642,11 @@ main(int argc, /* I - Number of comm
+ * Loop forever...
+ */
+
+- mallinfo_time = 0;
+ browse_time = time(NULL);
+- senddoc_time = time(NULL);
+ expire_time = time(NULL);
+ fds = 1;
++ report_time = 0;
++ senddoc_time = time(NULL);
+
+ while (!stop_scheduler)
+ {
+@@ -827,6 +837,18 @@ main(int argc, /* I - Number of comm
+
+ current_time = time(NULL);
+
++#ifndef __APPLE__
++ /*
++ * Update the network interfaces once a minute...
++ */
++
++ if ((current_time - netif_time) >= 60)
++ {
++ netif_time = current_time;
++ NetIFUpdate = 1;
++ }
++#endif /* !__APPLE__ */
++
+ #if HAVE_LAUNCHD
+ /*
+ * If no other work was scheduled and we're being controlled by launchd
+@@ -903,7 +925,7 @@ main(int argc, /* I - Number of comm
+ */
+
+ cupsdDeleteCert(0);
+- cupsdAddCert(0, "root");
++ cupsdAddCert(0, "root", NULL);
+ }
+
+ /*
+@@ -951,30 +973,49 @@ main(int argc, /* I - Number of comm
+ }
+
+ /*
+- * Log memory usage every minute...
++ * Log statistics at most once a minute when in debug mode...
+ */
+
+- if ((current_time - mallinfo_time) >= 60 && LogLevel >= CUPSD_LOG_DEBUG2)
++ if ((current_time - report_time) >= 60 && LogLevel >= CUPSD_LOG_DEBUG)
+ {
++ size_t string_count, /* String count */
++ alloc_bytes, /* Allocated string bytes */
++ total_bytes; /* Total string bytes */
+ #ifdef HAVE_MALLINFO
+- struct mallinfo mem; /* Malloc information */
++ struct mallinfo mem; /* Malloc information */
+
+
+ mem = mallinfo();
+- cupsdLogMessage(CUPSD_LOG_DEBUG2,
+- "mallinfo: arena = %d, used = %d, free = %d\n",
+- mem.arena, mem.usmblks + mem.uordblks,
++ cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: malloc-arena=%lu", mem.arena);
++ cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: malloc-used=%lu",
++ mem.usmblks + mem.uordblks);
++ cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: malloc-free=%lu",
+ mem.fsmblks + mem.fordblks);
+ #endif /* HAVE_MALLINFO */
+
++ cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: clients=%d",
++ cupsArrayCount(Clients));
++ cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: jobs=%d",
++ cupsArrayCount(Jobs));
++ cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: jobs-active=%d",
++ cupsArrayCount(ActiveJobs));
++ cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: printers=%d",
++ cupsArrayCount(Printers));
++ cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: printers-implicit=%d",
++ cupsArrayCount(ImplicitPrinters));
++
+ string_count = _cupsStrStatistics(&alloc_bytes, &total_bytes);
+- cupsdLogMessage(CUPSD_LOG_DEBUG2,
+- "stringpool: " CUPS_LLFMT " strings, "
+- CUPS_LLFMT " allocated, " CUPS_LLFMT " total bytes",
+- CUPS_LLCAST string_count, CUPS_LLCAST alloc_bytes,
++ cupsdLogMessage(CUPSD_LOG_DEBUG,
++ "Report: stringpool-string-count=" CUPS_LLFMT,
++ CUPS_LLCAST string_count);
++ cupsdLogMessage(CUPSD_LOG_DEBUG,
++ "Report: stringpool-alloc-bytes=" CUPS_LLFMT,
++ CUPS_LLCAST alloc_bytes);
++ cupsdLogMessage(CUPSD_LOG_DEBUG,
++ "Report: stringpool-total-bytes=" CUPS_LLFMT,
+ CUPS_LLCAST total_bytes);
+
+- mallinfo_time = current_time;
++ report_time = current_time;
+ }
+
+ /*
+@@ -1015,7 +1056,7 @@ main(int argc, /* I - Number of comm
+ * Reset the accumulated events...
+ */
+
+- LastEvent = CUPSD_EVENT_NONE;
++ LastEvent = CUPSD_EVENT_NONE;
+ }
+ }
+
+diff -up cups-1.3.5/scheduler/conf.c.1.3.x cups-1.3.5/scheduler/conf.c
+--- cups-1.3.5/scheduler/conf.c.1.3.x 2007-11-09 19:54:09.000000000 +0000
++++ cups-1.3.5/scheduler/conf.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Configuration routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -384,7 +384,7 @@ cupsdReadConfiguration(void)
+ if (NumRelays > 0)
+ {
+ for (i = 0; i < NumRelays; i ++)
+- if (Relays[i].from.type == AUTH_NAME)
++ if (Relays[i].from.type == CUPSD_AUTH_NAME)
+ free(Relays[i].from.mask.name.name);
+
+ free(Relays);
+@@ -508,7 +508,7 @@ cupsdReadConfiguration(void)
+ */
+
+ ConfigFilePerm = CUPS_DEFAULT_CONFIG_FILE_PERM;
+- DefaultAuthType = AUTH_BASIC;
++ DefaultAuthType = CUPSD_AUTH_BASIC;
+ #ifdef HAVE_SSL
+ DefaultEncryption = HTTP_ENCRYPT_REQUIRED;
+ #endif /* HAVE_SSL */
+@@ -962,8 +962,8 @@ cupsdReadConfiguration(void)
+ cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow");
+
+ po = cupsdAddPolicyOp(p, NULL, IPP_SEND_DOCUMENT);
+- po->order_type = AUTH_ALLOW;
+- po->level = AUTH_USER;
++ po->order_type = CUPSD_AUTH_ALLOW;
++ po->level = CUPSD_AUTH_USER;
+
+ cupsdAddName(po, "@OWNER");
+ cupsdAddName(po, "@SYSTEM");
+@@ -1003,9 +1003,9 @@ cupsdReadConfiguration(void)
+ cupsdLogMessage(CUPSD_LOG_INFO, "AuthType Default");
+
+ po = cupsdAddPolicyOp(p, NULL, IPP_PAUSE_PRINTER);
+- po->order_type = AUTH_ALLOW;
+- po->type = AUTH_DEFAULT;
+- po->level = AUTH_USER;
++ po->order_type = CUPSD_AUTH_ALLOW;
++ po->type = CUPSD_AUTH_DEFAULT;
++ po->level = CUPSD_AUTH_USER;
+
+ cupsdAddName(po, "@SYSTEM");
+ cupsdLogMessage(CUPSD_LOG_INFO, "Require user @SYSTEM");
+@@ -1038,7 +1038,7 @@ cupsdReadConfiguration(void)
+ cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow");
+
+ po = cupsdAddPolicyOp(p, NULL, IPP_ANY_OPERATION);
+- po->order_type = AUTH_ALLOW;
++ po->order_type = CUPSD_AUTH_ALLOW;
+
+ cupsdLogMessage(CUPSD_LOG_INFO, "");
+ cupsdLogMessage(CUPSD_LOG_INFO, "");
+@@ -1119,19 +1119,27 @@ cupsdReadConfiguration(void)
+ if (!mimeType(MimeDatabase, "application", "octet-stream"))
+ NumMimeTypes ++;
+
+- MimeTypes = calloc(NumMimeTypes, sizeof(const char *));
+-
+- for (i = 0, type = mimeFirstType(MimeDatabase);
+- type;
+- i ++, type = mimeNextType(MimeDatabase))
++ if ((MimeTypes = calloc(NumMimeTypes, sizeof(const char *))) == NULL)
+ {
+- snprintf(mimetype, sizeof(mimetype), "%s/%s", type->super, type->type);
+-
+- MimeTypes[i] = _cupsStrAlloc(mimetype);
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "Unable to allocate memory for %d MIME types!",
++ NumMimeTypes);
++ NumMimeTypes = 0;
+ }
++ else
++ {
++ for (i = 0, type = mimeFirstType(MimeDatabase);
++ type;
++ i ++, type = mimeNextType(MimeDatabase))
++ {
++ snprintf(mimetype, sizeof(mimetype), "%s/%s", type->super, type->type);
++
++ MimeTypes[i] = _cupsStrAlloc(mimetype);
++ }
+
+- if (i < NumMimeTypes)
+- MimeTypes[i] = _cupsStrAlloc("application/octet-stream");
++ if (i < NumMimeTypes)
++ MimeTypes[i] = _cupsStrAlloc("application/octet-stream");
++ }
+
+ if (LogLevel == CUPSD_LOG_DEBUG2)
+ {
+@@ -1568,9 +1576,9 @@ parse_aaa(cupsd_location_t *loc, /* I -
+ */
+
+ if (!strncasecmp(value, "deny", 4))
+- loc->order_type = AUTH_ALLOW;
++ loc->order_type = CUPSD_AUTH_ALLOW;
+ else if (!strncasecmp(value, "allow", 5))
+- loc->order_type = AUTH_DENY;
++ loc->order_type = CUPSD_AUTH_DENY;
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown Order value %s on line %d.",
+@@ -1681,44 +1689,44 @@ parse_aaa(cupsd_location_t *loc, /* I -
+
+ if (!strcasecmp(value, "none"))
+ {
+- loc->type = AUTH_NONE;
+- loc->level = AUTH_ANON;
++ loc->type = CUPSD_AUTH_NONE;
++ loc->level = CUPSD_AUTH_ANON;
+ }
+ else if (!strcasecmp(value, "basic"))
+ {
+- loc->type = AUTH_BASIC;
++ loc->type = CUPSD_AUTH_BASIC;
+
+- if (loc->level == AUTH_ANON)
+- loc->level = AUTH_USER;
++ if (loc->level == CUPSD_AUTH_ANON)
++ loc->level = CUPSD_AUTH_USER;
+ }
+ else if (!strcasecmp(value, "digest"))
+ {
+- loc->type = AUTH_DIGEST;
++ loc->type = CUPSD_AUTH_DIGEST;
+
+- if (loc->level == AUTH_ANON)
+- loc->level = AUTH_USER;
++ if (loc->level == CUPSD_AUTH_ANON)
++ loc->level = CUPSD_AUTH_USER;
+ }
+ else if (!strcasecmp(value, "basicdigest"))
+ {
+- loc->type = AUTH_BASICDIGEST;
++ loc->type = CUPSD_AUTH_BASICDIGEST;
+
+- if (loc->level == AUTH_ANON)
+- loc->level = AUTH_USER;
++ if (loc->level == CUPSD_AUTH_ANON)
++ loc->level = CUPSD_AUTH_USER;
+ }
+ else if (!strcasecmp(value, "default"))
+ {
+- loc->type = AUTH_DEFAULT;
++ loc->type = CUPSD_AUTH_DEFAULT;
+
+- if (loc->level == AUTH_ANON)
+- loc->level = AUTH_USER;
++ if (loc->level == CUPSD_AUTH_ANON)
++ loc->level = CUPSD_AUTH_USER;
+ }
+ #ifdef HAVE_GSSAPI
+ else if (!strcasecmp(value, "negotiate"))
+ {
+- loc->type = AUTH_NEGOTIATE;
++ loc->type = CUPSD_AUTH_NEGOTIATE;
+
+- if (loc->level == AUTH_ANON)
+- loc->level = AUTH_USER;
++ if (loc->level == CUPSD_AUTH_ANON)
++ loc->level = CUPSD_AUTH_USER;
+ }
+ #endif /* HAVE_GSSAPI */
+ else
+@@ -1737,8 +1745,8 @@ parse_aaa(cupsd_location_t *loc, /* I -
+
+ if (!strcasecmp(value, "anonymous"))
+ {
+- loc->type = AUTH_NONE;
+- loc->level = AUTH_ANON;
++ loc->type = CUPSD_AUTH_NONE;
++ loc->level = CUPSD_AUTH_ANON;
+
+ cupsdLogMessage(CUPSD_LOG_WARN,
+ "\"AuthClass %s\" is deprecated; consider removing "
+@@ -1747,7 +1755,7 @@ parse_aaa(cupsd_location_t *loc, /* I -
+ }
+ else if (!strcasecmp(value, "user"))
+ {
+- loc->level = AUTH_USER;
++ loc->level = CUPSD_AUTH_USER;
+
+ cupsdLogMessage(CUPSD_LOG_WARN,
+ "\"AuthClass %s\" is deprecated; consider using "
+@@ -1756,7 +1764,7 @@ parse_aaa(cupsd_location_t *loc, /* I -
+ }
+ else if (!strcasecmp(value, "group"))
+ {
+- loc->level = AUTH_GROUP;
++ loc->level = CUPSD_AUTH_GROUP;
+
+ cupsdLogMessage(CUPSD_LOG_WARN,
+ "\"AuthClass %s\" is deprecated; consider using "
+@@ -1765,7 +1773,7 @@ parse_aaa(cupsd_location_t *loc, /* I -
+ }
+ else if (!strcasecmp(value, "system"))
+ {
+- loc->level = AUTH_GROUP;
++ loc->level = CUPSD_AUTH_GROUP;
+
+ cupsdAddName(loc, "@SYSTEM");
+
+@@ -1810,9 +1818,9 @@ parse_aaa(cupsd_location_t *loc, /* I -
+
+ if (!strcasecmp(value, "valid-user") ||
+ !strcasecmp(value, "user"))
+- loc->level = AUTH_USER;
++ loc->level = CUPSD_AUTH_USER;
+ else if (!strcasecmp(value, "group"))
+- loc->level = AUTH_GROUP;
++ loc->level = CUPSD_AUTH_GROUP;
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Require type %s on line %d.",
+@@ -1873,9 +1881,9 @@ parse_aaa(cupsd_location_t *loc, /* I -
+ else if (!strcasecmp(line, "Satisfy"))
+ {
+ if (!strcasecmp(value, "all"))
+- loc->satisfy = AUTH_SATISFY_ALL;
++ loc->satisfy = CUPSD_AUTH_SATISFY_ALL;
+ else if (!strcasecmp(value, "any"))
+- loc->satisfy = AUTH_SATISFY_ANY;
++ loc->satisfy = CUPSD_AUTH_SATISFY_ANY;
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Satisfy value %s on line %d.",
+@@ -2353,9 +2361,9 @@ read_configuration(cups_file_t *fp) /* I
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unable to initialize browse access control list!");
+ else if (!strncasecmp(value, "deny", 4))
+- location->order_type = AUTH_ALLOW;
++ location->order_type = CUPSD_AUTH_ALLOW;
+ else if (!strncasecmp(value, "allow", 5))
+- location->order_type = AUTH_DENY;
++ location->order_type = CUPSD_AUTH_DENY;
+ else
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unknown BrowseOrder value %s on line %d.",
+@@ -2559,8 +2567,16 @@ read_configuration(cups_file_t *fp) /* I
+ if ((ptr = strchr(temp, ' ')) != NULL)
+ *ptr = '\0';
+
+- relay->from.type = AUTH_NAME;
+- relay->from.mask.name.name = strdup(temp);
++ relay->from.type = CUPSD_AUTH_NAME;
++
++ if ((relay->from.mask.name.name = strdup(temp)) == NULL)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "Unable to allocate BrowseRelay name at line %d - %s.",
++ linenum, strerror(errno));
++ continue;
++ }
++
+ relay->from.mask.name.length = strlen(temp);
+ }
+ else
+@@ -2576,7 +2592,7 @@ read_configuration(cups_file_t *fp) /* I
+ break;
+ }
+
+- relay->from.type = AUTH_IP;
++ relay->from.type = CUPSD_AUTH_IP;
+ memcpy(relay->from.mask.ip.address, ip,
+ sizeof(relay->from.mask.ip.address));
+ memcpy(relay->from.mask.ip.netmask, mask,
+@@ -2626,7 +2642,7 @@ read_configuration(cups_file_t *fp) /* I
+
+ httpAddrString(&(relay->to), temp, sizeof(temp));
+
+- if (relay->from.type == AUTH_IP)
++ if (relay->from.type == CUPSD_AUTH_IP)
+ snprintf(temp2, sizeof(temp2), "%u.%u.%u.%u/%u.%u.%u.%u",
+ relay->from.mask.ip.address[0] >> 24,
+ (relay->from.mask.ip.address[0] >> 16) & 255,
+@@ -2652,7 +2668,7 @@ read_configuration(cups_file_t *fp) /* I
+ }
+ else
+ {
+- if (relay->from.type == AUTH_NAME)
++ if (relay->from.type == CUPSD_AUTH_NAME)
+ free(relay->from.mask.name.name);
+
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Bad relay address %s at line %d.",
+@@ -2728,16 +2744,16 @@ read_configuration(cups_file_t *fp) /* I
+ */
+
+ if (!strcasecmp(value, "none"))
+- DefaultAuthType = AUTH_NONE;
++ DefaultAuthType = CUPSD_AUTH_NONE;
+ else if (!strcasecmp(value, "basic"))
+- DefaultAuthType = AUTH_BASIC;
++ DefaultAuthType = CUPSD_AUTH_BASIC;
+ else if (!strcasecmp(value, "digest"))
+- DefaultAuthType = AUTH_DIGEST;
++ DefaultAuthType = CUPSD_AUTH_DIGEST;
+ else if (!strcasecmp(value, "basicdigest"))
+- DefaultAuthType = AUTH_BASICDIGEST;
++ DefaultAuthType = CUPSD_AUTH_BASICDIGEST;
+ #ifdef HAVE_GSSAPI
+ else if (!strcasecmp(value, "negotiate"))
+- DefaultAuthType = AUTH_NEGOTIATE;
++ DefaultAuthType = CUPSD_AUTH_NEGOTIATE;
+ #endif /* HAVE_GSSAPI */
+ else
+ {
+@@ -3125,7 +3141,7 @@ read_location(cups_file_t *fp, /* I - C
+ if ((parent = cupsdAddLocation(location)) == NULL)
+ return (0);
+
+- parent->limit = AUTH_LIMIT_ALL;
++ parent->limit = CUPSD_AUTH_LIMIT_ALL;
+ loc = parent;
+
+ while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
+@@ -3157,19 +3173,19 @@ read_location(cups_file_t *fp, /* I - C
+ *valptr++ = '\0';
+
+ if (!strcmp(value, "ALL"))
+- loc->limit = AUTH_LIMIT_ALL;
++ loc->limit = CUPSD_AUTH_LIMIT_ALL;
+ else if (!strcmp(value, "GET"))
+- loc->limit |= AUTH_LIMIT_GET;
++ loc->limit |= CUPSD_AUTH_LIMIT_GET;
+ else if (!strcmp(value, "HEAD"))
+- loc->limit |= AUTH_LIMIT_HEAD;
++ loc->limit |= CUPSD_AUTH_LIMIT_HEAD;
+ else if (!strcmp(value, "OPTIONS"))
+- loc->limit |= AUTH_LIMIT_OPTIONS;
++ loc->limit |= CUPSD_AUTH_LIMIT_OPTIONS;
+ else if (!strcmp(value, "POST"))
+- loc->limit |= AUTH_LIMIT_POST;
++ loc->limit |= CUPSD_AUTH_LIMIT_POST;
+ else if (!strcmp(value, "PUT"))
+- loc->limit |= AUTH_LIMIT_PUT;
++ loc->limit |= CUPSD_AUTH_LIMIT_PUT;
+ else if (!strcmp(value, "TRACE"))
+- loc->limit |= AUTH_LIMIT_TRACE;
++ loc->limit |= CUPSD_AUTH_LIMIT_TRACE;
+ else
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown request type %s on line %d!",
+ value, linenum);
+@@ -3178,7 +3194,7 @@ read_location(cups_file_t *fp, /* I - C
+ }
+
+ if (!strcasecmp(line, "limit = AUTH_LIMIT_ALL ^ loc->limit;
++ loc->limit = CUPSD_AUTH_LIMIT_ALL ^ loc->limit;
+
+ parent->limit &= ~loc->limit;
+ }
+diff -up cups-1.3.5/scheduler/auth.c.1.3.x cups-1.3.5/scheduler/auth.c
+--- cups-1.3.5/scheduler/auth.c.1.3.x 2007-10-22 21:27:22.000000000 +0100
++++ cups-1.3.5/scheduler/auth.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Authorization routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * This file contains Kerberos support code, copyright 2006 by
+@@ -176,8 +176,13 @@ cupsdAddLocation(const char *location) /
+ * Initialize the record and copy the name over...
+ */
+
+- temp->location = strdup(location);
+- temp->length = strlen(temp->location);
++ if ((temp->location = strdup(location)) == NULL)
++ {
++ free(temp);
++ return (NULL);
++ }
++
++ temp->length = strlen(temp->location);
+
+ cupsArrayAdd(Locations, temp);
+
+@@ -257,7 +262,7 @@ cupsdAllowHost(cupsd_location_t *loc, /*
+ * Allow *interface*...
+ */
+
+- temp->type = AUTH_INTERFACE;
++ temp->type = CUPSD_AUTH_INTERFACE;
+ temp->mask.name.name = strdup("*");
+ temp->mask.name.length = 1;
+ }
+@@ -277,7 +282,7 @@ cupsdAllowHost(cupsd_location_t *loc, /*
+ *ifptr = '\0';
+ }
+
+- temp->type = AUTH_INTERFACE;
++ temp->type = CUPSD_AUTH_INTERFACE;
+ temp->mask.name.name = strdup(ifname);
+ temp->mask.name.length = ifptr - ifname;
+ }
+@@ -287,7 +292,7 @@ cupsdAllowHost(cupsd_location_t *loc, /*
+ * Allow name...
+ */
+
+- temp->type = AUTH_NAME;
++ temp->type = CUPSD_AUTH_NAME;
+ temp->mask.name.name = strdup(name);
+ temp->mask.name.length = strlen(name);
+ }
+@@ -316,7 +321,7 @@ cupsdAllowIP(cupsd_location_t *loc, /* I
+ if ((temp = add_allow(loc)) == NULL)
+ return;
+
+- temp->type = AUTH_IP;
++ temp->type = CUPSD_AUTH_IP;
+ memcpy(temp->mask.ip.address, address, sizeof(temp->mask.ip.address));
+ memcpy(temp->mask.ip.netmask, netmask, sizeof(temp->mask.ip.netmask));
+ }
+@@ -363,15 +368,15 @@ cupsdAuthorize(cupsd_client_t *con) /* I
+ */
+
+ con->best = cupsdFindBest(con->uri, con->http.state);
+- con->type = AUTH_NONE;
++ con->type = CUPSD_AUTH_NONE;
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "cupsdAuthorize: con->uri=\"%s\", con->best=%p(%s)",
+ con->uri, con->best, con->best ? con->best->location : "");
+
+- if (con->best && con->best->type != AUTH_NONE)
++ if (con->best && con->best->type != CUPSD_AUTH_NONE)
+ {
+- if (con->best->type == AUTH_DEFAULT)
++ if (con->best->type == CUPSD_AUTH_DEFAULT)
+ type = DefaultAuthType;
+ else
+ type = con->best->type;
+@@ -463,7 +468,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I
+
+ AuthorizationFreeItemSet(authinfo);
+
+- con->type = AUTH_BASIC;
++ con->type = CUPSD_AUTH_BASIC;
+ }
+ #endif /* HAVE_AUTHORIZATION_H */
+ #if defined(SO_PEERCRED) && defined(AF_LOCAL)
+@@ -520,7 +525,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I
+ "cupsdAuthorize: Authorized as %s using PeerCred",
+ username);
+
+- con->type = AUTH_BASIC;
++ con->type = CUPSD_AUTH_BASIC;
+ }
+ #endif /* SO_PEERCRED && AF_LOCAL */
+ else if (!strncmp(authorization, "Local", 5) &&
+@@ -550,7 +555,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I
+ return;
+ }
+
+- con->type = AUTH_BASIC;
++ con->type = CUPSD_AUTH_BASIC;
+ }
+ else if (!strncmp(authorization, "Basic", 5))
+ {
+@@ -612,7 +617,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I
+ switch (type)
+ {
+ default :
+- case AUTH_BASIC :
++ case CUPSD_AUTH_BASIC :
+ {
+ #if HAVE_LIBPAM
+ /*
+@@ -811,7 +816,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I
+ username);
+ break;
+
+- case AUTH_BASICDIGEST :
++ case CUPSD_AUTH_BASICDIGEST :
+ /*
+ * Do Basic authentication with the Digest password file...
+ */
+@@ -915,7 +920,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I
+ "cupsdAuthorize: Authorized as %s using Digest",
+ username);
+
+- con->type = AUTH_DIGEST;
++ con->type = CUPSD_AUTH_DIGEST;
+ }
+ #ifdef HAVE_GSSAPI
+ else if (!strncmp(authorization, "Negotiate", 9))
+@@ -1056,7 +1061,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I
+
+ con->gss_have_creds = 1;
+
+- con->type = AUTH_NEGOTIATE;
++ con->type = CUPSD_AUTH_NEGOTIATE;
+ }
+ else
+ gss_release_name(&minor_status, &client_name);
+@@ -1109,7 +1114,7 @@ cupsdCheckAuth(
+ {
+ switch (masks->type)
+ {
+- case AUTH_INTERFACE :
++ case CUPSD_AUTH_INTERFACE :
+ /*
+ * Check for a match with a network interface...
+ */
+@@ -1217,7 +1222,7 @@ cupsdCheckAuth(
+ }
+ break;
+
+- case AUTH_NAME :
++ case CUPSD_AUTH_NAME :
+ /*
+ * Check for exact name match...
+ */
+@@ -1236,7 +1241,7 @@ cupsdCheckAuth(
+ return (1);
+ break;
+
+- case AUTH_IP :
++ case CUPSD_AUTH_IP :
+ /*
+ * Check for IP/network address match...
+ */
+@@ -1427,7 +1432,7 @@ cupsdCopyLocation(
+ for (i = 0; i < temp->num_allow; i ++)
+ switch (temp->allow[i].type = (*loc)->allow[i].type)
+ {
+- case AUTH_NAME :
++ case CUPSD_AUTH_NAME :
+ temp->allow[i].mask.name.length = (*loc)->allow[i].mask.name.length;
+ temp->allow[i].mask.name.name = strdup((*loc)->allow[i].mask.name.name);
+
+@@ -1440,7 +1445,7 @@ cupsdCopyLocation(
+ return (NULL);
+ }
+ break;
+- case AUTH_IP :
++ case CUPSD_AUTH_IP :
+ memcpy(&(temp->allow[i].mask.ip), &((*loc)->allow[i].mask.ip),
+ sizeof(cupsd_ipmask_t));
+ break;
+@@ -1465,7 +1470,7 @@ cupsdCopyLocation(
+ for (i = 0; i < temp->num_deny; i ++)
+ switch (temp->deny[i].type = (*loc)->deny[i].type)
+ {
+- case AUTH_NAME :
++ case CUPSD_AUTH_NAME :
+ temp->deny[i].mask.name.length = (*loc)->deny[i].mask.name.length;
+ temp->deny[i].mask.name.name = strdup((*loc)->deny[i].mask.name.name);
+
+@@ -1478,7 +1483,7 @@ cupsdCopyLocation(
+ return (NULL);
+ }
+ break;
+- case AUTH_IP :
++ case CUPSD_AUTH_IP :
+ memcpy(&(temp->deny[i].mask.ip), &((*loc)->deny[i].mask.ip),
+ sizeof(cupsd_ipmask_t));
+ break;
+@@ -1538,14 +1543,14 @@ cupsdDeleteLocation(
+ free(loc->names);
+
+ for (i = loc->num_allow, mask = loc->allow; i > 0; i --, mask ++)
+- if (mask->type == AUTH_NAME || mask->type == AUTH_INTERFACE)
++ if (mask->type == CUPSD_AUTH_NAME || mask->type == CUPSD_AUTH_INTERFACE)
+ free(mask->mask.name.name);
+
+ if (loc->num_allow > 0)
+ free(loc->allow);
+
+ for (i = loc->num_deny, mask = loc->deny; i > 0; i --, mask ++)
+- if (mask->type == AUTH_NAME || mask->type == AUTH_INTERFACE)
++ if (mask->type == CUPSD_AUTH_NAME || mask->type == CUPSD_AUTH_INTERFACE)
+ free(mask->mask.name.name);
+
+ if (loc->num_deny > 0)
+@@ -1582,7 +1587,7 @@ cupsdDenyHost(cupsd_location_t *loc, /*
+ * Deny *interface*...
+ */
+
+- temp->type = AUTH_INTERFACE;
++ temp->type = CUPSD_AUTH_INTERFACE;
+ temp->mask.name.name = strdup("*");
+ temp->mask.name.length = 1;
+ }
+@@ -1602,7 +1607,7 @@ cupsdDenyHost(cupsd_location_t *loc, /*
+ *ifptr = '\0';
+ }
+
+- temp->type = AUTH_INTERFACE;
++ temp->type = CUPSD_AUTH_INTERFACE;
+ temp->mask.name.name = strdup(ifname);
+ temp->mask.name.length = ifptr - ifname;
+ }
+@@ -1612,7 +1617,7 @@ cupsdDenyHost(cupsd_location_t *loc, /*
+ * Deny name...
+ */
+
+- temp->type = AUTH_NAME;
++ temp->type = CUPSD_AUTH_NAME;
+ temp->mask.name.name = strdup(name);
+ temp->mask.name.length = strlen(name);
+ }
+@@ -1641,7 +1646,7 @@ cupsdDenyIP(cupsd_location_t *loc, /* I
+ if ((temp = add_deny(loc)) == NULL)
+ return;
+
+- temp->type = AUTH_IP;
++ temp->type = CUPSD_AUTH_IP;
+ memcpy(temp->mask.ip.address, address, sizeof(temp->mask.ip.address));
+ memcpy(temp->mask.ip.netmask, netmask, sizeof(temp->mask.ip.netmask));
+ }
+@@ -1662,22 +1667,22 @@ cupsdFindBest(const char *path, /* I -
+ *best; /* Best match for location so far */
+ int bestlen; /* Length of best match */
+ int limit; /* Limit field */
+- static const int limits[] = /* Map http_status_t to AUTH_LIMIT_xyz */
++ static const int limits[] = /* Map http_status_t to CUPSD_AUTH_LIMIT_xyz */
+ {
+- AUTH_LIMIT_ALL,
+- AUTH_LIMIT_OPTIONS,
+- AUTH_LIMIT_GET,
+- AUTH_LIMIT_GET,
+- AUTH_LIMIT_HEAD,
+- AUTH_LIMIT_POST,
+- AUTH_LIMIT_POST,
+- AUTH_LIMIT_POST,
+- AUTH_LIMIT_PUT,
+- AUTH_LIMIT_PUT,
+- AUTH_LIMIT_DELETE,
+- AUTH_LIMIT_TRACE,
+- AUTH_LIMIT_ALL,
+- AUTH_LIMIT_ALL
++ CUPSD_AUTH_LIMIT_ALL,
++ CUPSD_AUTH_LIMIT_OPTIONS,
++ CUPSD_AUTH_LIMIT_GET,
++ CUPSD_AUTH_LIMIT_GET,
++ CUPSD_AUTH_LIMIT_HEAD,
++ CUPSD_AUTH_LIMIT_POST,
++ CUPSD_AUTH_LIMIT_POST,
++ CUPSD_AUTH_LIMIT_POST,
++ CUPSD_AUTH_LIMIT_PUT,
++ CUPSD_AUTH_LIMIT_PUT,
++ CUPSD_AUTH_LIMIT_DELETE,
++ CUPSD_AUTH_LIMIT_TRACE,
++ CUPSD_AUTH_LIMIT_ALL,
++ CUPSD_AUTH_LIMIT_ALL
+ };
+
+
+@@ -1837,16 +1842,16 @@ cupsdIsAuthorized(cupsd_client_t *con, /
+
+ best = con->best;
+
+- if ((type = best->type) == AUTH_DEFAULT)
++ if ((type = best->type) == CUPSD_AUTH_DEFAULT)
+ type = DefaultAuthType;
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+- "cupsdIsAuthorized: level=AUTH_%s, type=%s, "
+- "satisfy=AUTH_SATISFY_%s, num_names=%d",
++ "cupsdIsAuthorized: level=CUPSD_AUTH_%s, type=%s, "
++ "satisfy=CUPSD_AUTH_SATISFY_%s, num_names=%d",
+ levels[best->level], types[type],
+ best->satisfy ? "ANY" : "ALL", best->num_names);
+
+- if (best->limit == AUTH_LIMIT_IPP)
++ if (best->limit == CUPSD_AUTH_LIMIT_IPP)
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: op=%x(%s)",
+ best->op, ippOpString(best->op));
+
+@@ -1890,7 +1895,7 @@ cupsdIsAuthorized(cupsd_client_t *con, /
+ * Access from localhost (127.0.0.1 or ::1) is always allowed...
+ */
+
+- auth = AUTH_ALLOW;
++ auth = CUPSD_AUTH_ALLOW;
+ }
+ else
+ {
+@@ -1901,39 +1906,39 @@ cupsdIsAuthorized(cupsd_client_t *con, /
+ switch (best->order_type)
+ {
+ default :
+- auth = AUTH_DENY; /* anti-compiler-warning-code */
++ auth = CUPSD_AUTH_DENY; /* anti-compiler-warning-code */
+ break;
+
+- case AUTH_ALLOW : /* Order Deny,Allow */
+- auth = AUTH_ALLOW;
++ case CUPSD_AUTH_ALLOW : /* Order Deny,Allow */
++ auth = CUPSD_AUTH_ALLOW;
+
+ if (cupsdCheckAuth(address, con->http.hostname, hostlen,
+ best->num_deny, best->deny))
+- auth = AUTH_DENY;
++ auth = CUPSD_AUTH_DENY;
+
+ if (cupsdCheckAuth(address, con->http.hostname, hostlen,
+ best->num_allow, best->allow))
+- auth = AUTH_ALLOW;
++ auth = CUPSD_AUTH_ALLOW;
+ break;
+
+- case AUTH_DENY : /* Order Allow,Deny */
+- auth = AUTH_DENY;
++ case CUPSD_AUTH_DENY : /* Order Allow,Deny */
++ auth = CUPSD_AUTH_DENY;
+
+ if (cupsdCheckAuth(address, con->http.hostname, hostlen,
+ best->num_allow, best->allow))
+- auth = AUTH_ALLOW;
++ auth = CUPSD_AUTH_ALLOW;
+
+ if (cupsdCheckAuth(address, con->http.hostname, hostlen,
+ best->num_deny, best->deny))
+- auth = AUTH_DENY;
++ auth = CUPSD_AUTH_DENY;
+ break;
+ }
+ }
+
+- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: auth=AUTH_%s...",
++ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: auth=CUPSD_AUTH_%s...",
+ auth ? "DENY" : "ALLOW");
+
+- if (auth == AUTH_DENY && best->satisfy == AUTH_SATISFY_ALL)
++ if (auth == CUPSD_AUTH_DENY && best->satisfy == CUPSD_AUTH_SATISFY_ALL)
+ return (HTTP_FORBIDDEN);
+
+ #ifdef HAVE_SSL
+@@ -1943,9 +1948,9 @@ cupsdIsAuthorized(cupsd_client_t *con, /
+
+ if ((best->encryption >= HTTP_ENCRYPT_REQUIRED && !con->http.tls &&
+ strcasecmp(con->http.hostname, "localhost") &&
+- best->satisfy == AUTH_SATISFY_ALL) &&
+- !(type == AUTH_NEGOTIATE ||
+- (type == AUTH_NONE && DefaultAuthType == AUTH_NEGOTIATE)))
++ best->satisfy == CUPSD_AUTH_SATISFY_ALL) &&
++ !(type == CUPSD_AUTH_NEGOTIATE ||
++ (type == CUPSD_AUTH_NONE && DefaultAuthType == CUPSD_AUTH_NEGOTIATE)))
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "cupsdIsAuthorized: Need upgrade to TLS...");
+@@ -1957,12 +1962,12 @@ cupsdIsAuthorized(cupsd_client_t *con, /
+ * Now see what access level is required...
+ */
+
+- if (best->level == AUTH_ANON || /* Anonymous access - allow it */
+- (type == AUTH_NONE && best->num_names == 0))
++ if (best->level == CUPSD_AUTH_ANON || /* Anonymous access - allow it */
++ (type == CUPSD_AUTH_NONE && best->num_names == 0))
+ return (HTTP_OK);
+
+- if (!con->username[0] && type == AUTH_NONE &&
+- best->limit == AUTH_LIMIT_IPP)
++ if (!con->username[0] && type == CUPSD_AUTH_NONE &&
++ best->limit == CUPSD_AUTH_LIMIT_IPP)
+ {
+ /*
+ * Check for unauthenticated username...
+@@ -1979,7 +1984,7 @@ cupsdIsAuthorized(cupsd_client_t *con, /
+ attr->values[0].string.text);
+ strlcpy(username, attr->values[0].string.text, sizeof(username));
+ }
+- else if (best->satisfy == AUTH_SATISFY_ALL || auth == AUTH_DENY)
++ else if (best->satisfy == CUPSD_AUTH_SATISFY_ALL || auth == CUPSD_AUTH_DENY)
+ return (HTTP_UNAUTHORIZED); /* Non-anonymous needs user/pass */
+ else
+ return (HTTP_OK); /* unless overridden with Satisfy */
+@@ -1995,14 +2000,14 @@ cupsdIsAuthorized(cupsd_client_t *con, /
+ if (!con->username[0])
+ #endif /* HAVE_AUTHORIZATION_H */
+ {
+- if (best->satisfy == AUTH_SATISFY_ALL || auth == AUTH_DENY)
++ if (best->satisfy == CUPSD_AUTH_SATISFY_ALL || auth == CUPSD_AUTH_DENY)
+ return (HTTP_UNAUTHORIZED); /* Non-anonymous needs user/pass */
+ else
+ return (HTTP_OK); /* unless overridden with Satisfy */
+ }
+
+- if (con->type != type && type != AUTH_NONE &&
+- (con->type != AUTH_BASIC || type != AUTH_BASICDIGEST))
++ if (con->type != type && type != CUPSD_AUTH_NONE &&
++ (con->type != CUPSD_AUTH_BASIC || type != CUPSD_AUTH_BASICDIGEST))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Authorized using %s, expected %s!",
+ types[con->type], types[type]);
+@@ -2050,7 +2055,7 @@ cupsdIsAuthorized(cupsd_client_t *con, /
+ else
+ pw = NULL;
+
+- if (best->level == AUTH_USER)
++ if (best->level == CUPSD_AUTH_USER)
+ {
+ /*
+ * If there are no names associated with this location, then
+diff -up cups-1.3.5/scheduler/cert.c.1.3.x cups-1.3.5/scheduler/cert.c
+--- cups-1.3.5/scheduler/cert.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scheduler/cert.c 2008-02-05 15:08:55.000000000 +0000
+@@ -4,7 +4,7 @@
+ * Authentication certificate routines for the Common UNIX
+ * Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -42,7 +42,8 @@
+
+ void
+ cupsdAddCert(int pid, /* I - Process ID */
+- const char *username) /* I - Username */
++ const char *username, /* I - Username */
++ void *ccache) /* I - Kerberos credentials or NULL */
+ {
+ int i; /* Looping var */
+ cupsd_cert_t *cert; /* Current certificate */
+@@ -244,6 +245,16 @@ cupsdAddCert(int pid, /* I - Pro
+ close(fd);
+
+ /*
++ * Add Kerberos credentials as needed...
++ */
++
++#ifdef HAVE_GSSAPI
++ cert->ccache = (krb5_ccache)ccache;
++#else
++ (void)ccache;
++#endif /* HAVE_GSSAPI */
++
++ /*
+ * Insert the certificate at the front of the list...
+ */
+
+@@ -282,6 +293,15 @@ cupsdDeleteCert(int pid) /* I - Process
+ else
+ prev->next = cert->next;
+
++#ifdef HAVE_GSSAPI
++ /*
++ * Release Kerberos credentials as needed...
++ */
++
++ if (cert->ccache)
++ krb5_cc_destroy(KerberosContext, cert->ccache);
++#endif /* HAVE_GSSAPI */
++
+ free(cert);
+
+ /*
+@@ -412,7 +432,7 @@ cupsdInitCerts(void)
+ */
+
+ if (!RunUser)
+- cupsdAddCert(0, "root");
++ cupsdAddCert(0, "root", NULL);
+ }
+
+
+diff -up cups-1.3.5/scheduler/log.c.1.3.x cups-1.3.5/scheduler/log.c
+--- cups-1.3.5/scheduler/log.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scheduler/log.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Log file routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -261,6 +261,9 @@ cupsdLogMessage(int level, /* I -
+
+ if (len >= linesize)
+ {
++ char *temp; /* Temporary string pointer */
++
++
+ len ++;
+
+ if (len < 8192)
+@@ -268,18 +271,12 @@ cupsdLogMessage(int level, /* I -
+ else if (len > 65536)
+ len = 65536;
+
+- line = realloc(line, len);
++ temp = realloc(line, len);
+
+- if (line)
+- linesize = len;
+- else
++ if (temp)
+ {
+- cupsFilePrintf(ErrorFile,
+- "ERROR: Unable to allocate memory for line - %s\n",
+- strerror(errno));
+- cupsFileFlush(ErrorFile);
+-
+- return (0);
++ line = temp;
++ linesize = len;
+ }
+
+ va_start(ap, message);
+diff -up cups-1.3.5/scheduler/cups-deviced.c.1.3.x cups-1.3.5/scheduler/cups-deviced.c
+--- cups-1.3.5/scheduler/cups-deviced.c.1.3.x 2007-10-10 22:25:29.000000000 +0100
++++ cups-1.3.5/scheduler/cups-deviced.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Device scanning mini-daemon for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -291,6 +291,8 @@ main(int argc, /* I - Number of comm
+ if (!dev)
+ {
+ cupsDirClose(dir);
++ fclose(fp);
++ kill(pid, SIGTERM);
+ return (1);
+ }
+
+diff -up cups-1.3.5/scheduler/cups-driverd.c.1.3.x cups-1.3.5/scheduler/cups-driverd.c
+--- cups-1.3.5/scheduler/cups-driverd.c.1.3.x 2007-08-02 19:05:03.000000000 +0100
++++ cups-1.3.5/scheduler/cups-driverd.c 2008-02-05 15:08:55.000000000 +0000
+@@ -7,7 +7,7 @@
+ * in CUPS_DATADIR/model and dynamically generated PPD files using
+ * the driver helper programs in CUPS_SERVERBIN/driver.
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -1664,6 +1664,7 @@ load_drivers(void)
+ if (!ppd)
+ {
+ cupsDirClose(dir);
++ pclose(fp);
+ return (0);
+ }
+
+diff -up cups-1.3.5/scheduler/mime.c.1.3.x cups-1.3.5/scheduler/mime.c
+--- cups-1.3.5/scheduler/mime.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scheduler/mime.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * MIME database file routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -235,7 +235,10 @@ mimeMerge(mime_t *mime, /* I - MIME
+ if (!mime)
+ mime = mimeNew();
+ if (!mime)
++ {
++ cupsDirClose(dir);
+ return (NULL);
++ }
+
+ /*
+ * Read all the .types files...
+diff -up cups-1.3.5/scheduler/job.h.1.3.x cups-1.3.5/scheduler/job.h
+--- cups-1.3.5/scheduler/job.h.1.3.x 2007-08-01 20:02:47.000000000 +0100
++++ cups-1.3.5/scheduler/job.h 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Print job definitions for the Common UNIX Printing System (CUPS) scheduler.
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -122,7 +122,7 @@ extern void cupsdSetJobHoldUntil(cupsd_
+ extern void cupsdSetJobPriority(cupsd_job_t *job, int priority);
+ extern void cupsdStopAllJobs(int force);
+ extern void cupsdStopJob(cupsd_job_t *job, int force);
+-extern void cupsdTimeoutJob(cupsd_job_t *job);
++extern int cupsdTimeoutJob(cupsd_job_t *job);
+ extern void cupsdUnloadCompletedJobs(void);
+
+
+diff -up cups-1.3.5/scheduler/cups-lpd.c.1.3.x cups-1.3.5/scheduler/cups-lpd.c
+--- cups-1.3.5/scheduler/cups-lpd.c.1.3.x 2007-08-08 22:09:31.000000000 +0100
++++ cups-1.3.5/scheduler/cups-lpd.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Line Printer Daemon interface for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -1274,9 +1274,9 @@ recv_print_job(
+ if (status)
+ break;
+ }
+-
+- fclose(fp);
+ }
++
++ fclose(fp);
+ }
+ }
+
+diff -up cups-1.3.5/scheduler/client.c.1.3.x cups-1.3.5/scheduler/client.c
+--- cups-1.3.5/scheduler/client.c.1.3.x 2007-09-28 20:47:00.000000000 +0100
++++ cups-1.3.5/scheduler/client.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Client routines for the Common UNIX Printing System (CUPS) scheduler.
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * This file contains Kerberos support code, copyright 2006 by
+@@ -144,9 +144,19 @@ cupsdAcceptClient(cupsd_listener_t *lis)
+ Clients = cupsArrayNew(NULL, NULL);
+
+ if (!Clients)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "Unable to allocate memory for client array!");
++ cupsdPauseListening();
+ return;
++ }
+
+- con = calloc(1, sizeof(cupsd_client_t));
++ if ((con = calloc(1, sizeof(cupsd_client_t))) == NULL)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to allocate memory for client!");
++ cupsdPauseListening();
++ return;
++ }
+
+ con->http.activity = time(NULL);
+ con->file = -1;
+@@ -843,7 +853,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Bad request line \"%s\" from %s!", line,
+ con->http.hostname);
+- cupsdSendError(con, HTTP_BAD_REQUEST, AUTH_NONE);
++ cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
+ cupsdCloseClient(con);
+ return;
+ case 2 :
+@@ -855,7 +865,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Bad request line \"%s\" from %s!", line,
+ con->http.hostname);
+- cupsdSendError(con, HTTP_BAD_REQUEST, AUTH_NONE);
++ cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
+ cupsdCloseClient(con);
+ return;
+ }
+@@ -870,7 +880,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ }
+ else
+ {
+- cupsdSendError(con, HTTP_NOT_SUPPORTED, AUTH_NONE);
++ cupsdSendError(con, HTTP_NOT_SUPPORTED, CUPSD_AUTH_NONE);
+ cupsdCloseClient(con);
+ return;
+ }
+@@ -916,7 +926,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Bad URI \"%s\" in request!",
+ con->uri);
+- cupsdSendError(con, HTTP_METHOD_NOT_ALLOWED, AUTH_NONE);
++ cupsdSendError(con, HTTP_METHOD_NOT_ALLOWED, CUPSD_AUTH_NONE);
+ cupsdCloseClient(con);
+ return;
+ }
+@@ -950,7 +960,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Bad operation \"%s\"!", operation);
+- cupsdSendError(con, HTTP_BAD_REQUEST, AUTH_NONE);
++ cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
+ cupsdCloseClient(con);
+ return;
+ }
+@@ -982,7 +992,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+
+ if (status != HTTP_OK && status != HTTP_CONTINUE)
+ {
+- cupsdSendError(con, HTTP_BAD_REQUEST, AUTH_NONE);
++ cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
+ cupsdCloseClient(con);
+ return;
+ }
+@@ -1050,7 +1060,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * HTTP/1.1 and higher require the "Host:" field...
+ */
+
+- if (!cupsdSendError(con, HTTP_BAD_REQUEST, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1062,9 +1072,9 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * Do OPTIONS command...
+ */
+
+- if (con->best && con->best->type != AUTH_NONE)
++ if (con->best && con->best->type != CUPSD_AUTH_NONE)
+ {
+- if (!cupsdSendHeader(con, HTTP_UNAUTHORIZED, NULL, AUTH_NONE))
++ if (!cupsdSendHeader(con, HTTP_UNAUTHORIZED, NULL, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1079,7 +1089,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * Do encryption stuff...
+ */
+
+- if (!cupsdSendHeader(con, HTTP_SWITCHING_PROTOCOLS, NULL, AUTH_NONE))
++ if (!cupsdSendHeader(con, HTTP_SWITCHING_PROTOCOLS, NULL, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1102,7 +1112,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ return;
+ }
+ #else
+- if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1110,7 +1120,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ #endif /* HAVE_SSL */
+ }
+
+- if (!cupsdSendHeader(con, HTTP_OK, NULL, AUTH_NONE))
++ if (!cupsdSendHeader(con, HTTP_OK, NULL, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1132,7 +1142,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * Protect against malicious users!
+ */
+
+- if (!cupsdSendError(con, HTTP_FORBIDDEN, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1148,7 +1158,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * Do encryption stuff...
+ */
+
+- if (!cupsdSendHeader(con, HTTP_SWITCHING_PROTOCOLS, NULL, AUTH_NONE))
++ if (!cupsdSendHeader(con, HTTP_SWITCHING_PROTOCOLS, NULL, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1171,7 +1181,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ return;
+ }
+ #else
+- if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1184,7 +1194,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "cupsdReadClient: Unauthorized request for %s...\n",
+ con->uri);
+- cupsdSendError(con, status, AUTH_NONE);
++ cupsdSendError(con, status, CUPSD_AUTH_NONE);
+ cupsdCloseClient(con);
+ return;
+ }
+@@ -1198,7 +1208,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * Send 100-continue header...
+ */
+
+- if (!cupsdSendHeader(con, HTTP_CONTINUE, NULL, AUTH_NONE))
++ if (!cupsdSendHeader(con, HTTP_CONTINUE, NULL, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1210,7 +1220,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * Send 417-expectation-failed header...
+ */
+
+- if (!cupsdSendHeader(con, HTTP_EXPECTATION_FAILED, NULL, AUTH_NONE))
++ if (!cupsdSendHeader(con, HTTP_EXPECTATION_FAILED, NULL, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1244,7 +1254,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ snprintf(con->uri, sizeof(con->uri), "/ppd/%s.ppd", p->name);
+ else
+ {
+- if (!cupsdSendError(con, HTTP_NOT_FOUND, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1316,7 +1326,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+
+ if (!cupsdSendCommand(con, con->command, con->options, 0))
+ {
+- if (!cupsdSendError(con, HTTP_NOT_FOUND, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1340,7 +1350,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * /admin/conf...
+ */
+
+- if (!cupsdSendError(con, HTTP_FORBIDDEN, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1357,7 +1367,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ if ((filename = get_file(con, &filestats, buf,
+ sizeof(buf))) == NULL)
+ {
+- if (!cupsdSendError(con, HTTP_NOT_FOUND, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1377,7 +1387,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+
+ if (!cupsdSendCommand(con, con->command, con->options, 0))
+ {
+- if (!cupsdSendError(con, HTTP_NOT_FOUND, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1393,7 +1403,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+
+ if (!check_if_modified(con, &filestats))
+ {
+- if (!cupsdSendError(con, HTTP_NOT_MODIFIED, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_NOT_MODIFIED, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1433,7 +1443,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * Request too large...
+ */
+
+- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1447,7 +1457,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * Negative content lengths are invalid!
+ */
+
+- if (!cupsdSendError(con, HTTP_BAD_REQUEST, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1542,7 +1552,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ if ((filename = get_file(con, &filestats, buf,
+ sizeof(buf))) == NULL)
+ {
+- if (!cupsdSendError(con, HTTP_NOT_FOUND, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1559,7 +1569,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * Only POST to CGI's...
+ */
+
+- if (!cupsdSendError(con, HTTP_UNAUTHORIZED, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_UNAUTHORIZED, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1582,7 +1592,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * /admin/conf...
+ */
+
+- if (!cupsdSendError(con, HTTP_FORBIDDEN, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1608,7 +1618,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * Request too large...
+ */
+
+- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1622,7 +1632,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * Negative content lengths are invalid!
+ */
+
+- if (!cupsdSendError(con, HTTP_BAD_REQUEST, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1639,19 +1649,23 @@ cupsdReadClient(cupsd_client_t *con) /*
+ request_id ++);
+ con->file = open(con->filename, O_WRONLY | O_CREAT | O_TRUNC, 0640);
+
+- cupsdLogMessage(CUPSD_LOG_DEBUG2,
+- "cupsdReadClient: %d REQUEST %s=%d", con->http.fd,
+- con->filename, con->file);
+-
+ if (con->file < 0)
+ {
+- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, AUTH_NONE))
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "Unable to create request file %s: %s",
++ con->filename, strerror(errno));
++
++ if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+ }
+ }
+
++ cupsdLogMessage(CUPSD_LOG_DEBUG2,
++ "cupsdReadClient: %d REQUEST %s=%d", con->http.fd,
++ con->filename, con->file);
++
+ fchmod(con->file, 0640);
+ fchown(con->file, RunUser, Group);
+ fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC);
+@@ -1659,7 +1673,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+
+ case HTTP_DELETE :
+ case HTTP_TRACE :
+- cupsdSendError(con, HTTP_NOT_IMPLEMENTED, AUTH_NONE);
++ cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE);
+ cupsdCloseClient(con);
+ return;
+
+@@ -1678,7 +1692,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ snprintf(con->uri, sizeof(con->uri), "/ppd/%s.ppd", p->name);
+ else
+ {
+- if (!cupsdSendError(con, HTTP_NOT_FOUND, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1700,7 +1714,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * CGI output...
+ */
+
+- if (!cupsdSendHeader(con, HTTP_OK, "text/html", AUTH_NONE))
++ if (!cupsdSendHeader(con, HTTP_OK, "text/html", CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1732,7 +1746,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * /admin/conf...
+ */
+
+- if (!cupsdSendError(con, HTTP_FORBIDDEN, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1743,7 +1757,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ else if ((filename = get_file(con, &filestats, buf,
+ sizeof(buf))) == NULL)
+ {
+- if (!cupsdSendHeader(con, HTTP_NOT_FOUND, "text/html", AUTH_NONE))
++ if (!cupsdSendHeader(con, HTTP_NOT_FOUND, "text/html", CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1753,7 +1767,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ }
+ else if (!check_if_modified(con, &filestats))
+ {
+- if (!cupsdSendError(con, HTTP_NOT_MODIFIED, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_NOT_MODIFIED, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1773,7 +1787,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ else
+ snprintf(line, sizeof(line), "%s/%s", type->super, type->type);
+
+- if (!cupsdSendHeader(con, HTTP_OK, line, AUTH_NONE))
++ if (!cupsdSendHeader(con, HTTP_OK, line, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1862,7 +1876,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ unlink(con->filename);
+ cupsdClearString(&con->filename);
+
+- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1902,7 +1916,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ unlink(con->filename);
+ cupsdClearString(&con->filename);
+
+- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1919,7 +1933,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ * Return the status to the client...
+ */
+
+- if (!cupsdSendError(con, status, AUTH_NONE))
++ if (!cupsdSendError(con, status, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -1950,7 +1964,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ "cupsdReadClient: %d IPP Read Error!",
+ con->http.fd);
+
+- cupsdSendError(con, HTTP_BAD_REQUEST, AUTH_NONE);
++ cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
+ cupsdCloseClient(con);
+ return;
+ }
+@@ -1958,7 +1972,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ {
+ if (con->http.state == HTTP_POST_SEND)
+ {
+- cupsdSendError(con, HTTP_BAD_REQUEST, AUTH_NONE);
++ cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
+ cupsdCloseClient(con);
+ return;
+ }
+@@ -1978,18 +1992,22 @@ cupsdReadClient(cupsd_client_t *con) /*
+ cupsdSetStringf(&con->filename, "%s/%08x", RequestRoot, request_id ++);
+ con->file = open(con->filename, O_WRONLY | O_CREAT | O_TRUNC, 0640);
+
+- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadClient: %d REQUEST %s=%d", con->http.fd,
+- con->filename, con->file);
+-
+ if (con->file < 0)
+ {
+- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, AUTH_NONE))
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "Unable to create request file %s: %s",
++ con->filename, strerror(errno));
++
++ if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+ }
+ }
+
++ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadClient: %d REQUEST %s=%d", con->http.fd,
++ con->filename, con->file);
++
+ fchmod(con->file, 0640);
+ fchown(con->file, RunUser, Group);
+ fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC);
+@@ -2025,7 +2043,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ unlink(con->filename);
+ cupsdClearString(&con->filename);
+
+- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -2081,7 +2099,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ con->request = NULL;
+ }
+
+- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -2092,7 +2110,7 @@ cupsdReadClient(cupsd_client_t *con) /*
+ {
+ if (!cupsdSendCommand(con, con->command, con->options, 0))
+ {
+- if (!cupsdSendError(con, HTTP_NOT_FOUND, AUTH_NONE))
++ if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+@@ -2232,7 +2250,7 @@ cupsdSendError(cupsd_client_t *con, /* I
+ * never disable it in that case.
+ */
+
+- if (code >= HTTP_BAD_REQUEST && con->http.auth_type != AUTH_NEGOTIATE)
++ if (code >= HTTP_BAD_REQUEST && con->http.auth_type != CUPSD_AUTH_NEGOTIATE)
+ con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+
+ /*
+@@ -2351,7 +2369,11 @@ cupsdSendHeader(
+ char *type, /* I - MIME type of document */
+ int auth_type) /* I - Type of authentication */
+ {
+- char auth_str[1024]; /* Authorization string */
++ char auth_str[1024]; /* Authorization string */
++#ifdef HAVE_GSSAPI
++ static char *gss_buf = NULL; /* Kerberos auth data buffer */
++ static int gss_bufsize = 0; /* Size of Kerberos auth data buffer */
++#endif /* HAVE_GSSAPI */
+
+
+ /*
+@@ -2394,9 +2416,9 @@ cupsdSendHeader(
+
+ if (code == HTTP_UNAUTHORIZED)
+ {
+- if (auth_type == AUTH_NONE)
++ if (auth_type == CUPSD_AUTH_NONE)
+ {
+- if (!con->best || con->best->type <= AUTH_NONE)
++ if (!con->best || con->best->type <= CUPSD_AUTH_NONE)
+ auth_type = DefaultAuthType;
+ else
+ auth_type = con->best->type;
+@@ -2404,18 +2426,18 @@ cupsdSendHeader(
+
+ auth_str[0] = '\0';
+
+- if (auth_type == AUTH_BASIC || auth_type == AUTH_BASICDIGEST)
++ if (auth_type == CUPSD_AUTH_BASIC || auth_type == CUPSD_AUTH_BASICDIGEST)
+ strlcpy(auth_str, "Basic realm=\"CUPS\"", sizeof(auth_str));
+- else if (auth_type == AUTH_DIGEST)
++ else if (auth_type == CUPSD_AUTH_DIGEST)
+ snprintf(auth_str, sizeof(auth_str), "Digest realm=\"CUPS\", nonce=\"%s\"",
+ con->http.hostname);
+ #ifdef HAVE_GSSAPI
+- else if (auth_type == AUTH_NEGOTIATE && con->gss_output_token.length == 0)
++ else if (auth_type == CUPSD_AUTH_NEGOTIATE && con->gss_output_token.length == 0)
+ strlcpy(auth_str, "Negotiate", sizeof(auth_str));
+ #endif /* HAVE_GSSAPI */
+
+ #ifdef HAVE_AUTHORIZATION_H
+- if (con->best && auth_type != AUTH_NEGOTIATE)
++ if (con->best && auth_type != CUPSD_AUTH_NEGOTIATE)
+ {
+ int i; /* Looping var */
+ char *auth_key; /* Auth key buffer */
+@@ -2460,23 +2482,57 @@ cupsdSendHeader(
+ * non-401 replies...
+ */
+
+- if (con->gss_output_token.length > 0)
++ if (con->gss_output_token.length > 0 && con->gss_output_token.length <= 65536)
+ {
+- char buf[2048]; /* Output token buffer */
+ OM_uint32 minor_status; /* Minor status code */
++ int bufsize; /* Size of output token buffer */
++
++
++ bufsize = con->gss_output_token.length * 4 / 3 + 2;
++
++ if (bufsize > gss_bufsize)
++ {
++ char *buf; /* New buffer */
++
++
++ bufsize = (bufsize + 1023) & 1023;/* Round up */
++
++ if (gss_buf)
++ buf = realloc(gss_buf, bufsize);
++ else
++ buf = malloc(bufsize);
+
++ if (!buf)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "Unable to allocate %d bytes for Kerberos credentials!",
++ bufsize);
++ return (0);
++ }
+
+- httpEncode64_2(buf, sizeof(buf),
+- con->gss_output_token.value,
++ gss_buf = buf;
++ gss_bufsize = bufsize;
++ }
++
++ httpEncode64_2(gss_buf, gss_bufsize,
++ con->gss_output_token.value,
+ con->gss_output_token.length);
+ gss_release_buffer(&minor_status, &con->gss_output_token);
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+- "cupsdSendHeader: WWW-Authenticate: Negotiate %s", buf);
++ "cupsdSendHeader: WWW-Authenticate: Negotiate %s", gss_buf);
+
+- if (httpPrintf(HTTP(con), "WWW-Authenticate: Negotiate %s\r\n", buf) < 0)
++ if (httpPrintf(HTTP(con), "WWW-Authenticate: Negotiate %s\r\n",
++ gss_buf) < 0)
+ return (0);
+ }
++ else if (con->gss_output_token.length > 65536)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "Kerberos credentials larger than 64k (%d)!",
++ con->gss_output_token.length);
++ return (0);
++ }
+ #endif /* HAVE_GSSAPI */
+
+ if (con->language && strcmp(con->language->language, "C"))
+@@ -2619,7 +2675,7 @@ cupsdWriteClient(cupsd_client_t *con) /*
+
+ if (!strncasecmp(buf, "Location:", 9))
+ {
+- cupsdSendHeader(con, HTTP_SEE_OTHER, NULL, AUTH_NONE);
++ cupsdSendHeader(con, HTTP_SEE_OTHER, NULL, CUPSD_AUTH_NONE);
+ con->sent_header = 2;
+
+ if (httpPrintf(HTTP(con), "Content-Length: 0\r\n") < 0)
+@@ -2627,12 +2683,12 @@ cupsdWriteClient(cupsd_client_t *con) /*
+ }
+ else if (!strncasecmp(buf, "Status:", 7))
+ {
+- cupsdSendError(con, (http_status_t)atoi(buf + 7), AUTH_NONE);
++ cupsdSendError(con, (http_status_t)atoi(buf + 7), CUPSD_AUTH_NONE);
+ con->sent_header = 2;
+ }
+ else
+ {
+- cupsdSendHeader(con, HTTP_OK, NULL, AUTH_NONE);
++ cupsdSendHeader(con, HTTP_OK, NULL, CUPSD_AUTH_NONE);
+ con->sent_header = 1;
+
+ if (con->http.version == HTTP_1_1)
+@@ -4220,7 +4276,7 @@ pipe_command(cupsd_client_t *con, /* I -
+ char argbuf[10240], /* Argument buffer */
+ *argv[100], /* Argument strings */
+ *envp[MAX_ENV + 20]; /* Environment variables */
+- char auth_type[256], /* AUTH_TYPE environment variable */
++ char auth_type[256], /* CUPSD_AUTH_TYPE environment variable */
+ content_length[1024], /* CONTENT_LENGTH environment variable */
+ content_type[1024], /* CONTENT_TYPE environment variable */
+ http_cookie[32768], /* HTTP_COOKIE environment variable */
+@@ -4236,6 +4292,10 @@ pipe_command(cupsd_client_t *con, /* I -
+ server_name[1024], /* SERVER_NAME environment variable */
+ server_port[1024]; /* SERVER_PORT environment variable */
+ ipp_attribute_t *attr; /* attributes-natural-language attribute */
++#ifdef HAVE_GSSAPI
++ krb5_ccache ccache = NULL; /* Kerberos credentials */
++ char krb5ccname[1024]; /* KRB5CCNAME environment variable */
++#endif /* HAVE_GSSAPI */
+
+
+ /*
+@@ -4362,7 +4422,7 @@ pipe_command(cupsd_client_t *con, /* I -
+
+ if (con->username[0])
+ {
+- snprintf(auth_type, sizeof(auth_type), "AUTH_TYPE=%s",
++ snprintf(auth_type, sizeof(auth_type), "CUPSD_AUTH_TYPE=%s",
+ httpGetField(HTTP(con), HTTP_FIELD_AUTHORIZATION));
+
+ if ((uriptr = strchr(auth_type + 10, ' ')) != NULL)
+@@ -4455,6 +4515,120 @@ pipe_command(cupsd_client_t *con, /* I -
+ snprintf(remote_user, sizeof(remote_user), "REMOTE_USER=%s", con->username);
+
+ envp[envc ++] = remote_user;
++
++ /*
++ * Save Kerberos credentials, if any...
++ */
++
++#ifdef HAVE_GSSAPI
++ if (con->gss_have_creds)
++ {
++# if !defined(HAVE_KRB5_CC_NEW_UNIQUE) && !defined(HAVE_HEIMDAL)
++ cupsdLogMessage(CUPSD_LOG_INFO,
++ "Sorry, your version of Kerberos does not support "
++ "delegated credentials!");
++
++# else
++ krb5_error_code error; /* Kerberos error code */
++ OM_uint32 major_status, /* Major status code */
++ minor_status; /* Minor status code */
++ krb5_principal principal; /* Kerberos principal */
++
++
++# ifdef __APPLE__
++ /*
++ * If the weak-linked GSSAPI/Kerberos library is not present, don't try
++ * to use it...
++ */
++
++ if (krb5_init_context != NULL)
++ {
++# endif /* __APPLE__ */
++
++ /*
++ * We MUST create a file-based cache because memory-based caches are
++ * only valid for the current process/address space.
++ *
++ * Due to various bugs/features in different versions of Kerberos, we
++ * need either the krb5_cc_new_unique() function or Heimdal's version
++ * of krb5_cc_gen_new() to create a new FILE: credential cache that
++ * can be passed to the backend. These functions create a temporary
++ * file (typically in /tmp) containing the cached credentials, which
++ * are removed when we have successfully printed a job.
++ */
++
++# ifdef HAVE_KRB5_CC_NEW_UNIQUE
++ if ((error = krb5_cc_new_unique(KerberosContext, "FILE", NULL,
++ &ccache)) != 0)
++# else /* HAVE_HEIMDAL */
++ if ((error = krb5_cc_gen_new(KerberosContext, &krb5_fcc_ops,
++ &ccache)) != 0)
++# endif /* HAVE_KRB5_CC_NEW_UNIQUE */
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "Unable to create new credentials cache (%d/%s)",
++ error, strerror(errno));
++ ccache = NULL;
++ }
++ else if ((error = krb5_parse_name(KerberosContext, con->username,
++ &principal)) != 0)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "Unable to parse kerberos username (%d/%s)", error,
++ strerror(errno));
++ krb5_cc_destroy(KerberosContext, ccache);
++ ccache = NULL;
++ }
++ else if ((error = krb5_cc_initialize(KerberosContext, ccache,
++ principal)))
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "Unable to initialize credentials cache (%d/%s)", error,
++ strerror(errno));
++ krb5_cc_destroy(KerberosContext, ccache);
++ krb5_free_principal(KerberosContext, principal);
++ ccache = NULL;
++ }
++ else
++ {
++ krb5_free_principal(KerberosContext, principal);
++
++ /*
++ * Copy the user's credentials to the new cache file...
++ */
++
++ major_status = gss_krb5_copy_ccache(&minor_status,
++ con->gss_delegated_cred, ccache);
++
++ if (GSS_ERROR(major_status))
++ {
++ cupsdLogGSSMessage(CUPSD_LOG_ERROR, major_status, minor_status,
++ "Unable to import client credentials cache");
++ krb5_cc_destroy(KerberosContext, ccache);
++ ccache = NULL;
++ }
++ else
++ {
++ /*
++ * Add the KRB5CCNAME environment variable to the job so that the
++ * backend can use the credentials when printing.
++ */
++
++ snprintf(krb5ccname, sizeof(krb5ccname), "KRB5CCNAME=FILE:%s",
++ krb5_cc_get_name(KerberosContext, ccache));
++ envp[envc++] = krb5ccname;
++
++ if (!RunUser)
++ chown(krb5_cc_get_name(KerberosContext, ccache), User, Group);
++ }
++ }
++# ifdef __APPLE__
++ }
++# endif /* __APPLE__ */
++# endif /* HAVE_KRB5_CC_NEW_UNIQUE || HAVE_HEIMDAL */
++ }
++#endif /* HAVE_GSSAPI */
++
+ }
+
+ if (con->http.version == HTTP_1_1)
+@@ -4568,7 +4742,11 @@ pipe_command(cupsd_client_t *con, /* I -
+ */
+
+ if (con->username[0])
+- cupsdAddCert(pid, con->username);
++#ifdef HAVE_GSSAPI
++ cupsdAddCert(pid, con->username, ccache);
++#else
++ cupsdAddCert(pid, con->username, NULL);
++#endif /* HAVE_GSSAPI */
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "[CGI] %s started - PID = %d",
+ command, pid);
+@@ -4604,7 +4782,7 @@ write_file(cupsd_client_t *con, /* I -
+
+ con->pipe_pid = 0;
+
+- if (!cupsdSendHeader(con, code, type, AUTH_NONE))
++ if (!cupsdSendHeader(con, code, type, CUPSD_AUTH_NONE))
+ return (0);
+
+ if (httpPrintf(HTTP(con), "Last-Modified: %s\r\n",
+diff -up cups-1.3.5/scheduler/cups-polld.c.1.3.x cups-1.3.5/scheduler/cups-polld.c
+--- cups-1.3.5/scheduler/cups-polld.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scheduler/cups-polld.c 2008-02-05 15:08:55.000000000 +0000
+@@ -144,7 +144,7 @@ main(int argc, /* I - Number of comm
+ * Loop forever, asking for available printers and classes...
+ */
+
+- for (http = NULL;;)
++ for (http = NULL; !ferror(stderr);)
+ {
+ /*
+ * Open a connection to the server...
+@@ -180,6 +180,8 @@ main(int argc, /* I - Number of comm
+ if (remain > 0 && !restart_polling)
+ sleep(remain);
+ }
++
++ return (1);
+ }
+
+
+diff -up cups-1.3.5/scheduler/classes.c.1.3.x cups-1.3.5/scheduler/classes.c
+--- cups-1.3.5/scheduler/classes.c.1.3.x 2007-11-30 03:37:11.000000000 +0000
++++ cups-1.3.5/scheduler/classes.c 2008-02-05 15:08:55.000000000 +0000
+@@ -393,7 +393,7 @@ cupsdLoadAllClasses(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, ""))
+@@ -407,14 +407,14 @@ cupsdLoadAllClasses(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!p)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+- return;
++ break;
+ }
+ else if (!strcasecmp(line, "AuthInfoRequired"))
+ {
+@@ -458,7 +458,7 @@ cupsdLoadAllClasses(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+- return;
++ break;
+ }
+ else if ((temp = cupsdFindPrinter(value)) == NULL)
+ {
+@@ -504,7 +504,7 @@ cupsdLoadAllClasses(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "StateMessage"))
+@@ -546,7 +546,7 @@ cupsdLoadAllClasses(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "Shared"))
+@@ -568,9 +568,9 @@ cupsdLoadAllClasses(void)
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+- "Syntax error on line %d of printers.conf.",
++ "Syntax error on line %d of classes.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "JobSheets"))
+@@ -609,7 +609,7 @@ cupsdLoadAllClasses(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "AllowUser"))
+@@ -623,7 +623,7 @@ cupsdLoadAllClasses(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "DenyUser"))
+@@ -637,7 +637,7 @@ cupsdLoadAllClasses(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "QuotaPeriod"))
+@@ -648,7 +648,7 @@ cupsdLoadAllClasses(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "PageLimit"))
+@@ -659,7 +659,7 @@ cupsdLoadAllClasses(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "KLimit"))
+@@ -670,7 +670,7 @@ cupsdLoadAllClasses(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "OpPolicy"))
+@@ -694,7 +694,7 @@ cupsdLoadAllClasses(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "ErrorPolicy"))
+@@ -705,7 +705,7 @@ cupsdLoadAllClasses(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else
+diff -up cups-1.3.5/scheduler/cert.h.1.3.x cups-1.3.5/scheduler/cert.h
+--- cups-1.3.5/scheduler/cert.h.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scheduler/cert.h 2008-02-05 15:08:55.000000000 +0000
+@@ -4,7 +4,7 @@
+ * Authentication certificate definitions for the Common UNIX
+ * Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -24,6 +24,9 @@ typedef struct cupsd_cert_s
+ int pid; /* Process ID (0 for root certificate) */
+ char certificate[33]; /* 32 hex characters, or 128 bits */
+ char username[33]; /* Authenticated username */
++#ifdef HAVE_GSSAPI
++ krb5_ccache ccache; /* Kerberos credential cache */
++#endif /* HAVE_GSSAPI */
+ } cupsd_cert_t;
+
+
+@@ -39,7 +42,8 @@ VAR time_t RootCertTime; /* Root certif
+ * Prototypes...
+ */
+
+-extern void cupsdAddCert(int pid, const char *username);
++extern void cupsdAddCert(int pid, const char *username,
++ void *ccache);
+ extern void cupsdDeleteCert(int pid);
+ extern void cupsdDeleteAllCerts(void);
+ extern const char *cupsdFindCert(const char *certificate);
+diff -up cups-1.3.5/scheduler/policy.c.1.3.x cups-1.3.5/scheduler/policy.c
+--- cups-1.3.5/scheduler/policy.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scheduler/policy.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Policy routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -105,7 +105,7 @@ cupsdAddPolicyOp(cupsd_policy_t *p, /*
+ p->num_ops ++;
+
+ temp->op = op;
+- temp->limit = AUTH_LIMIT_IPP;
++ temp->limit = CUPSD_AUTH_LIMIT_IPP;
+
+ if (po)
+ {
+@@ -125,12 +125,12 @@ cupsdAddPolicyOp(cupsd_policy_t *p, /*
+ for (i = 0; i < po->num_allow; i ++)
+ switch (po->allow[i].type)
+ {
+- case AUTH_IP :
++ case CUPSD_AUTH_IP :
+ cupsdAllowIP(temp, po->allow[i].mask.ip.address,
+ po->allow[i].mask.ip.netmask);
+ break;
+
+- case AUTH_INTERFACE :
++ case CUPSD_AUTH_INTERFACE :
+ snprintf(name, sizeof(name), "@IF(%s)",
+ po->allow[i].mask.name.name);
+ cupsdAllowHost(temp, name);
+@@ -144,12 +144,12 @@ cupsdAddPolicyOp(cupsd_policy_t *p, /*
+ for (i = 0; i < po->num_deny; i ++)
+ switch (po->deny[i].type)
+ {
+- case AUTH_IP :
++ case CUPSD_AUTH_IP :
+ cupsdDenyIP(temp, po->deny[i].mask.ip.address,
+ po->deny[i].mask.ip.netmask);
+ break;
+
+- case AUTH_INTERFACE :
++ case CUPSD_AUTH_INTERFACE :
+ snprintf(name, sizeof(name), "@IF(%s)",
+ po->deny[i].mask.name.name);
+ cupsdDenyHost(temp, name);
+diff -up cups-1.3.5/scheduler/auth.h.1.3.x cups-1.3.5/scheduler/auth.h
+--- cups-1.3.5/scheduler/auth.h.1.3.x 2007-08-08 21:50:42.000000000 +0100
++++ cups-1.3.5/scheduler/auth.h 2008-02-05 15:08:55.000000000 +0000
+@@ -4,7 +4,7 @@
+ * Authorization definitions for the Common UNIX Printing System (CUPS)
+ * scheduler.
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -25,36 +25,36 @@
+ * HTTP authorization types and levels...
+ */
+
+-#define AUTH_DEFAULT -1 /* Use DefaultAuthType */
+-#define AUTH_NONE 0 /* No authentication */
+-#define AUTH_BASIC 1 /* Basic authentication */
+-#define AUTH_DIGEST 2 /* Digest authentication */
+-#define AUTH_BASICDIGEST 3 /* Basic authentication w/passwd.md5 */
+-#define AUTH_NEGOTIATE 4 /* Kerberos authentication */
+-
+-#define AUTH_ANON 0 /* Anonymous access */
+-#define AUTH_USER 1 /* Must have a valid username/password */
+-#define AUTH_GROUP 2 /* Must also be in a named group */
+-
+-#define AUTH_ALLOW 0 /* Allow access */
+-#define AUTH_DENY 1 /* Deny access */
+-
+-#define AUTH_NAME 0 /* Authorize host by name */
+-#define AUTH_IP 1 /* Authorize host by IP */
+-#define AUTH_INTERFACE 2 /* Authorize host by interface */
+-
+-#define AUTH_SATISFY_ALL 0 /* Satisfy both address and auth */
+-#define AUTH_SATISFY_ANY 1 /* Satisfy either address or auth */
+-
+-#define AUTH_LIMIT_DELETE 1 /* Limit DELETE requests */
+-#define AUTH_LIMIT_GET 2 /* Limit GET requests */
+-#define AUTH_LIMIT_HEAD 4 /* Limit HEAD requests */
+-#define AUTH_LIMIT_OPTIONS 8 /* Limit OPTIONS requests */
+-#define AUTH_LIMIT_POST 16 /* Limit POST requests */
+-#define AUTH_LIMIT_PUT 32 /* Limit PUT requests */
+-#define AUTH_LIMIT_TRACE 64 /* Limit TRACE requests */
+-#define AUTH_LIMIT_ALL 127 /* Limit all requests */
+-#define AUTH_LIMIT_IPP 128 /* Limit IPP requests */
++#define CUPSD_AUTH_DEFAULT -1 /* Use DefaultAuthType */
++#define CUPSD_AUTH_NONE 0 /* No authentication */
++#define CUPSD_AUTH_BASIC 1 /* Basic authentication */
++#define CUPSD_AUTH_DIGEST 2 /* Digest authentication */
++#define CUPSD_AUTH_BASICDIGEST 3 /* Basic authentication w/passwd.md5 */
++#define CUPSD_AUTH_NEGOTIATE 4 /* Kerberos authentication */
++
++#define CUPSD_AUTH_ANON 0 /* Anonymous access */
++#define CUPSD_AUTH_USER 1 /* Must have a valid username/password */
++#define CUPSD_AUTH_GROUP 2 /* Must also be in a named group */
++
++#define CUPSD_AUTH_ALLOW 0 /* Allow access */
++#define CUPSD_AUTH_DENY 1 /* Deny access */
++
++#define CUPSD_AUTH_NAME 0 /* Authorize host by name */
++#define CUPSD_AUTH_IP 1 /* Authorize host by IP */
++#define CUPSD_AUTH_INTERFACE 2 /* Authorize host by interface */
++
++#define CUPSD_AUTH_SATISFY_ALL 0 /* Satisfy both address and auth */
++#define CUPSD_AUTH_SATISFY_ANY 1 /* Satisfy either address or auth */
++
++#define CUPSD_AUTH_LIMIT_DELETE 1 /* Limit DELETE requests */
++#define CUPSD_AUTH_LIMIT_GET 2 /* Limit GET requests */
++#define CUPSD_AUTH_LIMIT_HEAD 4 /* Limit HEAD requests */
++#define CUPSD_AUTH_LIMIT_OPTIONS 8 /* Limit OPTIONS requests */
++#define CUPSD_AUTH_LIMIT_POST 16 /* Limit POST requests */
++#define CUPSD_AUTH_LIMIT_PUT 32 /* Limit PUT requests */
++#define CUPSD_AUTH_LIMIT_TRACE 64 /* Limit TRACE requests */
++#define CUPSD_AUTH_LIMIT_ALL 127 /* Limit all requests */
++#define CUPSD_AUTH_LIMIT_IPP 128 /* Limit IPP requests */
+
+ #define IPP_ANY_OPERATION (ipp_op_t)0
+ /* Any IPP operation */
+@@ -116,7 +116,7 @@ typedef struct cupsd_client_s cupsd_clie
+
+ VAR cups_array_t *Locations VALUE(NULL);
+ /* Authorization locations */
+-VAR int DefaultAuthType VALUE(AUTH_BASIC);
++VAR int DefaultAuthType VALUE(CUPSD_AUTH_BASIC);
+ /* Default AuthType, if not specified */
+ #ifdef HAVE_SSL
+ VAR http_encryption_t DefaultEncryption VALUE(HTTP_ENCRYPT_REQUIRED);
+diff -up cups-1.3.5/scheduler/subscriptions.h.1.3.x cups-1.3.5/scheduler/subscriptions.h
+--- cups-1.3.5/scheduler/subscriptions.h.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scheduler/subscriptions.h 2008-02-05 15:08:55.000000000 +0000
+@@ -20,47 +20,52 @@
+ typedef enum
+ {
+ /* Individual printer events... */
+- CUPSD_EVENT_PRINTER_RESTARTED = 0x0001,
++ CUPSD_EVENT_PRINTER_STATE = 0x0001, /* Sent after generic printer state change */
++ CUPSD_EVENT_PRINTER_RESTARTED = 0x0002,
+ /* Sent after printer restarted */
+- CUPSD_EVENT_PRINTER_SHUTDOWN = 0x0002,/* Sent after printer shutdown */
+- CUPSD_EVENT_PRINTER_STOPPED = 0x0004, /* Sent after printer stopped */
+- CUPSD_EVENT_PRINTER_FINISHINGS_CHANGED = 0x0008,
++ CUPSD_EVENT_PRINTER_SHUTDOWN = 0x0004,/* Sent after printer shutdown */
++ CUPSD_EVENT_PRINTER_STOPPED = 0x0008, /* Sent after printer stopped */
++
++ CUPSD_EVENT_PRINTER_CONFIG = 0x0010, /* Send after add/modify changes attrs */
++ CUPSD_EVENT_PRINTER_FINISHINGS_CHANGED = 0x0020,
+ /* Sent after finishings-supported changed */
+- CUPSD_EVENT_PRINTER_MEDIA_CHANGED = 0x0010,
++ CUPSD_EVENT_PRINTER_MEDIA_CHANGED = 0x0040,
+ /* Sent after media-supported changed */
+- CUPSD_EVENT_PRINTER_ADDED = 0x0020, /* Sent after printer added */
+- CUPSD_EVENT_PRINTER_DELETED = 0x0040, /* Sent after printer deleted */
+- CUPSD_EVENT_PRINTER_MODIFIED = 0x0080,/* Sent after printer modified */
++ CUPSD_EVENT_PRINTER_ADDED = 0x0080, /* Sent after printer added */
++ CUPSD_EVENT_PRINTER_DELETED = 0x0100, /* Sent after printer deleted */
++ CUPSD_EVENT_PRINTER_MODIFIED = 0x0200,/* Sent after printer modified */
++ CUPSD_EVENT_PRINTER_QUEUE_ORDER_CHANGED = 0x0400,
++ /* Sent when the order of jobs is changed */
+
+ /* Convenience printer event groupings... */
+- CUPSD_EVENT_PRINTER_STATE_CHANGED = 0x0007,
+- /* RESTARTED + SHUTDOWN + STOPPED */
+- CUPSD_EVENT_PRINTER_CONFIG_CHANGED = 0x0018,
+- /* FINISHINGS_CHANGED + MEDIA_CHANGED */
+- CUPSD_EVENT_PRINTER_CHANGED = 0x00ff, /* All of the above */
++ CUPSD_EVENT_PRINTER_STATE_CHANGED = 0x000f,
++ /* STATE + RESTARTED + SHUTDOWN + STOPPED */
++ CUPSD_EVENT_PRINTER_CONFIG_CHANGED = 0x0070,
++ /* CONFIG + FINISHINGS_CHANGED + MEDIA_CHANGED */
++ CUPSD_EVENT_PRINTER_CHANGED = 0x07ff, /* All of the above */
+
+ /* Individual job events... */
+- CUPSD_EVENT_JOB_STATE = 0x0100, /* Any state change */
+- CUPSD_EVENT_JOB_CREATED = 0x0200, /* Send after job is created */
+- CUPSD_EVENT_JOB_COMPLETED = 0x0400, /* Sent after job is completed */
+- CUPSD_EVENT_JOB_STOPPED = 0x0800, /* Sent after job is stopped */
+- CUPSD_EVENT_JOB_CONFIG_CHANGED = 0x1000,
++ CUPSD_EVENT_JOB_STATE = 0x0800, /* Any state change */
++ CUPSD_EVENT_JOB_CREATED = 0x1000, /* Send after job is created */
++ CUPSD_EVENT_JOB_COMPLETED = 0x2000, /* Sent after job is completed */
++ CUPSD_EVENT_JOB_STOPPED = 0x4000, /* Sent after job is stopped */
++ CUPSD_EVENT_JOB_CONFIG_CHANGED = 0x8000,
+ /* Sent after set-job-attributes */
+- CUPSD_EVENT_JOB_PROGRESS = 0x2000, /* Sent for each page */
++ CUPSD_EVENT_JOB_PROGRESS = 0x10000, /* Sent for each page */
+
+ /* Convenience job event grouping... */
+- CUPSD_EVENT_JOB_STATE_CHANGED = 0x0f00,
+- /* Any state change + CREATED + COMPLETED + STOPPED */
++ CUPSD_EVENT_JOB_STATE_CHANGED = 0x7800,
++ /* STATE + CREATED + COMPLETED + STOPPED */
+
+ /* Server events... */
+- CUPSD_EVENT_SERVER_RESTARTED = 0x4000,/* Sent after server restarts */
+- CUPSD_EVENT_SERVER_STARTED = 0x8000, /* Sent when server first starts */
+- CUPSD_EVENT_SERVER_STOPPED = 0x10000, /* Sent when server is stopped */
+- CUPSD_EVENT_SERVER_AUDIT = 0x20000, /* Security-related stuff */
++ CUPSD_EVENT_SERVER_RESTARTED = 0x20000,/* Sent after server restarts */
++ CUPSD_EVENT_SERVER_STARTED = 0x40000, /* Sent when server first starts */
++ CUPSD_EVENT_SERVER_STOPPED = 0x80000, /* Sent when server is stopped */
++ CUPSD_EVENT_SERVER_AUDIT = 0x100000, /* Security-related stuff */
+
+ /* Everything and nothing... */
+ CUPSD_EVENT_NONE = 0, /* Nothing */
+- CUPSD_EVENT_ALL = 0x1ffff /* Everything */
++ CUPSD_EVENT_ALL = 0x1fffff /* Everything */
+ } cupsd_eventmask_t;
+
+
+diff -up cups-1.3.5/scheduler/job.c.1.3.x cups-1.3.5/scheduler/job.c
+--- cups-1.3.5/scheduler/job.c.1.3.x 2007-11-27 00:09:24.000000000 +0000
++++ cups-1.3.5/scheduler/job.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Job management routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -113,7 +113,8 @@ cupsdAddJob(int priority, /* I -
+ cupsd_job_t *job; /* New job record */
+
+
+- job = calloc(sizeof(cupsd_job_t), 1);
++ if ((job = calloc(sizeof(cupsd_job_t), 1)) == NULL)
++ return (NULL);
+
+ job->id = NextJobId ++;
+ job->priority = priority;
+@@ -376,7 +377,11 @@ cupsdCheckJobs(void)
+ job->hold_until < time(NULL))
+ {
+ if (job->pending_timeout)
+- cupsdTimeoutJob(job); /* Add trailing banner as needed */
++ {
++ /* Add trailing banner as needed */
++ if (cupsdTimeoutJob(job))
++ continue;
++ }
+
+ job->state->values[0].integer = IPP_JOB_PENDING;
+ job->state_value = IPP_JOB_PENDING;
+@@ -1812,6 +1817,7 @@ free_job(cupsd_job_t *job) /* I - Job *
+ cupsdClearString(&job->auth_username);
+ cupsdClearString(&job->auth_domain);
+ cupsdClearString(&job->auth_password);
++
+ #ifdef HAVE_GSSAPI
+ /*
+ * Destroy the credential cache and clear the KRB5CCNAME env var string.
+@@ -2445,7 +2451,7 @@ start_job(cupsd_job_t *job, /* I -
+ title[IPP_MAX_NAME],
+ /* Job title string */
+ copies[255], /* # copies string */
+- *envp[MAX_ENV + 15],
++ *envp[MAX_ENV + 16],
+ /* Environment variables */
+ charset[255], /* CHARSET env variable */
+ class_name[255],/* CLASS env variable */
+@@ -2458,6 +2464,10 @@ start_job(cupsd_job_t *job, /* I -
+ final_content_type[1024],
+ /* FINAL_CONTENT_TYPE env variable */
+ lang[255], /* LANG env variable */
++#ifdef __APPLE__
++ apple_language[255],
++ /* APPLE_LANGUAGE env variable */
++#endif /* __APPLE__ */
+ ppd[1024], /* PPD env variable */
+ printer_name[255],
+ /* PRINTER env variable */
+@@ -2514,7 +2524,7 @@ start_job(cupsd_job_t *job, /* I -
+ "[Job %d] Unable to convert file %d to printable format!",
+ job->current_file, job->id);
+ cupsdLogMessage(CUPSD_LOG_INFO,
+- "Hint: Do you have ESP Ghostscript installed?");
++ "Hint: Do you have Ghostscript installed?");
+
+ if (LogLevel < CUPSD_LOG_DEBUG)
+ cupsdLogMessage(CUPSD_LOG_INFO,
+@@ -2964,6 +2974,17 @@ start_job(cupsd_job_t *job, /* I -
+ else
+ argv = calloc(8, sizeof(char *));
+
++ if (!argv)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to allocate argument array!");
++ cupsArrayDelete(filters);
++
++ FilterLevel -= job->cost;
++
++ cupsdStopPrinter(printer, 0);
++ return;
++ }
++
+ sprintf(jobid, "%d", job->id);
+
+ argv[0] = printer->name;
+@@ -3000,6 +3021,12 @@ start_job(cupsd_job_t *job, /* I -
+ attr = ippFindAttribute(job->attrs, "attributes-natural-language",
+ IPP_TAG_LANGUAGE);
+
++#ifdef __APPLE__
++ strcpy(apple_language, "APPLE_LANGUAGE");
++ _cupsAppleLanguage(attr->values[0].string.text,
++ apple_language + 15, sizeof(apple_language) - 15);
++#endif /* __APPLE__ */
++
+ switch (strlen(attr->values[0].string.text))
+ {
+ default :
+@@ -3060,6 +3087,9 @@ start_job(cupsd_job_t *job, /* I -
+
+ envp[envc ++] = charset;
+ envp[envc ++] = lang;
++#ifdef __APPLE__
++ envp[envc ++] = apple_language;
++#endif /* __APPLE__ */
+ envp[envc ++] = ppd;
+ envp[envc ++] = rip_max_cache;
+ envp[envc ++] = content_type;
+@@ -3114,8 +3144,8 @@ start_job(cupsd_job_t *job, /* I -
+ envp[envc] = NULL;
+
+ for (i = 0; i < envc; i ++)
+- if (!strncmp(envp[i], "AUTH_", 5))
+- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] envp[%d]=\"AUTH_%c****\"",
++ if (!strncmp(envp[i], "CUPSD_AUTH_", 5))
++ cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] envp[%d]=\"CUPSD_AUTH_%c****\"",
+ job->id, i, envp[i][5]);
+ else if (strncmp(envp[i], "DEVICE_URI=", 11))
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] envp[%d]=\"%s\"",
+@@ -3321,7 +3351,7 @@ start_job(cupsd_job_t *job, /* I -
+
+ if (strncmp(printer->device_uri, "file:", 5) != 0)
+ {
+- if (job->current_file == 1)
++ if (job->current_file == 1 || printer->remote)
+ {
+ sscanf(printer->device_uri, "%254[^:]", method);
+ snprintf(command, sizeof(command), "%s/backend/%s", ServerBin, method);
+@@ -3538,7 +3568,7 @@ update_job(cupsd_job_t *job) /* I - Job
+ * job sheet count...
+ */
+
+- if (job->sheets != NULL)
++ if (job->sheets)
+ {
+ if (!strncasecmp(message, "total ", 6))
+ {
+@@ -3583,8 +3613,9 @@ update_job(cupsd_job_t *job) /* I - Job
+
+ cupsdLogPage(job, message);
+
+- cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job,
+- "Printed %d page(s).", job->sheets->values[0].integer);
++ if (job->sheets)
++ cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job,
++ "Printed %d page(s).", job->sheets->values[0].integer);
+ }
+ else if (loglevel == CUPSD_LOG_STATE)
+ {
+@@ -3597,7 +3628,7 @@ update_job(cupsd_job_t *job) /* I - Job
+ {
+ cupsdSetPrinterReasons(job->printer, message);
+ cupsdAddPrinterHistory(job->printer);
+- event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
++ event |= CUPSD_EVENT_PRINTER_STATE;
+ }
+
+ update_job_attrs(job);
+@@ -3626,14 +3657,42 @@ update_job(cupsd_job_t *job) /* I - Job
+ if ((attr = cupsGetOption("printer-alert", num_attrs, attrs)) != NULL)
+ {
+ cupsdSetString(&job->printer->alert, attr);
+- event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
++ event |= CUPSD_EVENT_PRINTER_STATE;
+ }
+
+ if ((attr = cupsGetOption("printer-alert-description", num_attrs,
+ attrs)) != NULL)
+ {
+ cupsdSetString(&job->printer->alert_description, attr);
+- event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
++ event |= CUPSD_EVENT_PRINTER_STATE;
++ }
++
++ if ((attr = cupsGetOption("marker-colors", num_attrs, attrs)) != NULL)
++ {
++ cupsdSetPrinterAttr(job->printer, "marker-colors", (char *)attr);
++ job->printer->marker_time = time(NULL);
++ event |= CUPSD_EVENT_PRINTER_STATE;
++ }
++
++ if ((attr = cupsGetOption("marker-levels", num_attrs, attrs)) != NULL)
++ {
++ cupsdSetPrinterAttr(job->printer, "marker-levels", (char *)attr);
++ job->printer->marker_time = time(NULL);
++ event |= CUPSD_EVENT_PRINTER_STATE;
++ }
++
++ if ((attr = cupsGetOption("marker-names", num_attrs, attrs)) != NULL)
++ {
++ cupsdSetPrinterAttr(job->printer, "marker-names", (char *)attr);
++ job->printer->marker_time = time(NULL);
++ event |= CUPSD_EVENT_PRINTER_STATE;
++ }
++
++ if ((attr = cupsGetOption("marker-types", num_attrs, attrs)) != NULL)
++ {
++ cupsdSetPrinterAttr(job->printer, "marker-types", (char *)attr);
++ job->printer->marker_time = time(NULL);
++ event |= CUPSD_EVENT_PRINTER_STATE;
+ }
+
+ cupsFreeOptions(num_attrs, attrs);
+@@ -3650,7 +3709,7 @@ update_job(cupsd_job_t *job) /* I - Job
+
+ cupsdSetString(&job->printer->recoverable, ptr);
+ cupsdAddPrinterHistory(job->printer);
+- event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
++ event |= CUPSD_EVENT_PRINTER_STATE;
+ }
+ else if (!strncmp(message, "recovered:", 10))
+ {
+@@ -3663,7 +3722,7 @@ update_job(cupsd_job_t *job) /* I - Job
+
+ cupsdSetString(&job->printer->recoverable, ptr);
+ cupsdAddPrinterHistory(job->printer);
+- event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
++ event |= CUPSD_EVENT_PRINTER_STATE;
+ }
+ #endif /* __APPLE__ */
+ else if (loglevel <= job->status_level)
+@@ -3678,7 +3737,7 @@ update_job(cupsd_job_t *job) /* I - Job
+ strlcpy(job->printer->state_message, message,
+ sizeof(job->printer->state_message));
+ cupsdAddPrinterHistory(job->printer);
+- event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
++ event |= CUPSD_EVENT_PRINTER_STATE;
+
+ update_job_attrs(job);
+ }
+@@ -3687,8 +3746,8 @@ update_job(cupsd_job_t *job) /* I - Job
+ break;
+ }
+
+- if ((event & CUPSD_EVENT_PRINTER_STATE_CHANGED))
+- cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE_CHANGED, job->printer, NULL,
++ if (event & CUPSD_EVENT_PRINTER_STATE)
++ cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, job->printer, NULL,
+ (job->printer->type & CUPS_PRINTER_CLASS) ?
+ "Class \"%s\" state changed." :
+ "Printer \"%s\" state changed.",
+diff -up cups-1.3.5/scheduler/type.c.1.3.x cups-1.3.5/scheduler/type.c
+--- cups-1.3.5/scheduler/type.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scheduler/type.c 2008-02-05 15:08:55.000000000 +0000
+@@ -567,12 +567,12 @@ mimeFileType(mime_t *mime, /* I - M
+ if ((base = strrchr(filename, '/')) != NULL)
+ base ++;
+ else
+- filename = filename;
++ base = filename;
+ }
+ else if ((base = strrchr(pathname, '/')) != NULL)
+ base ++;
+ else
+- filename = pathname;
++ base = pathname;
+
+ /*
+ * Then check it against all known types...
+@@ -638,8 +638,8 @@ compare_types(mime_type_t *t0, /* I - F
+ int i; /* Result of comparison */
+
+
+- if ((i = strcmp(t0->super, t1->super)) == 0)
+- i = strcmp(t0->type, t1->type);
++ if ((i = strcasecmp(t0->super, t1->super)) == 0)
++ i = strcasecmp(t0->type, t1->type);
+
+ return (i);
+ }
+diff -up cups-1.3.5/scheduler/subscriptions.c.1.3.x cups-1.3.5/scheduler/subscriptions.c
+--- cups-1.3.5/scheduler/subscriptions.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scheduler/subscriptions.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Subscription routines for the Common UNIX Printing System (CUPS) scheduler.
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -323,7 +323,7 @@ cupsdAddSubscription(
+ "cupsdAddSubscription(mask=%x, dest=%p(%s), job=%p(%d), "
+ "uri=\"%s\")",
+ mask, dest, dest ? dest->name : "", job, job ? job->id : 0,
+- uri);
++ uri ? uri : "(null)");
+
+ if (!Subscriptions)
+ Subscriptions = cupsArrayNew((cups_array_func_t)cupsd_compare_subscriptions,
+@@ -504,9 +504,14 @@ cupsdEventName(
+ case CUPSD_EVENT_PRINTER_MODIFIED :
+ return ("printer-modified");
+
++ case CUPSD_EVENT_PRINTER_QUEUE_ORDER_CHANGED :
++ return ("printer-queue-order-changed");
++
++ case CUPSD_EVENT_PRINTER_STATE :
+ case CUPSD_EVENT_PRINTER_STATE_CHANGED :
+ return ("printer-state-changed");
+
++ case CUPSD_EVENT_PRINTER_CONFIG :
+ case CUPSD_EVENT_PRINTER_CONFIG_CHANGED :
+ return ("printer-config-changed");
+
+@@ -529,8 +534,6 @@ cupsdEventName(
+ return ("job-progress");
+
+ case CUPSD_EVENT_JOB_STATE :
+- return ("job-state");
+-
+ case CUPSD_EVENT_JOB_STATE_CHANGED :
+ return ("job-state-changed");
+
+@@ -577,14 +580,14 @@ cupsdEventValue(const char *name) /* I -
+ return (CUPSD_EVENT_PRINTER_DELETED);
+ else if (!strcmp(name, "printer-modified"))
+ return (CUPSD_EVENT_PRINTER_MODIFIED);
++ else if (!strcmp(name, "printer-queue-order-changed"))
++ return (CUPSD_EVENT_PRINTER_QUEUE_ORDER_CHANGED);
+ else if (!strcmp(name, "printer-state-changed"))
+ return (CUPSD_EVENT_PRINTER_STATE_CHANGED);
+ else if (!strcmp(name, "printer-config-changed"))
+ return (CUPSD_EVENT_PRINTER_CONFIG_CHANGED);
+ else if (!strcmp(name, "printer-changed"))
+ return (CUPSD_EVENT_PRINTER_CHANGED);
+- else if (!strcmp(name, "job-state"))
+- return (CUPSD_EVENT_JOB_STATE);
+ else if (!strcmp(name, "job-created"))
+ return (CUPSD_EVENT_JOB_CREATED);
+ else if (!strcmp(name, "job-completed"))
+@@ -731,7 +734,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, ""))
+@@ -741,7 +744,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+
+ if (delete_sub)
+@@ -755,7 +758,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+ else if (!strcasecmp(line, "Events"))
+ {
+@@ -769,7 +772,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+
+ while (*value)
+@@ -792,7 +795,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unknown event name \'%s\' on line %d of subscriptions.conf.",
+ value, linenum);
+- return;
++ break;
+ }
+
+ value = valueptr;
+@@ -811,7 +814,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "Recipient"))
+@@ -827,7 +830,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "JobId"))
+@@ -851,7 +854,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "PrinterName"))
+@@ -875,7 +878,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "UserData"))
+@@ -937,7 +940,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "LeaseDuration"))
+@@ -956,7 +959,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "Interval"))
+@@ -972,7 +975,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "ExpirationTime"))
+@@ -988,7 +991,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "NextEventId"))
+@@ -1004,7 +1007,7 @@ cupsdLoadAllSubscriptions(void)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of subscriptions.conf.",
+ linenum);
+- return;
++ break;
+ }
+ }
+ else
+diff -up cups-1.3.5/scheduler/ipp.c.1.3.x cups-1.3.5/scheduler/ipp.c
+--- cups-1.3.5/scheduler/ipp.c.1.3.x 2007-12-15 00:23:16.000000000 +0000
++++ cups-1.3.5/scheduler/ipp.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * IPP routines for the Common UNIX Printing System (CUPS) scheduler.
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * This file contains Kerberos support code, copyright 2006 by
+@@ -658,7 +658,7 @@ cupsdProcessIPPRequest(
+ con->http.fd, con->response->request.status.status_code,
+ ippErrorString(con->response->request.status.status_code));
+
+- if (cupsdSendHeader(con, HTTP_OK, "application/ipp", AUTH_NONE))
++ if (cupsdSendHeader(con, HTTP_OK, "application/ipp", CUPSD_AUTH_NONE))
+ {
+ #ifdef CUPSD_USE_CHUNKING
+ /*
+@@ -746,7 +746,7 @@ cupsdProcessIPPRequest(
+ * 'cupsdTimeoutJob()' - Timeout a job waiting on job files.
+ */
+
+-void
++int /* O - 0 on success, -1 on error */
+ cupsdTimeoutJob(cupsd_job_t *job) /* I - Job to timeout */
+ {
+ cupsd_printer_t *printer; /* Destination printer or class */
+@@ -774,10 +774,13 @@ cupsdTimeoutJob(cupsd_job_t *job) /* I -
+ cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Adding end banner page \"%s\".",
+ job->id, attr->values[1].string.text);
+
+- kbytes = copy_banner(NULL, job, attr->values[1].string.text);
++ if ((kbytes = copy_banner(NULL, job, attr->values[1].string.text)) < 0)
++ return (-1);
+
+ cupsdUpdateQuota(printer, job->username, 0, kbytes);
+ }
++
++ return (0);
+ }
+
+
+@@ -1786,7 +1789,8 @@ add_job(cupsd_client_t *con, /* I - Cl
+ "[Job %d] Adding start banner page \"%s\".",
+ job->id, attr->values[0].string.text);
+
+- kbytes = copy_banner(con, job, attr->values[0].string.text);
++ if ((kbytes = copy_banner(con, job, attr->values[0].string.text)) < 0)
++ return (NULL);
+
+ cupsdUpdateQuota(printer, job->username, 0, kbytes);
+ }
+@@ -2403,12 +2407,15 @@ add_printer(cupsd_client_t *con, /* I -
+
+ supported = ippFindAttribute(printer->attrs, "port-monitor-supported",
+ IPP_TAG_NAME);
+- for (i = 0; i < supported->num_values; i ++)
+- if (!strcmp(supported->values[i].string.text,
+- attr->values[0].string.text))
+- break;
++ if (supported)
++ {
++ for (i = 0; i < supported->num_values; i ++)
++ if (!strcmp(supported->values[i].string.text,
++ attr->values[0].string.text))
++ break;
++ }
+
+- if (i >= supported->num_values)
++ if (!supported || i >= supported->num_values)
+ {
+ send_ipp_status(con, IPP_NOT_POSSIBLE, _("Bad port-monitor \"%s\"!"),
+ attr->values[0].string.text);
+@@ -3410,13 +3417,6 @@ check_quotas(cupsd_client_t *con, /* I
+ con, con->http.fd, p, p->name);
+
+ /*
+- * Check input...
+- */
+-
+- if (!con || !p)
+- return (0);
+-
+- /*
+ * Figure out who is printing...
+ */
+
+@@ -3922,7 +3922,7 @@ copy_banner(cupsd_client_t *con, /* I -
+ */
+
+ if (add_file(con, job, banner->filetype, 0))
+- return (0);
++ return (-1);
+
+ snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id,
+ job->num_files);
+@@ -4644,6 +4644,10 @@ copy_printer_attrs(
+ printer->recoverable);
+ #endif /* __APPLE__ */
+
++ if (!ra || cupsArrayFind(ra, "marker-change-time"))
++ ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
++ "marker-change-time", printer->marker_time);
++
+ if (printer->alert && (!ra || cupsArrayFind(ra, "printer-alert")))
+ ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_STRING,
+ "printer-alert", NULL, printer->alert);
+@@ -7541,7 +7545,8 @@ print_job(cupsd_client_t *con, /* I -
+ * See if we need to add the ending sheet...
+ */
+
+- cupsdTimeoutJob(job);
++ if (cupsdTimeoutJob(job))
++ return;
+
+ /*
+ * Log and save the job...
+@@ -8265,13 +8270,13 @@ save_auth_info(
+ cupsFilePrintf(fp, "%s\n", line);
+
+ if (!strcmp(dest->auth_info_required[i], "username"))
+- cupsdSetStringf(&job->auth_username, "AUTH_USERNAME=%s",
++ cupsdSetStringf(&job->auth_username, "CUPSD_AUTH_USERNAME=%s",
+ auth_info->values[i].string.text);
+ else if (!strcmp(dest->auth_info_required[i], "domain"))
+- cupsdSetStringf(&job->auth_domain, "AUTH_DOMAIN=%s",
++ cupsdSetStringf(&job->auth_domain, "CUPSD_AUTH_DOMAIN=%s",
+ auth_info->values[i].string.text);
+ else if (!strcmp(dest->auth_info_required[i], "password"))
+- cupsdSetStringf(&job->auth_password, "AUTH_PASSWORD=%s",
++ cupsdSetStringf(&job->auth_password, "CUPSD_AUTH_PASSWORD=%s",
+ auth_info->values[i].string.text);
+ }
+ }
+@@ -8284,7 +8289,7 @@ save_auth_info(
+ httpEncode64_2(line, sizeof(line), con->username, strlen(con->username));
+ cupsFilePrintf(fp, "%s\n", line);
+
+- cupsdSetStringf(&job->auth_username, "AUTH_USERNAME=%s", con->username);
++ cupsdSetStringf(&job->auth_username, "CUPSD_AUTH_USERNAME=%s", con->username);
+ cupsdClearString(&job->auth_domain);
+
+ /*
+@@ -8294,7 +8299,7 @@ save_auth_info(
+ httpEncode64_2(line, sizeof(line), con->password, strlen(con->password));
+ cupsFilePrintf(fp, "%s\n", line);
+
+- cupsdSetStringf(&job->auth_password, "AUTH_PASSWORD=%s", con->password);
++ cupsdSetStringf(&job->auth_password, "CUPSD_AUTH_PASSWORD=%s", con->password);
+ }
+
+ /*
+@@ -8745,7 +8750,8 @@ send_document(cupsd_client_t *con, /* I
+ * See if we need to add the ending sheet...
+ */
+
+- cupsdTimeoutJob(job);
++ if (cupsdTimeoutJob(job))
++ return;
+
+ if (job->state_value == IPP_JOB_STOPPED)
+ {
+@@ -8830,7 +8836,7 @@ send_http_error(
+ if (status == HTTP_UNAUTHORIZED &&
+ printer && printer->num_auth_info_required > 0 &&
+ !strcmp(printer->auth_info_required[0], "negotiate"))
+- cupsdSendError(con, status, AUTH_NEGOTIATE);
++ cupsdSendError(con, status, CUPSD_AUTH_NEGOTIATE);
+ else if (printer)
+ {
+ char resource[HTTP_MAX_URI]; /* Resource portion of URI */
+@@ -8843,13 +8849,13 @@ send_http_error(
+ snprintf(resource, sizeof(resource), "/printers/%s", printer->name);
+
+ if ((auth = cupsdFindBest(resource, HTTP_POST)) == NULL ||
+- auth->type == AUTH_NONE)
++ auth->type == CUPSD_AUTH_NONE)
+ auth = cupsdFindPolicyOp(printer->op_policy_ptr, IPP_PRINT_JOB);
+
+- cupsdSendError(con, status, auth ? auth->type : AUTH_NONE);
++ cupsdSendError(con, status, auth ? auth->type : CUPSD_AUTH_NONE);
+ }
+ else
+- cupsdSendError(con, status, AUTH_NONE);
++ cupsdSendError(con, status, CUPSD_AUTH_NONE);
+
+ ippDelete(con->response);
+ con->response = NULL;
+@@ -9152,7 +9158,8 @@ set_job_attrs(cupsd_client_t *con, /* I
+ else if (con->response->request.status.status_code == IPP_OK)
+ {
+ cupsdSetJobPriority(job, attr->values[0].integer);
+- event |= CUPSD_EVENT_JOB_CONFIG_CHANGED;
++ event |= CUPSD_EVENT_JOB_CONFIG_CHANGED |
++ CUPSD_EVENT_PRINTER_QUEUE_ORDER_CHANGED;
+ }
+ }
+ else if (!strcmp(attr->name, "job-state"))
+@@ -9299,6 +9306,10 @@ set_job_attrs(cupsd_client_t *con, /* I
+ * Send events as needed...
+ */
+
++ if (event & CUPSD_EVENT_PRINTER_QUEUE_ORDER_CHANGED)
++ cupsdAddEvent(CUPSD_EVENT_PRINTER_QUEUE_ORDER_CHANGED, job->printer, job,
++ "Job priority changed by user.");
++
+ if (event & CUPSD_EVENT_JOB_STATE)
+ cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job,
+ job->state_value == IPP_JOB_HELD ?
+@@ -9805,6 +9816,8 @@ user_allowed(cupsd_printer_t *p, /* I -
+ {
+ int i; /* Looping var */
+ struct passwd *pw; /* User password data */
++ char baseuser[256], /* Base username */
++ *baseptr; /* Pointer to "@" in base username */
+
+
+ if (p->num_users == 0)
+@@ -9813,6 +9826,20 @@ user_allowed(cupsd_printer_t *p, /* I -
+ if (!strcmp(username, "root"))
+ return (1);
+
++ if (strchr(username, '@'))
++ {
++ /*
++ * Strip @REALM for username check...
++ */
++
++ strlcpy(baseuser, username, sizeof(baseuser));
++
++ if ((baseptr = strchr(baseuser, '@')) != NULL)
++ *baseptr = '\0';
++
++ username = baseuser;
++ }
++
+ pw = getpwnam(username);
+ endpwent();
+
+@@ -9979,8 +10006,8 @@ validate_user(cupsd_job_t *job, /* I
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "validate_user(job=%d, con=%d, owner=\"%s\", username=%p, "
+ "userlen=%d)",
+- job ? job->id : 0, con->http.fd, owner ? owner : "(null)",
+- username, userlen);
++ job->id, con ? con->http.fd : 0,
++ owner ? owner : "(null)", username, userlen);
+
+ /*
+ * Validate input...
+diff -up cups-1.3.5/scheduler/dirsvc.c.1.3.x cups-1.3.5/scheduler/dirsvc.c
+--- cups-1.3.5/scheduler/dirsvc.c.1.3.x 2007-12-06 20:44:04.000000000 +0000
++++ cups-1.3.5/scheduler/dirsvc.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Directory services routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -325,7 +325,7 @@ cupsdLoadRemoteCache(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of remote.cache.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "") ||
+@@ -386,14 +386,14 @@ cupsdLoadRemoteCache(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of remote.cache.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!p)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of remote.cache.", linenum);
+- return;
++ break;
+ }
+ else if (!strcasecmp(line, "Info"))
+ {
+@@ -426,7 +426,7 @@ cupsdLoadRemoteCache(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of remote.cache.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "Option") && value)
+@@ -462,7 +462,7 @@ cupsdLoadRemoteCache(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of remote.cache.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "StateMessage"))
+@@ -494,7 +494,7 @@ cupsdLoadRemoteCache(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of remote.cache.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "Type"))
+@@ -505,7 +505,7 @@ cupsdLoadRemoteCache(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of remote.cache.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "BrowseTime"))
+@@ -521,7 +521,7 @@ cupsdLoadRemoteCache(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of remote.cache.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "JobSheets"))
+@@ -556,7 +556,7 @@ cupsdLoadRemoteCache(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of remote.cache.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "AllowUser"))
+@@ -570,7 +570,7 @@ cupsdLoadRemoteCache(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of remote.cache.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "DenyUser"))
+@@ -584,7 +584,7 @@ cupsdLoadRemoteCache(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of remote.cache.", linenum);
+- return;
++ break;
+ }
+ }
+ else
+@@ -1793,9 +1793,9 @@ process_browse_data(
+ if (hptr && !*hptr)
+ *hptr = '.'; /* Resource FQDN */
+
+- if ((p = cupsdFindClass(name)) == NULL && BrowseShortNames)
++ if ((p = cupsdFindDest(name)) == NULL && BrowseShortNames)
+ {
+- if ((p = cupsdFindClass(resource + 9)) != NULL)
++ if ((p = cupsdFindDest(resource + 9)) != NULL)
+ {
+ if (p->hostname && strcasecmp(p->hostname, host))
+ {
+@@ -1900,9 +1900,9 @@ process_browse_data(
+ if (hptr && !*hptr)
+ *hptr = '.'; /* Resource FQDN */
+
+- if ((p = cupsdFindPrinter(name)) == NULL && BrowseShortNames)
++ if ((p = cupsdFindDest(name)) == NULL && BrowseShortNames)
+ {
+- if ((p = cupsdFindPrinter(resource + 10)) != NULL)
++ if ((p = cupsdFindDest(resource + 10)) != NULL)
+ {
+ if (p->hostname && strcasecmp(p->hostname, host))
+ {
+@@ -3629,7 +3629,7 @@ update_cups_browse(void)
+ * Access from localhost (127.0.0.1) is always allowed...
+ */
+
+- auth = AUTH_ALLOW;
++ auth = CUPSD_AUTH_ALLOW;
+ }
+ else
+ {
+@@ -3640,39 +3640,39 @@ update_cups_browse(void)
+ switch (BrowseACL->order_type)
+ {
+ default :
+- auth = AUTH_DENY; /* anti-compiler-warning-code */
++ auth = CUPSD_AUTH_DENY; /* anti-compiler-warning-code */
+ break;
+
+- case AUTH_ALLOW : /* Order Deny,Allow */
+- auth = AUTH_ALLOW;
++ case CUPSD_AUTH_ALLOW : /* Order Deny,Allow */
++ auth = CUPSD_AUTH_ALLOW;
+
+ if (cupsdCheckAuth(address, srcname, len,
+ BrowseACL->num_deny, BrowseACL->deny))
+- auth = AUTH_DENY;
++ auth = CUPSD_AUTH_DENY;
+
+ if (cupsdCheckAuth(address, srcname, len,
+ BrowseACL->num_allow, BrowseACL->allow))
+- auth = AUTH_ALLOW;
++ auth = CUPSD_AUTH_ALLOW;
+ break;
+
+- case AUTH_DENY : /* Order Allow,Deny */
+- auth = AUTH_DENY;
++ case CUPSD_AUTH_DENY : /* Order Allow,Deny */
++ auth = CUPSD_AUTH_DENY;
+
+ if (cupsdCheckAuth(address, srcname, len,
+ BrowseACL->num_allow, BrowseACL->allow))
+- auth = AUTH_ALLOW;
++ auth = CUPSD_AUTH_ALLOW;
+
+ if (cupsdCheckAuth(address, srcname, len,
+ BrowseACL->num_deny, BrowseACL->deny))
+- auth = AUTH_DENY;
++ auth = CUPSD_AUTH_DENY;
+ break;
+ }
+ }
+ }
+ else
+- auth = AUTH_ALLOW;
++ auth = CUPSD_AUTH_ALLOW;
+
+- if (auth == AUTH_DENY)
++ if (auth == CUPSD_AUTH_DENY)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "update_cups_browse: Refused %d bytes from %s", bytes,
+diff -up cups-1.3.5/scheduler/printers.c.1.3.x cups-1.3.5/scheduler/printers.c
+--- cups-1.3.5/scheduler/printers.c.1.3.x 2007-12-11 00:37:08.000000000 +0000
++++ cups-1.3.5/scheduler/printers.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Printer routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -27,6 +27,7 @@
+ * cupsdSaveAllPrinters() - Save all printer definitions to the
+ * printers.conf file.
+ * cupsdSetAuthInfoRequired() - Set the required authentication info.
++ * cupsdSetPrinterAttr() - Set a printer attribute.
+ * cupsdSetPrinterAttrs() - Set printer attributes based upon the PPD
+ * file.
+ * cupsdSetPrinterReasons() - Set/update the reasons strings.
+@@ -900,7 +901,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, ""))
+@@ -945,14 +946,14 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!p)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ else if (!strcasecmp(line, "AuthInfoRequired"))
+ {
+@@ -979,7 +980,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "Option") && value)
+@@ -1011,7 +1012,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "State"))
+@@ -1028,7 +1029,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "StateMessage"))
+@@ -1069,7 +1070,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "Shared"))
+@@ -1092,7 +1093,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "JobSheets"))
+@@ -1127,7 +1128,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "AllowUser"))
+@@ -1141,7 +1142,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "DenyUser"))
+@@ -1155,7 +1156,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "QuotaPeriod"))
+@@ -1166,7 +1167,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "PageLimit"))
+@@ -1177,7 +1178,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "KLimit"))
+@@ -1188,7 +1189,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "OpPolicy"))
+@@ -1212,7 +1213,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else if (!strcasecmp(line, "ErrorPolicy"))
+@@ -1223,7 +1224,7 @@ cupsdLoadAllPrinters(void)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of printers.conf.", linenum);
+- return;
++ break;
+ }
+ }
+ else
+@@ -1642,6 +1643,120 @@ cupsdSetAuthInfoRequired(
+
+
+ /*
++ * 'cupsdSetPrinterAttr()' - Set a printer attribute.
++ */
++
++void
++cupsdSetPrinterAttr(
++ cupsd_printer_t *p, /* I - Printer */
++ const char *name, /* I - Attribute name */
++ char *value) /* I - Attribute value string */
++{
++ ipp_attribute_t *attr; /* Attribute */
++ int i, /* Looping var */
++ count; /* Number of values */
++ char *ptr; /* Pointer into value */
++ ipp_tag_t value_tag; /* Value tag for this attribute */
++
++
++ /*
++ * Count the number of values...
++ */
++
++ for (count = 1, ptr = value;
++ (ptr = strchr(ptr, ',')) != NULL;
++ ptr ++, count ++);
++
++ /*
++ * Then add or update the attribute as needed...
++ */
++
++ if (!strcmp(name, "marker-levels"))
++ {
++ /*
++ * Integer values...
++ */
++
++ if ((attr = ippFindAttribute(p->attrs, name, IPP_TAG_INTEGER)) != NULL &&
++ attr->num_values < count)
++ {
++ ippDeleteAttribute(p->attrs, attr);
++ attr = NULL;
++ }
++
++ if (attr)
++ attr->num_values = count;
++ else
++ attr = ippAddIntegers(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, name,
++ count, NULL);
++
++ if (!attr)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "Unable to allocate memory for printer attribute "
++ "(%d values)", count);
++ return;
++ }
++
++ for (i = 0; i < count; i ++)
++ {
++ if ((ptr = strchr(value, ',')) != NULL)
++ *ptr++ = '\0';
++
++ attr->values[i].integer = strtol(value, NULL, 10);
++
++ if (ptr)
++ value = ptr;
++ }
++ }
++ else
++ {
++ /*
++ * Name or keyword values...
++ */
++
++ if (!strcmp(name, "marker-types"))
++ value_tag = IPP_TAG_KEYWORD;
++ else
++ value_tag = IPP_TAG_NAME;
++
++ if ((attr = ippFindAttribute(p->attrs, name, value_tag)) != NULL &&
++ attr->num_values < count)
++ {
++ ippDeleteAttribute(p->attrs, attr);
++ attr = NULL;
++ }
++
++ if (attr)
++ attr->num_values = count;
++ else
++ attr = ippAddStrings(p->attrs, IPP_TAG_PRINTER, value_tag, name,
++ count, NULL, NULL);
++
++ if (!attr)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "Unable to allocate memory for printer attribute "
++ "(%d values)", count);
++ return;
++ }
++
++ for (i = 0; i < count; i ++)
++ {
++ if ((ptr = strchr(value, ',')) != NULL)
++ *ptr++ = '\0';
++
++ _cupsStrFree(attr->values[i].string.text);
++ attr->values[i].string.text = _cupsStrAlloc(value);
++
++ if (ptr)
++ value = ptr;
++ }
++ }
++}
++
++
++/*
+ * 'cupsdSetPrinterAttrs()' - Set printer attributes based upon the PPD file.
+ */
+
+@@ -1736,25 +1851,25 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)
+ snprintf(resource, sizeof(resource), "/printers/%s", p->name);
+
+ if ((auth = cupsdFindBest(resource, HTTP_POST)) == NULL ||
+- auth->type == AUTH_NONE)
++ auth->type == CUPSD_AUTH_NONE)
+ auth = cupsdFindPolicyOp(p->op_policy_ptr, IPP_PRINT_JOB);
+
+ if (auth)
+ {
+- if (auth->type == AUTH_BASIC || auth->type == AUTH_BASICDIGEST)
++ if (auth->type == CUPSD_AUTH_BASIC || auth->type == CUPSD_AUTH_BASICDIGEST)
+ {
+ auth_supported = "basic";
+ num_air = 2;
+ air = air_userpass;
+ }
+- else if (auth->type == AUTH_DIGEST)
++ else if (auth->type == CUPSD_AUTH_DIGEST)
+ {
+ auth_supported = "digest";
+ num_air = 2;
+ air = air_userpass;
+ }
+ #ifdef HAVE_GSSAPI
+- else if (auth->type == AUTH_NEGOTIATE)
++ else if (auth->type == CUPSD_AUTH_NEGOTIATE)
+ {
+ auth_supported = "negotiate";
+ num_air = 1;
+@@ -1762,7 +1877,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)
+ }
+ #endif /* HAVE_GSSAPI */
+
+- if (auth->type != AUTH_NONE)
++ if (auth->type != CUPSD_AUTH_NONE)
+ p->type |= CUPS_PRINTER_AUTHENTICATED;
+ else
+ p->type &= ~CUPS_PRINTER_AUTHENTICATED;
+@@ -2634,7 +2749,7 @@ cupsdSetPrinterState(
+ if (old_state != s)
+ {
+ cupsdAddEvent(s == IPP_PRINTER_STOPPED ? CUPSD_EVENT_PRINTER_STOPPED :
+- CUPSD_EVENT_PRINTER_STATE_CHANGED, p, NULL,
++ CUPSD_EVENT_PRINTER_STATE, p, NULL,
+ "%s \"%s\" state changed.",
+ (p->type & CUPS_PRINTER_CLASS) ? "Class" : "Printer",
+ p->name);
+diff -up cups-1.3.5/test/ipptest.c.1.3.x cups-1.3.5/test/ipptest.c
+--- cups-1.3.5/test/ipptest.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/test/ipptest.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * IPP test command for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -268,6 +268,7 @@ do_tests(const char *uri, /* I - URI to
+ {
+ printf("Unable to connect to %s on port %d - %s\n", server, port,
+ strerror(errno));
++ fclose(fp);
+ return (0);
+ }
+
+diff -up cups-1.3.5/scripting/java/src/com/easysw/cups/IPPAttribute.java.1.3.x cups-1.3.5/scripting/java/src/com/easysw/cups/IPPAttribute.java
+--- cups-1.3.5/scripting/java/src/com/easysw/cups/IPPAttribute.java.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scripting/java/src/com/easysw/cups/IPPAttribute.java 2008-02-05 15:08:55.000000000 +0000
+@@ -7,7 +7,7 @@ package com.easysw.cups;
+ * Internet Printing Protocol definitions for the Common UNIX Printing
+ * System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2002 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -263,7 +263,9 @@ public class IPPAttribute
+ {
+ IPPValue val;
+ int bytes = 0; // Start with one for the group tag.
+-
++ Charset utf8 = Charset::forName("UTF-8");
++ ByteBuffer temp;
++
+ //
+ // Add 1 if first time, or group tag changes.
+ //
+@@ -308,8 +310,12 @@ public class IPPAttribute
+ case IPPDefs.TAG_CHARSET:
+ case IPPDefs.TAG_LANGUAGE:
+ case IPPDefs.TAG_MIMETYPE:
++ temp = utf8.encode(val.text);
+ bytes += 2;
+- bytes += val.text.length();
++ if (temp.capacity() > 32767)
++ bytes += 32767;
++ else
++ bytes += temp.capacity();
+ break;
+
+ case IPPDefs.TAG_DATE :
+@@ -329,9 +335,13 @@ public class IPPAttribute
+
+ case IPPDefs.TAG_TEXTLANG :
+ case IPPDefs.TAG_NAMELANG :
++ temp = utf8.encode(val.text);
+ bytes += 6; // 2 overall len, 2 charset len, 2 text len
+- bytes += val.charset.length() +
+- val.text.length();
++ bytes += val.charset.length();
++ if (temp.capacity() > 32767)
++ bytes += 32767;
++ else
++ bytes += temp.capacity();
+ break;
+
+ default :
+@@ -359,6 +369,8 @@ public class IPPAttribute
+ int i,j, n;
+ int bi = 0; // Start with one for the group tag.
+ byte[] bytes = new byte[sz];
++ Charset utf8 = Charset::forName("UTF-8");
++ ByteBuffer temp;
+
+ if (group_tag != last_group)
+ {
+@@ -412,12 +424,16 @@ public class IPPAttribute
+ case IPPDefs.TAG_CHARSET :
+ case IPPDefs.TAG_LANGUAGE :
+ case IPPDefs.TAG_MIMETYPE :
+- bytes[bi++] = (byte)((val.text.length() & 0xff00) >> 8);
+- bytes[bi++] = (byte)(val.text.length() & 0xff);
+- for (j=0; j < val.text.length(); j++)
+- {
+- bytes[bi++] = (byte)val.text.charAt(j);
+- }
++ temp = utf8.encode(val.text);
++ n = temp.capacity();
++
++ if (n > 32767)
++ n = 32767;
++
++ bytes[bi++] = (byte)((n & 0x7f00) >> 8);
++ bytes[bi++] = (byte)(n & 0xff);
++ temp.get(bytes, bi, n);
++ bi += n;
+ break;
+
+ case IPPDefs.TAG_DATE:
+@@ -456,23 +472,30 @@ public class IPPAttribute
+
+ case IPPDefs.TAG_TEXTLANG :
+ case IPPDefs.TAG_NAMELANG :
+- n = val.charset.length() +
+- val.text.length() + 4;
+- bytes[bi++] = (byte)((n & 0xff00) >> 8);
++ temp = utf8.encode(val.text);
++ n = temp.capacity() + val.charset.length() + 4;
++
++ if (n > 32767)
++ n = 32767;
++
++ bytes[bi++] = (byte)((n & 0x7f00) >> 8);
+ bytes[bi++] = (byte)(n & 0xff);
+
+ n = val.charset.length();
+- bytes[bi++] = (byte)((n & 0xff00) >> 8);
++ bytes[bi++] = (byte)((n & 0x7f00) >> 8);
+ bytes[bi++] = (byte)(n & 0xff);
+ for (j=0; j < val.charset.length(); j++)
+ bytes[bi++] = (byte)val.charset.charAt(j);
+-
+- n = val.text.length();
+- bytes[bi++] = (byte)((n & 0xff00) >> 8);
++
++ n = temp.capacity();
++
++ if (n > 32767)
++ n = 32767;
++
++ bytes[bi++] = (byte)((n & 0x7f00) >> 8);
+ bytes[bi++] = (byte)(n & 0xff);
+- for (j=0; j < (byte)val.text.length(); j++)
+- bytes[bi++] = (byte)val.text.charAt(j);
+-
++ temp.get(bytes, bi, n);
++ bi += n;
+ break;
+
+ default :
+diff -up cups-1.3.5/scripting/java/src/com/easysw/cups/Cups.java.1.3.x cups-1.3.5/scripting/java/src/com/easysw/cups/Cups.java
+--- cups-1.3.5/scripting/java/src/com/easysw/cups/Cups.java.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/scripting/java/src/com/easysw/cups/Cups.java 2008-02-05 15:08:55.000000000 +0000
+@@ -7,7 +7,7 @@ package com.easysw.cups;
+ * Internet Printing Protocol definitions for the Common UNIX Printing
+ * System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -831,7 +831,7 @@ public class Cups
+
+ a = new IPPAttribute( IPPDefs.TAG_OPERATION, IPPDefs.TAG_CHARSET,
+ "attributes-charset" );
+- a.addString( "", "iso-8859-1" );
++ a.addString( "", "utf-8" );
+ ipp.addAttribute(a);
+
+
+@@ -1014,7 +1014,7 @@ public class Cups
+
+ a = new IPPAttribute( IPPDefs.TAG_OPERATION, IPPDefs.TAG_CHARSET,
+ "attributes-charset" );
+- a.addString( "", "iso-8859-1" );
++ a.addString( "", "utf-8" );
+ ipp.addAttribute(a);
+
+
+@@ -1091,7 +1091,7 @@ public class Cups
+
+ a = new IPPAttribute( IPPDefs.TAG_OPERATION, IPPDefs.TAG_CHARSET,
+ "attributes-charset" );
+- a.addString( "", "iso-8859-1" );
++ a.addString( "", "utf-8" );
+ ipp.addAttribute(a);
+
+
+@@ -1155,7 +1155,7 @@ public class Cups
+
+ a = new IPPAttribute( IPPDefs.TAG_OPERATION, IPPDefs.TAG_CHARSET,
+ "attributes-charset" );
+- a.addString( "", "iso-8859-1" );
++ a.addString( "", "utf-8" );
+ ipp.addAttribute(a);
+
+
+@@ -1229,7 +1229,7 @@ public class Cups
+
+ a = new IPPAttribute( IPPDefs.TAG_OPERATION, IPPDefs.TAG_CHARSET,
+ "attributes-charset" );
+- a.addString( "", "iso-8859-1" );
++ a.addString( "", "utf-8" );
+ ipp.addAttribute(a);
+
+ // ------------
+@@ -1315,7 +1315,7 @@ public class Cups
+
+ a = new IPPAttribute( IPPDefs.TAG_OPERATION, IPPDefs.TAG_CHARSET,
+ "attributes-charset" );
+- a.addString( "", "iso-8859-1" );
++ a.addString( "", "utf-8" );
+ ipp.addAttribute(a);
+
+ // ------------
+@@ -1375,7 +1375,7 @@ public class Cups
+
+ a = new IPPAttribute( IPPDefs.TAG_OPERATION, IPPDefs.TAG_CHARSET,
+ "attributes-charset" );
+- a.addString( "", "iso-8859-1" );
++ a.addString( "", "utf-8" );
+ ipp.addAttribute(a);
+
+
+diff -up cups-1.3.5/CHANGES.txt.1.3.x cups-1.3.5/CHANGES.txt
+--- cups-1.3.5/CHANGES.txt.1.3.x 2007-12-17 22:12:45.000000000 +0000
++++ cups-1.3.5/CHANGES.txt 2008-02-05 15:08:55.000000000 +0000
+@@ -1,6 +1,85 @@
+-CHANGES.txt - 2007-12-17
++CHANGES.txt - 2008-01-30
+ ------------------------
+
++CHANGES IN CUPS V1.3.6
++
++ - Documentation updates (STR #2646, STR #2647, STR #2649)
++ - The scheduler did not support printer supply attributes
++ (STR #1307)
++ - The Kerberos credentials provided by some Windows KDCs
++ were still too large - now use a dynamic buffer to
++ support credentials up to 64k in size (STR #2695)
++ - Printing a test page from the web interface incorrectly
++ defaulted to the "guest" user (STR #2688)
++ - The cupsEncodeOptions2() function did not parse multiple-
++ value attribute values properly (STR #2690)
++ - The scheduler incorrectly sent printer-stopped events for
++ status updates from the print filters (STR #2680)
++ - The IPP backend could crash when handling printer errors
++ (STR #2667)
++ - Multi-file jobs did not print to remote CUPS servers
++ (STR #2673)
++ - The scheduler did not provide the Apple language ID to
++ job filters.
++ - Kerberos authentication did not work with the web
++ interface (STR #2606, STR #2669)
++ - The requesing-user-name-allowed and -denied functionality
++ did not work for Kerberos-authenticated usernames (STR
++ #2670)
++ - CUPS didn't compile on HP-UX 11i (STR #2679)
++ - cupsEncodeOptions2() did not handle option values like
++ "What's up, doc?" properly.
++ - Added lots of memory allocation checks (Fortify)
++ - The scheduler would crash if it was unable to add a job
++ file (Fortify)
++ - ppdOpen*() did not check all memory allocations (Coverity)
++ - ippReadIO() did not check all memory allocations (Coverity)
++ - The PostScript filter did not detect read errors (Coverity)
++ - The scheduler did not check for a missing job-sheets-completed
++ attribute when sending an event notification (Coverity)
++ - "Set Printer Options" might not work with raw queues (Coverity)
++ - cupsRasterInterpretPPD() could crash on certain PostScript
++ errors (Coverity)
++ - The USB backend did not check for back-channel support
++ properly on all systems (Coverity)
++ - Fixed memory leaks in the GIF and PNM image loading code
++ (Coverity)
++ - Removed some dead code in the CUPS API and scheduler (Coverity)
++ - Fixed two overflow bugs in the HP-GL/2 filter (Coverity)
++ - Fixed another ASN1 string parsing bug (STR #2665)
++ - The RSS notifier directory was not installed with the
++ correct permissions.
++ - The standard CUPS backends could use 100% CPU while waiting
++ for print data (STR #2664)
++ - Filename-based MIME rules did not work (STR #2659)
++ - The cups-polld program did not exit if the scheduler crashed
++ (STR #2640)
++ - The scheduler would crash if you tried to set the port-monitor
++ on a raw queue (STR #2639)
++ - The scheduler could crash if a polled remote printer was
++ converted to a class (STR #2656)
++ - The web interface and cupsctl did not correctly reflect
++ the "allow printing from the Internet" state (STR #2650)
++ - The scheduler incorrectly treated MIME types as case-
++ sensitive (STR #2657)
++ - The Java support classes did not send UTF-8 strings to
++ the scheduler (STR #2651)
++ - The CGI code did not handle interrupted POST requests
++ properly (STR #2652)
++ - The PostScript filter incorrectly handled number-up when
++ the number of pages was evenly divisible by the number-up
++ value.
++ - The PDF filter incorrectly filtered pages when page-ranges
++ and number-up were both specified (STR #2643)
++ - The IPP backend did not handle printing of pictwps files
++ to a non-Mac CUPS server properly.
++ - The scheduler did not detect network interface changes
++ on operating systems other than Mac OS X (STR #2631)
++ - The scheduler now logs the UNIX error message when it
++ is unable to create a request file such as a print job.
++ - Added support for --enable-pie on Mac OS X.
++
++
+ CHANGES IN CUPS V1.3.5
+
+ - The SNMP backend did not check for negative string
+diff -up cups-1.3.5/conf/cupsd.conf.in.1.3.x cups-1.3.5/conf/cupsd.conf.in
+--- cups-1.3.5/conf/cupsd.conf.in.1.3.x 2007-07-25 01:40:03.000000000 +0100
++++ cups-1.3.5/conf/cupsd.conf.in 2008-02-05 15:08:55.000000000 +0000
+@@ -29,14 +29,12 @@ DefaultAuthType Basic
+ # Restrict access to the server...
+
+ Order allow,deny
+- Allow localhost
+
+
+ # Restrict access to the admin pages...
+
+ @ENCRYPTION_REQUIRED@
+ Order allow,deny
+- Allow localhost
+
+
+ # Restrict access to configuration files...
+@@ -44,7 +42,6 @@ DefaultAuthType Basic
+ AuthType Default
+ Require user @SYSTEM
+ Order allow,deny
+- Allow localhost
+
+
+ # Set the default printer/job policies...
+diff -up cups-1.3.5/templates/trailer.tmpl.1.3.x cups-1.3.5/templates/trailer.tmpl
+--- cups-1.3.5/templates/trailer.tmpl.1.3.x 2007-12-07 18:37:40.000000000 +0000
++++ cups-1.3.5/templates/trailer.tmpl 2008-02-05 15:08:55.000000000 +0000
+@@ -6,9 +6,9 @@
+ WIDTH="15" HEIGHT="15" ALT="">
+
+
+- The Common UNIX Printing System, CUPS, and the CUPS logo are the
+-trademark property of Apple Inc. CUPS
+-is copyright 2007 by Apple Inc., all rights reserved.
++The Common UNIX Printing System, CUPS, and the CUPS logo are
++trademarks of Apple Inc. CUPS is
++copyright 2007-2008 Apple Inc. All rights reserved.
+
+ |
+
+diff -up cups-1.3.5/config-scripts/cups-compiler.m4.1.3.x cups-1.3.5/config-scripts/cups-compiler.m4
+--- cups-1.3.5/config-scripts/cups-compiler.m4.1.3.x 2007-09-18 21:39:31.000000000 +0100
++++ cups-1.3.5/config-scripts/cups-compiler.m4 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@ dnl "$Id: cups-compiler.m4 6976 2007-09-
+ dnl
+ dnl Compiler stuff for the Common UNIX Printing System (CUPS).
+ dnl
+-dnl Copyright 2007 by Apple Inc.
++dnl Copyright 2007-2008 by Apple Inc.
+ dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ dnl
+ dnl These coded instructions, statements, and computer programs are the
+@@ -98,36 +98,56 @@ if test -n "$GCC"; then
+ fi
+ fi
+
++ # Generate position-independent code as needed...
+ if test $PICFLAG = 1 -a $uname != AIX; then
+ OPTIM="-fPIC $OPTIM"
+ fi
+
+- case $uname in
+- Linux*)
+- if test x$enable_pie = xyes; then
+- PIEFLAGS="-pie -fPIE"
+- fi
+-
+- if test x$enable_relro = xyes; then
+- RELROFLAGS="-Wl,-z,relro"
+- fi
+- ;;
+-
+- *)
+- if test x$enable_pie = xyes; then
+- echo "Sorry, --enable-pie is not supported on this OS!"
+- fi
+- ;;
+- esac
++ # The -fstack-protector option is available with some versions of
++ # GCC and adds "stack canaries" which detect when the return address
++ # has been overwritten, preventing many types of exploit attacks.
++ AC_MSG_CHECKING(if GCC supports -fstack-protector)
++ OLDCFLAGS="$CFLAGS"
++ CFLAGS="$CFLAGS -fstack-protector"
++ AC_TRY_COMPILE(,,
++ OPTIM="$OPTIM -fstack-protector"
++ AC_MSG_RESULT(yes),
++ AC_MSG_RESULT(no))
++ CFLAGS="$OLDCFLAGS"
++
++ # The -pie option is available with some versions of GCC and adds
++ # randomization of addresses, which avoids another class of exploits
++ # that depend on a fixed address for common functions.
++ if test x$enable_pie = xyes; then
++ AC_MSG_CHECKING(if GCC supports -pie)
++ OLDCFLAGS="$CFLAGS"
++ CFLAGS="$CFLAGS -pie -fPIE"
++ AC_TRY_COMPILE(,,
++ PIEFLAGS="-pie -fPIE"
++ AC_MSG_RESULT(yes),
++ AC_MSG_RESULT(no, ignoring --enable-pie))
++ CFLAGS="$OLDCFLAGS"
++ fi
+
+ if test "x$with_optim" = x; then
+ # Add useful warning options for tracking down problems...
+ OPTIM="-Wall -Wno-format-y2k $OPTIM"
+- # Additional warning options for alpha testing...
+- OPTIM="-Wshadow -Wunused $OPTIM"
++ # Additional warning options for development testing...
++ if test -d .svn; then
++ OPTIM="-Wshadow -Wunused $OPTIM"
++ fi
+ fi
+
+ case "$uname" in
++ Darwin*)
++ # -D_FORTIFY_SOURCE=2 adds additional object size
++ # checking, basically wrapping all string functions
++ # with buffer-limited ones. Not strictly needed for
++ # CUPS since we already use buffer-limited calls, but
++ # this will catch any additions that are broken.
++ CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
++ ;;
++
+ HP-UX*)
+ if test "x$enable_32bit" = xyes; then
+ # Build 32-bit libraries, 64-bit base...
+@@ -201,6 +221,12 @@ if test -n "$GCC"; then
+ ;;
+
+ Linux*)
++ # The -z relro option is provided by the Linux linker command to
++ # make relocatable data read-only.
++ if test x$enable_relro = xyes; then
++ RELROFLAGS="-Wl,-z,relro"
++ fi
++
+ if test "x$enable_32bit" = xyes; then
+ # Build 32-bit libraries, 64-bit base...
+ if test -z "$with_arch32flags"; then
+@@ -468,8 +494,8 @@ else
+ # cups-support@cups.org...
+ echo "Building CUPS with default compiler optimizations; contact"
+ echo "cups-bugs@cups.org with uname and compiler options needed"
+- echo "for your platform, or set the CFLAGS and CXXFLAGS"
+- echo "environment variable before running configure."
++ echo "for your platform, or set the CFLAGS, CXXFLAGS, and LDFLAGS"
++ echo "environment variables before running configure."
+ ;;
+ esac
+ fi
+diff -up cups-1.3.5/config-scripts/cups-network.m4.1.3.x cups-1.3.5/config-scripts/cups-network.m4
+--- cups-1.3.5/config-scripts/cups-network.m4.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/config-scripts/cups-network.m4 2008-02-05 15:08:55.000000000 +0000
+@@ -29,24 +29,6 @@ fi
+ AC_CHECK_MEMBER(struct sockaddr.sa_len,,, [#include ])
+ AC_CHECK_HEADER(sys/sockio.h, AC_DEFINE(HAVE_SYS_SOCKIO_H))
+
+-if test "$uname" = "SunOS"; then
+- case "$uversion" in
+- 55* | 56*)
+- maxfiles=1024
+- ;;
+- *)
+- maxfiles=4096
+- ;;
+- esac
+-else
+- maxfiles=4096
+-fi
+-
+-AC_ARG_WITH(maxfiles, [ --with-maxfiles=N set maximum number of file descriptors for scheduler ],
+- maxfiles=$withval)
+-
+-AC_DEFINE_UNQUOTED(CUPS_MAX_FDS, $maxfiles)
+-
+ CUPS_DEFAULT_DOMAINSOCKET=""
+
+ dnl Domain socket support...
+diff -up cups-1.3.5/config-scripts/cups-common.m4.1.3.x cups-1.3.5/config-scripts/cups-common.m4
+--- cups-1.3.5/config-scripts/cups-common.m4.1.3.x 2007-12-17 22:14:15.000000000 +0000
++++ cups-1.3.5/config-scripts/cups-common.m4 2008-02-05 15:08:55.000000000 +0000
+@@ -205,15 +205,6 @@ case $uname in
+ CUPSDLIBS="-sectorder __TEXT __text cupsd.order -e start -framework IOKit -framework SystemConfiguration"
+ LIBS="-framework CoreFoundation $LIBS"
+
+- dnl Check for CFLocaleCreateCanonicalLocaleIdentifierFromString...
+- AC_MSG_CHECKING(for CFLocaleCreateCanonicalLocaleIdentifierFromString)
+- if test "$uname" = "Darwin" -a $uversion -ge 70; then
+- AC_DEFINE(HAVE_CF_LOCALE_ID)
+- AC_MSG_RESULT(yes)
+- else
+- AC_MSG_RESULT(no)
+- fi
+-
+ dnl Check for framework headers...
+ AC_CHECK_HEADER(CoreFoundation/CoreFoundation.h,AC_DEFINE(HAVE_COREFOUNDATION_H))
+ AC_CHECK_HEADER(CoreFoundation/CFPriv.h,AC_DEFINE(HAVE_CFPRIV_H))
+diff -up cups-1.3.5/man/lpq.man.1.3.x cups-1.3.5/man/lpq.man
+--- cups-1.3.5/man/lpq.man.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/man/lpq.man 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ .\"
+ .\" lpq man page for the Common UNIX Printing System (CUPS).
+ .\"
+-.\" Copyright 2007 by Apple Inc.
++.\" Copyright 2007-2008 by Apple Inc.
+ .\" Copyright 1997-2006 by Easy Software Products.
+ .\"
+ .\" These coded instructions, statements, and computer programs are the
+@@ -12,7 +12,7 @@
+ .\" which should have been included with this file. If this file is
+ .\" file is missing or damaged, see the license at "http://www.cups.org/".
+ .\"
+-.TH lpq 1 "Common UNIX Printing System" "12 February 2006" "Apple Inc."
++.TH lpq 1 "Common UNIX Printing System" "2 January 2008" "Apple Inc."
+ .SH NAME
+ lpq \- show printer queue status
+ .SH SYNOPSIS
+@@ -33,7 +33,7 @@ no printer or class is specified on the
+ .LP
+ The \fI+interval\fR option allows you to continuously report the
+ jobs in the queue until the queue is empty; the list of jobs is
+-show one every \fIinterval\fR seconds.
++show once every \fIinterval\fR seconds.
+ .SH OPTIONS
+ \fIlpq\fR supports the following options:
+ .TP 5
+@@ -66,7 +66,7 @@ Requests a more verbose (long) reporting
+ .br
+ http://localhost:631/help
+ .SH COPYRIGHT
+-Copyright 2007 by Apple Inc.
++Copyright 2007-2008 by Apple Inc.
+ .\"
+ .\" End of "$Id: lpq.man 6649 2007-07-11 21:46:42Z mike $".
+ .\"
+diff -up cups-1.3.5/man/lpadmin.man.1.3.x cups-1.3.5/man/lpadmin.man
+--- cups-1.3.5/man/lpadmin.man.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/man/lpadmin.man 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ .\"
+ .\" lpadmin man page for the Common UNIX Printing System (CUPS).
+ .\"
+-.\" Copyright 2007 by Apple Inc.
++.\" Copyright 2007-2008 by Apple Inc.
+ .\" Copyright 1997-2006 by Easy Software Products.
+ .\"
+ .\" These coded instructions, statements, and computer programs are the
+@@ -12,7 +12,7 @@
+ .\" which should have been included with this file. If this file is
+ .\" file is missing or damaged, see the license at "http://www.cups.org/".
+ .\"
+-.TH lpadmin 8 "Common UNIX Printing System" "13 July 2006" "Apple Inc."
++.TH lpadmin 8 "Common UNIX Printing System" "2 January 2008" "Apple Inc."
+ .SH NAME
+ lpadmin \- configure cups printers and classes
+ .SH SYNOPSIS
+@@ -81,12 +81,6 @@ and is intended for providing support fo
+ Sets a standard System V interface script or PPD file from the
+ \fImodel\fR directory.
+ .TP 5
+--o name=value
+-.br
+-Sets a PPD or server option for the printer. PPD options can be
+-listed using the \fI-l\fR option with the \fIlpoptions(1)\fR
+-command.
+-.TP 5
+ -o job-k-limit=value
+ .br
+ Sets the kilobyte limit for per-user quotas. The value is an
+@@ -109,10 +103,23 @@ integer number of seconds; 86,400 second
+ .br
+ Sets the default banner page(s) to use for print jobs.
+ .TP 5
++-o name=value
++.br
++Sets a PPD option for the printer. PPD options can be
++listed using the \fI-l\fR option with the \fIlpoptions(1)\fR
++command.
++.TP 5
++-o name-default=value
++.br
++Sets a default server-side option for the printer. Any print-time
++option can be defaulted, e.g. "-o cpi-default=17" to set the default
++"cpi" option value to 17.
++.TP 5
+ -o port-monitor=name
+ .br
+ Sets the binary communications program to use when printing,
+-"none", "bcp", or "tbcp". The default program is "none".
++"none", "bcp", or "tbcp". The default program is "none". The
++specified port monitor must be listed in the printer's PPD file.
+ .TP 5
+ -o printer-error-policy=name
+ .br
+@@ -194,7 +201,7 @@ System V or Solaris printing system conf
+ .br
+ http://localhost:631/help
+ .SH COPYRIGHT
+-Copyright 2007 by Apple Inc.
++Copyright 2007-2008 by Apple Inc.
+ .\"
+ .\" End of "$Id: lpadmin.man 6649 2007-07-11 21:46:42Z mike $".
+ .\"
+diff -up cups-1.3.5/man/cupsd.conf.man.in.1.3.x cups-1.3.5/man/cupsd.conf.man.in
+--- cups-1.3.5/man/cupsd.conf.man.in.1.3.x 2007-10-02 00:11:47.000000000 +0100
++++ cups-1.3.5/man/cupsd.conf.man.in 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ .\"
+ .\" cupsd.conf man page for the Common UNIX Printing System (CUPS).
+ .\"
+-.\" Copyright 2007 by Apple Inc.
++.\" Copyright 2007-2008 by Apple Inc.
+ .\" Copyright 1997-2006 by Easy Software Products.
+ .\"
+ .\" These coded instructions, statements, and computer programs are the
+@@ -12,7 +12,7 @@
+ .\" which should have been included with this file. If this file is
+ .\" file is missing or damaged, see the license at "http://www.cups.org/".
+ .\"
+-.TH cupsd.conf 5 "Common UNIX Printing System" "6 June 2006" "Apple Inc."
++.TH cupsd.conf 5 "Common UNIX Printing System" "2 January 2008" "Apple Inc."
+ .SH NAME
+ cupsd.conf \- server configuration file for cups
+ .SH DESCRIPTION
+@@ -230,6 +230,12 @@ DefaultPolicy policy-name
+ .br
+ Specifies the default access policy to use.
+ .TP 5
++DefaultShared Yes
++.TP 5
++DefaultShared No
++.br
++Specifies whether local printers are shared by default.
++.TP 5
+ Deny all
+ .TP 5
+ Deny none
+@@ -606,7 +612,7 @@ Specifies the user name or ID that is us
+ .br
+ http://localhost:631/help
+ .SH COPYRIGHT
+-Copyright 2007 by Apple Inc.
++Copyright 2007-2008 by Apple Inc.
+ .\"
+ .\" End of "$Id: cupsd.conf.man.in 7004 2007-10-01 23:11:47Z mike $".
+ .\"
+diff -up cups-1.3.5/INSTALL.txt.1.3.x cups-1.3.5/INSTALL.txt
+--- cups-1.3.5/INSTALL.txt.1.3.x 2007-09-18 21:39:31.000000000 +0100
++++ cups-1.3.5/INSTALL.txt 2008-02-05 15:08:55.000000000 +0000
+@@ -1,4 +1,4 @@
+-INSTALL - CUPS v1.3.2 - 2007-09-18
++INSTALL - CUPS v1.3.6 - 2008-01-22
+ ----------------------------------
+
+ This file describes how to compile and install CUPS from source
+@@ -31,9 +31,8 @@ BEFORE YOU BEGIN
+ compile and run without these, however you'll miss out on
+ many of the features provided by CUPS.
+
+- Kerberos support requires a very recent version of the MIT
+- implementation with the krb5_cc_new_unique() function or the
+- Heimdal implementation, along with the corresponding GSSAPI
++ Kerberos support requires MIT Kerberos 1.6.3 or later or
++ or Heimdal Kerberos, along with the corresponding GSSAPI
+ pieces.
+
+ Also, please note that CUPS no longer includes the
+@@ -47,7 +46,7 @@ COMPILING FROM SUBVERSION
+
+ The CUPS Subversion repository doesn't hold a copy of the
+ pre-built configure script. You'll need to run the GNU
+- autoconf software (2.52 or higher) before compiling the
++ autoconf software (2.60 or higher) before compiling the
+ software from Subversion:
+
+ autoconf -f
+diff -up cups-1.3.5/filter/pstops.c.1.3.x cups-1.3.5/filter/pstops.c
+--- cups-1.3.5/filter/pstops.c.1.3.x 2007-11-09 19:54:09.000000000 +0000
++++ cups-1.3.5/filter/pstops.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * PostScript filter for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -164,27 +164,27 @@ static void cancel_job(int sig);
+ static int check_range(pstops_doc_t *doc, int page);
+ static void copy_bytes(cups_file_t *fp, off_t offset,
+ size_t length);
+-static size_t copy_comments(cups_file_t *fp, pstops_doc_t *doc,
++static ssize_t copy_comments(cups_file_t *fp, pstops_doc_t *doc,
+ ppd_file_t *ppd, char *line,
+- size_t linelen, size_t linesize);
++ ssize_t linelen, size_t linesize);
+ static void copy_dsc(cups_file_t *fp, pstops_doc_t *doc,
+- ppd_file_t *ppd, char *line, size_t linelen,
++ ppd_file_t *ppd, char *line, ssize_t linelen,
+ size_t linesize);
+ static void copy_non_dsc(cups_file_t *fp, pstops_doc_t *doc,
+ ppd_file_t *ppd, char *line,
+- size_t linelen, size_t linesize);
+-static size_t copy_page(cups_file_t *fp, pstops_doc_t *doc,
++ ssize_t linelen, size_t linesize);
++static ssize_t copy_page(cups_file_t *fp, pstops_doc_t *doc,
+ ppd_file_t *ppd, int number, char *line,
+- size_t linelen, size_t linesize);
+-static size_t copy_prolog(cups_file_t *fp, pstops_doc_t *doc,
++ ssize_t linelen, size_t linesize);
++static ssize_t copy_prolog(cups_file_t *fp, pstops_doc_t *doc,
+ ppd_file_t *ppd, char *line,
+- size_t linelen, size_t linesize);
+-static size_t copy_setup(cups_file_t *fp, pstops_doc_t *doc,
++ ssize_t linelen, size_t linesize);
++static ssize_t copy_setup(cups_file_t *fp, pstops_doc_t *doc,
+ ppd_file_t *ppd, char *line,
+- size_t linelen, size_t linesize);
+-static size_t copy_trailer(cups_file_t *fp, pstops_doc_t *doc,
++ ssize_t linelen, size_t linesize);
++static ssize_t copy_trailer(cups_file_t *fp, pstops_doc_t *doc,
+ ppd_file_t *ppd, int number, char *line,
+- size_t linelen, size_t linesize);
++ ssize_t linelen, size_t linesize);
+ static void do_prolog(pstops_doc_t *doc, ppd_file_t *ppd);
+ static void do_setup(pstops_doc_t *doc, ppd_file_t *ppd);
+ static void doc_printf(pstops_doc_t *doc, const char *format, ...)
+@@ -203,7 +203,7 @@ static char *parse_text(const char *sta
+ static void set_pstops_options(pstops_doc_t *doc, ppd_file_t *ppd,
+ char *argv[], int num_options,
+ cups_option_t *options);
+-static size_t skip_page(cups_file_t *fp, char *line, size_t linelen,
++static ssize_t skip_page(cups_file_t *fp, char *line, ssize_t linelen,
+ size_t linesize);
+ static void start_nup(pstops_doc_t *doc, int number,
+ int show_border, const int *bounding_box);
+@@ -581,12 +581,12 @@ copy_bytes(cups_file_t *fp, /* I - File
+ * On return, "line" will contain the next line in the file, if any.
+ */
+
+-static size_t /* O - Length of next line */
++static ssize_t /* O - Length of next line */
+ copy_comments(cups_file_t *fp, /* I - File to read from */
+ pstops_doc_t *doc, /* I - Document info */
+ ppd_file_t *ppd, /* I - PPD file */
+ char *line, /* I - Line buffer */
+- size_t linelen, /* I - Length of initial line */
++ ssize_t linelen, /* I - Length of initial line */
+ size_t linesize) /* I - Size of line buffer */
+ {
+ int saw_bounding_box, /* Saw %%BoundingBox: comment? */
+@@ -809,7 +809,7 @@ copy_dsc(cups_file_t *fp, /* I - File
+ pstops_doc_t *doc, /* I - Document info */
+ ppd_file_t *ppd, /* I - PPD file */
+ char *line, /* I - Line buffer */
+- size_t linelen, /* I - Length of initial line */
++ ssize_t linelen, /* I - Length of initial line */
+ size_t linesize) /* I - Size of line buffer */
+ {
+ int number; /* Page number */
+@@ -889,7 +889,8 @@ copy_dsc(cups_file_t *fp, /* I - File
+ * Finish up the last page(s)...
+ */
+
+- if (number && !is_first_page(number) && cupsArrayLast(doc->pages))
++ if (number && is_not_last_page(number) && cupsArrayLast(doc->pages) &&
++ check_range(doc, (number - 1) / doc->number_up + 1))
+ {
+ pageinfo = (pstops_page_t *)cupsArrayLast(doc->pages);
+
+@@ -930,7 +931,7 @@ copy_dsc(cups_file_t *fp, /* I - File
+
+ number = doc->slow_order ? 0 : doc->page;
+
+- if (doc->temp && !JobCanceled)
++ if (doc->temp && !JobCanceled && cupsArrayCount(doc->pages) > 0)
+ {
+ int copy; /* Current copy */
+
+@@ -1068,7 +1069,7 @@ copy_non_dsc(cups_file_t *fp, /* I - F
+ pstops_doc_t *doc, /* I - Document info */
+ ppd_file_t *ppd, /* I - PPD file */
+ char *line, /* I - Line buffer */
+- size_t linelen, /* I - Length of initial line */
++ ssize_t linelen, /* I - Length of initial line */
+ size_t linesize) /* I - Size of line buffer */
+ {
+ int copy; /* Current copy */
+@@ -1244,13 +1245,13 @@ copy_non_dsc(cups_file_t *fp, /* I - F
+ * On return, "line" will contain the next line in the file, if any.
+ */
+
+-static size_t /* O - Length of next line */
++static ssize_t /* O - Length of next line */
+ copy_page(cups_file_t *fp, /* I - File to read from */
+ pstops_doc_t *doc, /* I - Document info */
+ ppd_file_t *ppd, /* I - PPD file */
+ int number, /* I - Current page number */
+ char *line, /* I - Line buffer */
+- size_t linelen, /* I - Length of initial line */
++ ssize_t linelen, /* I - Length of initial line */
+ size_t linesize) /* I - Size of line buffer */
+ {
+ char label[256], /* Page label string */
+@@ -1713,12 +1714,12 @@ copy_page(cups_file_t *fp, /* I - File
+ * On return, "line" will contain the next line in the file, if any.
+ */
+
+-static size_t /* O - Length of next line */
++static ssize_t /* O - Length of next line */
+ copy_prolog(cups_file_t *fp, /* I - File to read from */
+ pstops_doc_t *doc, /* I - Document info */
+ ppd_file_t *ppd, /* I - PPD file */
+ char *line, /* I - Line buffer */
+- size_t linelen, /* I - Length of initial line */
++ ssize_t linelen, /* I - Length of initial line */
+ size_t linesize) /* I - Size of line buffer */
+ {
+ while (strncmp(line, "%%BeginProlog", 13))
+@@ -1767,12 +1768,12 @@ copy_prolog(cups_file_t *fp, /* I - Fi
+ * On return, "line" will contain the next line in the file, if any.
+ */
+
+-static size_t /* O - Length of next line */
++static ssize_t /* O - Length of next line */
+ copy_setup(cups_file_t *fp, /* I - File to read from */
+ pstops_doc_t *doc, /* I - Document info */
+ ppd_file_t *ppd, /* I - PPD file */
+ char *line, /* I - Line buffer */
+- size_t linelen, /* I - Length of initial line */
++ ssize_t linelen, /* I - Length of initial line */
+ size_t linesize) /* I - Size of line buffer */
+ {
+ while (strncmp(line, "%%BeginSetup", 12))
+@@ -1832,13 +1833,13 @@ copy_setup(cups_file_t *fp, /* I - Fil
+ * On return, "line" will contain the next line in the file, if any.
+ */
+
+-static size_t /* O - Length of next line */
++static ssize_t /* O - Length of next line */
+ copy_trailer(cups_file_t *fp, /* I - File to read from */
+ pstops_doc_t *doc, /* I - Document info */
+ ppd_file_t *ppd, /* I - PPD file */
+ int number, /* I - Number of pages */
+ char *line, /* I - Line buffer */
+- size_t linelen, /* I - Length of initial line */
++ ssize_t linelen, /* I - Length of initial line */
+ size_t linesize) /* I - Size of line buffer */
+ {
+ /*
+@@ -2711,10 +2712,10 @@ set_pstops_options(
+ * 'skip_page()' - Skip past a page that won't be printed...
+ */
+
+-static size_t /* O - Length of next line */
++static ssize_t /* O - Length of next line */
+ skip_page(cups_file_t *fp, /* I - File to read from */
+ char *line, /* I - Line buffer */
+- size_t linelen, /* I - Length of initial line */
++ ssize_t linelen, /* I - Length of initial line */
+ size_t linesize) /* I - Size of line buffer */
+ {
+ int level; /* Embedded document level */
+diff -up cups-1.3.5/filter/image-photocd.c.1.3.x cups-1.3.5/filter/image-photocd.c
+--- cups-1.3.5/filter/image-photocd.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/image-photocd.c 2008-02-05 15:08:55.000000000 +0000
+@@ -7,7 +7,7 @@
+ * is only YCC encoded. Support for the higher resolution images will
+ * require a lot of extra code...
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -99,11 +99,33 @@ _cupsImageReadPhotoCD(
+ cupsImageSetMaxTiles(img, 0);
+
+ bpp = cupsImageGetDepth(img);
+- in = malloc(768 * 3);
+- out = malloc(768 * bpp);
++
++ if ((in = malloc(768 * 3)) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ fclose(fp);
++ return (1);
++ }
++
++ if ((out = malloc(768 * bpp)) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ fclose(fp);
++ free(in);
++ return (1);
++ }
+
+ if (bpp > 1)
+- rgb = malloc(768 * 3);
++ {
++ if ((rgb = malloc(768 * 3)) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ fclose(fp);
++ free(in);
++ free(out);
++ return (1);
++ }
++ }
+ else
+ rgb = NULL;
+
+@@ -141,6 +163,9 @@ _cupsImageReadPhotoCD(
+ free(in);
+ free(out);
+
++ if (bpp > 1)
++ free(rgb);
++
+ return (-1);
+ }
+
+diff -up cups-1.3.5/filter/image-sgilib.c.1.3.x cups-1.3.5/filter/image-sgilib.c
+--- cups-1.3.5/filter/image-sgilib.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/image-sgilib.c 2008-02-05 15:08:55.000000000 +0000
+@@ -4,7 +4,7 @@
+ * SGI image file format library routines for the Common UNIX Printing
+ * System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2005 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -250,8 +250,20 @@ sgiOpenFile(FILE *file, /* I - File to
+
+ fseek(sgip->file, 512, SEEK_SET);
+
+- sgip->table = calloc(sgip->zsize, sizeof(long *));
+- sgip->table[0] = calloc(sgip->ysize * sgip->zsize, sizeof(long));
++ if ((sgip->table = calloc(sgip->zsize, sizeof(long *))) == NULL)
++ {
++ free(sgip);
++ return (NULL);
++ }
++
++ if ((sgip->table[0] = calloc(sgip->ysize * sgip->zsize,
++ sizeof(long))) == NULL)
++ {
++ free(sgip->table);
++ free(sgip);
++ return (NULL);
++ }
++
+ for (i = 1; i < sgip->zsize; i ++)
+ sgip->table[i] = sgip->table[0] + i * sgip->ysize;
+
+@@ -333,12 +345,39 @@ sgiOpenFile(FILE *file, /* I - File to
+
+ sgip->firstrow = ftell(sgip->file);
+ sgip->nextrow = ftell(sgip->file);
+- sgip->table = calloc(sgip->zsize, sizeof(long *));
+- sgip->table[0] = calloc(sgip->ysize * sgip->zsize, sizeof(long));
++ if ((sgip->table = calloc(sgip->zsize, sizeof(long *))) == NULL)
++ {
++ free(sgip);
++ return (NULL);
++ }
++
++ if ((sgip->table[0] = calloc(sgip->ysize * sgip->zsize,
++ sizeof(long))) == NULL)
++ {
++ free(sgip->table);
++ free(sgip);
++ return (NULL);
++ }
++
+ for (i = 1; i < sgip->zsize; i ++)
+ sgip->table[i] = sgip->table[0] + i * sgip->ysize;
+- sgip->length = calloc(sgip->zsize, sizeof(long *));
+- sgip->length[0] = calloc(sgip->ysize * sgip->zsize, sizeof(long));
++
++ if ((sgip->length = calloc(sgip->zsize, sizeof(long *))) == NULL)
++ {
++ free(sgip->table);
++ free(sgip);
++ return (NULL);
++ }
++
++ if ((sgip->length[0] = calloc(sgip->ysize * sgip->zsize,
++ sizeof(long))) == NULL)
++ {
++ free(sgip->length);
++ free(sgip->table);
++ free(sgip);
++ return (NULL);
++ }
++
+ for (i = 1; i < sgip->zsize; i ++)
+ sgip->length[i] = sgip->length[0] + i * sgip->ysize;
+ break;
+diff -up cups-1.3.5/filter/interpret.c.1.3.x cups-1.3.5/filter/interpret.c
+--- cups-1.3.5/filter/interpret.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/interpret.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * PPD command interpreter for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -571,7 +571,7 @@ _cupsRasterExecPS(
+ break;
+ }
+
+- if (obj->type == CUPS_PS_OTHER)
++ if (obj && obj->type == CUPS_PS_OTHER)
+ break;
+ }
+
+diff -up cups-1.3.5/filter/image-sun.c.1.3.x cups-1.3.5/filter/image-sun.c
+--- cups-1.3.5/filter/image-sun.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/image-sun.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Sun Raster image file routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -152,9 +152,32 @@ _cupsImageReadSunRaster(
+ in = malloc(img->xsize * 3 + 1);
+ }
+
+- bpp = cupsImageGetDepth(img);
+- out = malloc(img->xsize * bpp);
+- scanline = malloc(scanwidth);
++ if (!in)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ fclose(fp);
++ return (1);
++ }
++
++ bpp = cupsImageGetDepth(img);
++
++ if ((out = malloc(img->xsize * bpp)) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ fclose(fp);
++ free(in);
++ return (1);
++ }
++
++ if ((scanline = malloc(scanwidth)) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ fclose(fp);
++ free(in);
++ free(out);
++ return (1);
++ }
++
+ run_count = 0;
+ run_value = 0;
+
+diff -up cups-1.3.5/filter/rastertoepson.c.1.3.x cups-1.3.5/filter/rastertoepson.c
+--- cups-1.3.5/filter/rastertoepson.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/rastertoepson.c 2008-02-05 15:08:55.000000000 +0000
+@@ -4,7 +4,7 @@
+ * EPSON ESC/P and ESC/P2 filter for the Common UNIX Printing System
+ * (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -153,7 +153,7 @@ StartPage(const ppd_file_t *ppd,
+ * Send a reset sequence.
+ */
+
+- if (ppd->nickname && strstr(ppd->nickname, "OKIDATA") != NULL)
++ if (ppd && ppd->nickname && strstr(ppd->nickname, "OKIDATA") != NULL)
+ printf("\033{A"); /* Set EPSON emulation mode */
+
+ printf("\033@");
+@@ -164,7 +164,7 @@ StartPage(const ppd_file_t *ppd,
+
+ EjectPage = header->Margins[0] || header->Margins[1];
+
+- switch (ppd->model_number)
++ switch (Model)
+ {
+ case EPSON_9PIN :
+ case EPSON_24PIN :
+@@ -196,7 +196,7 @@ StartPage(const ppd_file_t *ppd,
+ DotColumns = header->HWResolution[0] / 60;
+ Shingling = 0;
+
+- if (ppd->model_number == EPSON_9PIN)
++ if (Model == EPSON_9PIN)
+ printf("\033\063\030"); /* Set line feed */
+ else
+ switch (header->HWResolution[0])
+@@ -251,8 +251,11 @@ StartPage(const ppd_file_t *ppd,
+ putchar(n);
+ putchar(n >> 8);
+
+- t = (ppd->sizes[1].length - ppd->sizes[1].top) *
+- header->HWResolution[1] / 72.0;
++ if (ppd)
++ t = (ppd->sizes[1].length - ppd->sizes[1].top) *
++ header->HWResolution[1] / 72.0;
++ else
++ t = 0;
+
+ pwrite("\033(c\004\000", 5); /* Top & bottom margins */
+ putchar(t);
+@@ -293,18 +296,35 @@ StartPage(const ppd_file_t *ppd,
+ * Allocate memory for a line/row of graphics...
+ */
+
+- Planes[0] = malloc(header->cupsBytesPerLine);
++ if ((Planes[0] = malloc(header->cupsBytesPerLine)) == NULL)
++ {
++ fputs("ERROR: Unable to allocate memory!\n", stderr);
++ exit(1);
++ }
++
+ for (plane = 1; plane < NumPlanes; plane ++)
+ Planes[plane] = Planes[0] + plane * header->cupsBytesPerLine / NumPlanes;
+
+ if (header->cupsCompression || DotBytes)
+- CompBuffer = calloc(2, header->cupsWidth);
++ {
++ if ((CompBuffer = calloc(2, header->cupsWidth)) == NULL)
++ {
++ fputs("ERROR: Unable to allocate memory!\n", stderr);
++ exit(1);
++ }
++ }
+ else
+ CompBuffer = NULL;
+
+ if (DotBytes)
+ {
+- LineBuffers[0] = calloc(DotBytes, header->cupsWidth * (Shingling + 1));
++ if ((LineBuffers[0] = calloc(DotBytes,
++ header->cupsWidth * (Shingling + 1))) == NULL)
++ {
++ fputs("ERROR: Unable to allocate memory!\n", stderr);
++ exit(1);
++ }
++
+ LineBuffers[1] = LineBuffers[0] + DotBytes * header->cupsWidth;
+ DotBit = 128;
+ LineCount = 0;
+diff -up cups-1.3.5/filter/image-sgi.c.1.3.x cups-1.3.5/filter/image-sgi.c
+--- cups-1.3.5/filter/image-sgi.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/image-sgi.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * SGI image file routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -77,7 +77,6 @@ _cupsImageReadSGI(
+ fprintf(stderr, "DEBUG: Bad SGI image dimensions %ux%ux%u!\n",
+ sgip->xsize, sgip->ysize, sgip->zsize);
+ sgiClose(sgip);
+- fclose(fp);
+ return (1);
+ }
+
+@@ -92,10 +91,32 @@ _cupsImageReadSGI(
+ cupsImageSetMaxTiles(img, 0);
+
+ bpp = cupsImageGetDepth(img);
+- in = malloc(img->xsize * sgip->zsize);
+- out = malloc(img->xsize * bpp);
+
+- rows[0] = calloc(img->xsize * sgip->zsize, sizeof(unsigned short));
++ if ((in = malloc(img->xsize * sgip->zsize)) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ sgiClose(sgip);
++ return (1);
++ }
++
++ if ((out = malloc(img->xsize * bpp)) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ sgiClose(sgip);
++ free(in);
++ return (1);
++ }
++
++ if ((rows[0] = calloc(img->xsize * sgip->zsize,
++ sizeof(unsigned short))) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ sgiClose(sgip);
++ free(in);
++ free(out);
++ return (1);
++ }
++
+ for (i = 1; i < sgip->zsize; i ++)
+ rows[i] = rows[0] + i * img->xsize;
+
+diff -up cups-1.3.5/filter/image-pnm.c.1.3.x cups-1.3.5/filter/image-pnm.c
+--- cups-1.3.5/filter/image-pnm.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/image-pnm.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Portable Any Map file routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -67,7 +67,13 @@ _cupsImageReadPNM(
+ * max sample
+ */
+
+- lineptr = fgets(line, sizeof(line), fp);
++ if ((lineptr = fgets(line, sizeof(line), fp)) == NULL)
++ {
++ fputs("DEBUG: Bad PNM header!\n", stderr);
++ fclose(fp);
++ return (1);
++ }
++
+ lineptr ++;
+
+ format = atoi(lineptr);
+@@ -147,8 +153,21 @@ _cupsImageReadPNM(
+ cupsImageSetMaxTiles(img, 0);
+
+ bpp = cupsImageGetDepth(img);
+- in = malloc(img->xsize * 3);
+- out = malloc(img->xsize * bpp);
++
++ if ((in = malloc(img->xsize * 3)) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ fclose(fp);
++ return (1);
++ }
++
++ if ((out = malloc(img->xsize * bpp)) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ fclose(fp);
++ free(in);
++ return (1);
++ }
+
+ /*
+ * Read the image file...
+diff -up cups-1.3.5/filter/hpgl-input.c.1.3.x cups-1.3.5/filter/hpgl-input.c
+--- cups-1.3.5/filter/hpgl-input.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/hpgl-input.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * HP-GL/2 input processing for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -48,6 +48,7 @@ ParseCommand(FILE *fp, /* I - File to
+ i; /* Looping var */
+ char buf[262144], /* String buffer */
+ *bufptr; /* Pointer into buffer */
++ float temp; /* Temporary parameter value */
+ static param_t p[MAX_PARAMS]; /* Parameter buffer */
+
+
+@@ -212,10 +213,10 @@ ParseCommand(FILE *fp, /* I - File to
+ case '-' :
+ case '+' :
+ ungetc(ch, fp);
+- fscanf(fp, "%f", &(p[num_params].value.number));
+- if (num_params < MAX_PARAMS)
++ if (fscanf(fp, "%f", &temp) == 1 && num_params < MAX_PARAMS)
+ {
+- p[num_params].type = PARAM_RELATIVE;
++ p[num_params].type = PARAM_RELATIVE;
++ p[num_params].value.number = temp;
+ num_params ++;
+ }
+ break;
+@@ -231,10 +232,10 @@ ParseCommand(FILE *fp, /* I - File to
+ case '9' :
+ case '.' :
+ ungetc(ch, fp);
+- fscanf(fp, "%f", &(p[num_params].value.number));
+- if (num_params < MAX_PARAMS)
++ if (fscanf(fp, "%f", &temp) == 1 && num_params < MAX_PARAMS)
+ {
+- p[num_params].type = PARAM_ABSOLUTE;
++ p[num_params].type = PARAM_ABSOLUTE;
++ p[num_params].value.number = temp;
+ num_params ++;
+ }
+ break;
+diff -up cups-1.3.5/filter/image-bmp.c.1.3.x cups-1.3.5/filter/image-bmp.c
+--- cups-1.3.5/filter/image-bmp.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/image-bmp.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * BMP image routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -179,9 +179,22 @@ _cupsImageReadBMP(
+
+ cupsImageSetMaxTiles(img, 0);
+
+- in = malloc(img->xsize * 3);
+ bpp = cupsImageGetDepth(img);
+- out = malloc(img->xsize * bpp);
++
++ if ((in = malloc(img->xsize * 3)) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ fclose(fp);
++ return (1);
++ }
++
++ if ((out = malloc(img->xsize * bpp)) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ free(in);
++ fclose(fp);
++ return (1);
++ }
+
+ /*
+ * Read the image data...
+diff -up cups-1.3.5/filter/image-gif.c.1.3.x cups-1.3.5/filter/image-gif.c
+--- cups-1.3.5/filter/image-gif.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/image-gif.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * GIF image routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -462,8 +462,14 @@ gif_read_image(FILE *fp, /* I -
+ pass = 0;
+ code_size = getc(fp);
+
++ if (!pixels)
++ return (-1);
++
+ if (gif_read_lzw(fp, 1, code_size) < 0)
++ {
++ free(pixels);
+ return (-1);
++ }
+
+ temp = pixels;
+ while ((pixel = gif_read_lzw(fp, 0, code_size)) >= 0)
+diff -up cups-1.3.5/filter/image-pix.c.1.3.x cups-1.3.5/filter/image-pix.c
+--- cups-1.3.5/filter/image-pix.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/image-pix.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Alias PIX image routines for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -95,9 +95,22 @@ _cupsImageReadPIX(
+
+ cupsImageSetMaxTiles(img, 0);
+
+- in = malloc(img->xsize * (depth / 8));
+ bpp = cupsImageGetDepth(img);
+- out = malloc(img->xsize * bpp);
++
++ if ((in = malloc(img->xsize * (depth / 8))) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ fclose(fp);
++ return (1);
++ }
++
++ if ((out = malloc(img->xsize * bpp)) == NULL)
++ {
++ fputs("DEBUG: Unable to allocate memory!\n", stderr);
++ fclose(fp);
++ free(in);
++ return (1);
++ }
+
+ /*
+ * Read the image data...
+diff -up cups-1.3.5/filter/image.c.1.3.x cups-1.3.5/filter/image.c
+--- cups-1.3.5/filter/image.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/image.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Base image support for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2005 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -320,15 +320,10 @@ cupsImageOpen(
+ */
+
+ if ((fp = fopen(filename, "r")) == NULL)
+- {
+-/* perror("ERROR: Unable to open image file");
+-*/ return (NULL);
+- }
++ return (NULL);
+
+ if (fread(header, 1, sizeof(header), fp) == 0)
+ {
+-/* perror("ERROR: Unable to read image file header");
+-*/
+ fclose(fp);
+ return (NULL);
+ }
+@@ -346,8 +341,7 @@ cupsImageOpen(
+
+ if (img == NULL)
+ {
+-/* perror("ERROR: Unable to allocate memory for image file");
+-*/ fclose(fp);
++ fclose(fp);
+ return (NULL);
+ }
+
+@@ -401,8 +395,7 @@ cupsImageOpen(
+ #endif /* HAVE_LIBTIFF */
+ else
+ {
+-/* fputs("ERROR: Unknown image file format!");
+-*/ fclose(fp);
++ fclose(fp);
+ status = -1;
+ }
+
+@@ -729,8 +722,11 @@ get_tile(cups_image_t *img, /* I - Imag
+
+ DEBUG_printf(("Creating tile array (%dx%d)\n", xtiles, ytiles));
+
+- img->tiles = calloc(sizeof(cups_itile_t *), ytiles);
+- tile = calloc(sizeof(cups_itile_t), xtiles * ytiles);
++ if ((img->tiles = calloc(sizeof(cups_itile_t *), ytiles)) == NULL)
++ return (NULL);
++
++ if ((tile = calloc(sizeof(cups_itile_t), xtiles * ytiles)) == NULL)
++ return (NULL);
+
+ for (tiley = 0; tiley < ytiles; tiley ++)
+ {
+@@ -751,13 +747,23 @@ get_tile(cups_image_t *img, /* I - Imag
+ {
+ if (img->num_ics < img->max_ics)
+ {
+- ic = calloc(sizeof(cups_ic_t) + bpp * CUPS_TILE_SIZE *
+- CUPS_TILE_SIZE, 1);
+- ic->pixels = ((cups_ib_t *)ic) + sizeof(cups_ic_t);
++ if ((ic = calloc(sizeof(cups_ic_t) +
++ bpp * CUPS_TILE_SIZE * CUPS_TILE_SIZE, 1)) == NULL)
++ {
++ if (img->num_ics == 0)
++ return (NULL);
++
++ flush_tile(img);
++ ic = img->first;
++ }
++ else
++ {
++ ic->pixels = ((cups_ib_t *)ic) + sizeof(cups_ic_t);
+
+- img->num_ics ++;
++ img->num_ics ++;
+
+- DEBUG_printf(("Allocated cache tile %d (%p)...\n", img->num_ics, ic));
++ DEBUG_printf(("Allocated cache tile %d (%p)...\n", img->num_ics, ic));
++ }
+ }
+ else
+ {
+diff -up cups-1.3.5/filter/rastertohp.c.1.3.x cups-1.3.5/filter/rastertohp.c
+--- cups-1.3.5/filter/rastertohp.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/filter/rastertohp.c 2008-02-05 15:08:55.000000000 +0000
+@@ -4,7 +4,7 @@
+ * Hewlett-Packard Page Control Language filter for the Common UNIX
+ * Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -277,7 +277,7 @@ StartPage(ppd_file_t *ppd, /* I
+ * Set graphics mode...
+ */
+
+- if (ppd->model_number == 2)
++ if (ppd && ppd->model_number == 2)
+ {
+ /*
+ * Figure out the number of color planes...
+@@ -382,7 +382,12 @@ StartPage(ppd_file_t *ppd, /* I
+ * Allocate memory for a line of graphics...
+ */
+
+- Planes[0] = malloc(header->cupsBytesPerLine);
++ if ((Planes[0] = malloc(header->cupsBytesPerLine)) == NULL)
++ {
++ fputs("ERROR: Unable to allocate memory!\n", stderr);
++ exit(1);
++ }
++
+ for (plane = 1; plane < NumPlanes; plane ++)
+ Planes[plane] = Planes[0] + plane * header->cupsBytesPerLine / NumPlanes;
+
+diff -up cups-1.3.5/config.h.in.1.3.x cups-1.3.5/config.h.in
+--- cups-1.3.5/config.h.in.1.3.x 2007-08-29 18:22:26.000000000 +0100
++++ cups-1.3.5/config.h.in 2008-02-05 15:08:55.000000000 +0000
+@@ -77,13 +77,6 @@
+
+
+ /*
+- * Maximum number of file descriptors to support.
+- */
+-
+-#define CUPS_MAX_FDS 4096
+-
+-
+-/*
+ * Do we have domain socket support?
+ */
+
+@@ -446,13 +439,6 @@
+
+
+ /*
+- * Do we have CFLocaleCreateCanonicalLocaleIdentifierFromString()?
+- */
+-
+-#undef HAVE_CF_LOCALE_ID
+-
+-
+-/*
+ * Do we have MacOSX 10.4's mbr_XXX functions()?
+ */
+
+diff -up cups-1.3.5/Makedefs.in.1.3.x cups-1.3.5/Makedefs.in
+--- cups-1.3.5/Makedefs.in.1.3.x 2007-10-10 23:50:07.000000000 +0100
++++ cups-1.3.5/Makedefs.in 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ #
+ # Common makefile definitions for the Common UNIX Printing System (CUPS).
+ #
+-# Copyright 2007 by Apple Inc.
++# Copyright 2007-2008 by Apple Inc.
+ # Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ #
+ # These coded instructions, statements, and computer programs are the
+@@ -108,17 +108,17 @@ INSTALLSTATIC = @INSTALLSTATIC@
+ # for extra debug info)
+ #
+
+-ALL_CFLAGS = $(CFLAGS) $(SSLFLAGS) @LARGEFILE@ @PTHREAD_FLAGS@ \
+- $(OPTIONS)
++ALL_CFLAGS = -I.. -D_CUPS_SOURCE $(CFLAGS) $(SSLFLAGS) \
++ @LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS)
++ALL_CXXFLAGS = -I.. -D_CUPS_SOURCE $(CXXFLAGS) $(SSLFLAGS) \
++ @LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS)
+ ARCHFLAGS = @ARCHFLAGS@
+ ARFLAGS = @ARFLAGS@
+ BACKLIBS = @BACKLIBS@
+-CFLAGS = -I.. @CPPFLAGS@ @CFLAGS@ \
+- @LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS)
++CFLAGS = @CPPFLAGS@ @CFLAGS@
+ COMMONLIBS = @LIBS@
+ CUPSDLIBS = @CUPSDLIBS@
+-CXXFLAGS = -I.. $(SSLFLAGS) @CPPFLAGS@ @CXXFLAGS@ \
+- @LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS)
++CXXFLAGS = @CPPFLAGS@ @CXXFLAGS@
+ CXXLIBS = @CXXLIBS@
+ DSOFLAGS = @DSOFLAGS@
+ DSOLIBS = @DSOLIBS@ $(COMMONLIBS)
+@@ -258,7 +258,7 @@ DBUSDIR = @DBUSDIR@
+
+ .cxx.o:
+ echo Compiling $<...
+- $(CXX) $(ARCHFLAGS) $(OPTIM) $(CXXFLAGS) -c $<
++ $(CXX) $(ARCHFLAGS) $(OPTIM) $(ALL_CXXFLAGS) -c $<
+
+ .man.1 .man.1m .man.5 .man.7 .man.8:
+ echo Linking $<...
+diff -up cups-1.3.5/doc/index.html.in.1.3.x cups-1.3.5/doc/index.html.in
+--- cups-1.3.5/doc/index.html.in.1.3.x 2007-12-07 18:37:40.000000000 +0000
++++ cups-1.3.5/doc/index.html.in 2008-02-05 15:08:55.000000000 +0000
+@@ -112,9 +112,9 @@ assistance:
+ WIDTH="15" HEIGHT="15" ALT="">
+
+
+- The Common UNIX Printing System, CUPS, and the CUPS logo are the
+-trademark property of Apple Inc.
+-CUPS is copyright 2007 by Apple Inc., All Rights Reserved.
++The Common UNIX Printing System, CUPS, and the CUPS logo are
++trademarks of Apple Inc. CUPS is
++copyright 2007-2008 Apple Inc. All rights reserved.
+
+ |
+
+diff -up cups-1.3.5/doc/help/spec-ppd.html.1.3.x cups-1.3.5/doc/help/spec-ppd.html
+--- cups-1.3.5/doc/help/spec-ppd.html.1.3.x 2007-10-31 18:35:56.000000000 +0000
++++ cups-1.3.5/doc/help/spec-ppd.html 2008-02-05 15:08:55.000000000 +0000
+@@ -1204,7 +1204,7 @@ list of locale names ("en", "en_US", "fr
+
+
+ *% Specify Canadian, UK, and US English, and Candian and French French
+-*cupsLanguages: "en_CA en_UK en_US fr_CA fr_CA"
++*cupsLanguages: "en_CA en_UK en_US fr_CA fr_FR"
+
+
+
+diff -up cups-1.3.5/doc/help/spec-ipp.html.1.3.x cups-1.3.5/doc/help/spec-ipp.html
+--- cups-1.3.5/doc/help/spec-ipp.html.1.3.x 2007-07-12 23:58:17.000000000 +0100
++++ cups-1.3.5/doc/help/spec-ipp.html 2008-02-05 15:08:55.000000000 +0000
+@@ -11,7 +11,7 @@
+
+ CUPS IPP specification for the Common UNIX Printing System (CUPS).
+
+- Copyright 2007 by Apple Inc.
++ Copyright 2007-2008 by Apple Inc.
+ Copyright 1997-2007 by Easy Software Products.
+
+ These coded instructions, statements, and computer programs are the
+@@ -2251,6 +2251,101 @@ the system.
+ The job-sheets-supported attribute specifies the available banner files.
+ There will always be at least one banner file available called "none".
+
++
++
++The marker-change-time attribute specifies the printer-up-time value when
++the last change to the marker-colors, marker-levels, marker-names, or
++marker-types attributes was made.
++
++
++
++The marker-colors attribute specifies the color(s) for each supply in the
++printer. It is only available when the driver provides supply levels. The
++color is either "none" or one or more hex-encoded sRGB colors of the form
++"#RRGGBB".
++
++
++
++The marker-levels attribute specifies the current supply levels for the
++printer. It is only available when the driver provides supply levels. A
++value of -1 indicates the level is unknown, while values from 0 to 100
++indicate the corresponding percentage.
++
++
++
++The marker-names attribute specifies the name(s) for each supply in the
++printer. It is only available when the driver provides supply levels.
++
++
++
++The marker-types attribute specifies the type(s) of each supply in the
++printer. It is only available when the driver provides supply levels. The
++following (RFC 3805) types are currently supported:
++
++
++
++ - toner
++
++ - wasteToner
++
++ - ink
++
++ - inkCartridge
++
++ - inkRibbon
++
++ - wasteInk
++
++ - opc
++
++ - developer
++
++ - fuserOil
++
++ - solidWax
++
++ - ribbonWax
++
++ - wasteWax
++
++ - fuser
++
++ - coronaWire
++
++ - fuserOilWick
++
++ - cleanerUnit
++
++ - fuserCleaningPad
++
++ - transferUnit
++
++ - tonerCartridge
++
++ - fuserOiler
++
++ - water
++
++ - wasteWater
++
++ - bindingSupply
++
++ - bandingSupply
++
++ - stichingWire
++
++ - shrinkWrap
++
++ - paperWrap
++
++ - staples
++
++ - inserts
++
++ - covers
++
++
++
+
+
+ The port-monitor attribute specifies the port monitor to use when printing
+diff -up cups-1.3.5/systemv/cupstestppd.c.1.3.x cups-1.3.5/systemv/cupstestppd.c
+--- cups-1.3.5/systemv/cupstestppd.c.1.3.x 2007-11-27 00:09:24.000000000 +0000
++++ cups-1.3.5/systemv/cupstestppd.c 2008-02-05 15:08:55.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * PPD test program for the Common UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -2010,8 +2010,10 @@ check_translations(ppd_file_t *ppd, /* I
+ * This file contains localizations, check them...
+ */
+
+- languages = strdup(attr->value);
+- langlist = cupsArrayNew((cups_array_func_t)strcmp, NULL);
++ if ((languages = strdup(attr->value)) == NULL)
++ return (1);
++
++ langlist = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+
+ for (langptr = languages; *langptr;)
+ {
+diff -up cups-1.3.5/systemv/lpmove.c.1.3.x cups-1.3.5/systemv/lpmove.c
+--- cups-1.3.5/systemv/lpmove.c.1.3.x 2007-11-27 00:09:24.000000000 +0000
++++ cups-1.3.5/systemv/lpmove.c 2008-02-05 15:08:55.000000000 +0000
+@@ -61,7 +61,6 @@ main(int argc, /* I - Number of comm
+
+ dest = NULL;
+ dests = NULL;
+- http = NULL;
+ job = NULL;
+ jobid = 0;
+ num_dests = 0;
+@@ -75,8 +74,6 @@ main(int argc, /* I - Number of comm
+ #ifdef HAVE_SSL
+ cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
+
+- if (http)
+- httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
+ #else
+ _cupsLangPrintf(stderr,
+ _("%s: Sorry, no encryption support compiled in!\n"),
+@@ -85,12 +82,6 @@ main(int argc, /* I - Number of comm
+ break;
+
+ case 'h' : /* Connect to host */
+- if (http)
+- {
+- httpClose(http);
+- http = NULL;
+- }
+-
+ if (argv[i][2] != '\0')
+ cupsSetServer(argv[i] + 2);
+ else
+@@ -142,17 +133,14 @@ main(int argc, /* I - Number of comm
+ return (1);
+ }
+
+- if (!http)
+- {
+- http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
++ http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
+
+- if (http == NULL)
+- {
+- _cupsLangPrintf(stderr,
+- _("lpmove: Unable to connect to server: %s\n"),
+- strerror(errno));
+- return (1);
+- }
++ if (http == NULL)
++ {
++ _cupsLangPrintf(stderr,
++ _("lpmove: Unable to connect to server: %s\n"),
++ strerror(errno));
++ return (1);
+ }
+
+ return (move_job(http, src, jobid, dest));
+diff -up cups-1.3.5/systemv/accept.c.1.3.x cups-1.3.5/systemv/accept.c
+--- cups-1.3.5/systemv/accept.c.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/systemv/accept.c 2008-02-05 15:08:55.000000000 +0000
+@@ -4,7 +4,7 @@
+ * "accept", "disable", "enable", and "reject" commands for the Common
+ * UNIX Printing System (CUPS).
+ *
+- * Copyright 2007 by Apple Inc.
++ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+@@ -125,8 +125,11 @@ main(int argc, /* I - Number of comm
+ break;
+
+ case 'h' : /* Connect to host */
+- if (http != NULL)
++ if (http)
++ {
+ httpClose(http);
++ http = NULL;
++ }
+
+ if (argv[i][2] != '\0')
+ cupsSetServer(argv[i] + 2);
+diff -up cups-1.3.5/README.txt.1.3.x cups-1.3.5/README.txt
+--- cups-1.3.5/README.txt.1.3.x 2007-09-18 21:39:31.000000000 +0100
++++ cups-1.3.5/README.txt 2008-02-05 15:08:55.000000000 +0000
+@@ -1,4 +1,4 @@
+-README - CUPS v1.3.2 - 2007-09-18
++README - CUPS v1.3.6 - 2008-01-22
+ ---------------------------------
+
+ Looking for compile instructions? Read the file "INSTALL.txt"
+@@ -153,9 +153,9 @@ PRINTING FILES
+
+ LEGAL STUFF
+
+- CUPS is Copyright 2007 by Apple Inc. CUPS, the CUPS logo, and
+- the Common UNIX Printing System are the trademark property of
+- Apple Inc.
++ CUPS is Copyright 2007-2008 by Apple Inc. CUPS, the CUPS logo,
++ and the Common UNIX Printing System are the trademark property
++ of Apple Inc.
+
+ The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
+
+diff -up cups-1.3.5/data/testprint.ps.1.3.x cups-1.3.5/data/testprint.ps
+--- cups-1.3.5/data/testprint.ps.1.3.x 2007-07-11 22:46:42.000000000 +0100
++++ cups-1.3.5/data/testprint.ps 2008-02-05 15:08:55.000000000 +0000
+@@ -14,7 +14,7 @@
+ %
+ % PostScript test page for the Common UNIX Printing System ("CUPS").
+ %
+-% Copyright 2007 Apple Inc.
++% Copyright 2007-2008 Apple Inc.
+ % Copyright 1993-2007 Easy Software Products
+ %
+ % These coded instructions, statements, and computer programs are the
+@@ -573,10 +573,10 @@ gsave
+ pageHeight 8 mul % Move down...
+ 2 copy moveto % Position text
+ smallFont setfont % Font
+- (Copyright 2007 Apple Inc., All Rights Reserved. CUPS and the CUPS logo are the trademark) show
++ (Copyright 2007-2008 Apple Inc., All Rights Reserved. CUPS and the CUPS logo are the) show
+ pageHeight 2 add sub % Move down...
+ 2 copy moveto % Position text
+- (property of Apple Inc., 1 Infinite Loop, Cupertino, CA 95014, USA.) show
++ (trademark property of Apple Inc., 1 Infinite Loop, Cupertino, CA 95014, USA.) show
+ pageHeight 2 mul 4 add sub % Move down...
+ moveto % Position text
+ (Need help? Contact your operating system vendor or visit "http://www.cups.org/".) show
diff --git a/cups-lspp.patch b/cups-lspp.patch
index 2d7edba..e699817 100644
--- a/cups-lspp.patch
+++ b/cups-lspp.patch
@@ -1297,7 +1297,7 @@
+ {
+ if (getfilecon(con->filename, &spoolcon) == -1)
+ {
-+ cupsdSendError(con, HTTP_SERVER_ERROR, AUTH_NONE);
++ cupsdSendError(con, HTTP_SERVER_ERROR, CUPSD_AUTH_NONE);
+ return (cupsdCloseClient(con));
+ }
+ clicon = context_new(con->scon);
@@ -1305,7 +1305,7 @@
+ freecon(spoolcon);
+ if (!clicon || !tmpcon)
+ {
-+ cupsdSendError(con, HTTP_SERVER_ERROR, AUTH_NONE);
++ cupsdSendError(con, HTTP_SERVER_ERROR, CUPSD_AUTH_NONE);
+ if (clicon)
+ context_free(clicon);
+ if (tmpcon)
@@ -1320,7 +1320,7 @@
+ {
+ if (context_range_set(tmpcon, cliclearance) == -1)
+ {
-+ cupsdSendError(con, HTTP_SERVER_ERROR, AUTH_NONE);
++ cupsdSendError(con, HTTP_SERVER_ERROR, CUPSD_AUTH_NONE);
+ free(clirange);
+ context_free(tmpcon);
+ context_free(clicon);
@@ -1331,7 +1331,7 @@
+ {
+ if (context_range_set(tmpcon, (context_range_get(clicon))) == -1)
+ {
-+ cupsdSendError(con, HTTP_SERVER_ERROR, AUTH_NONE);
++ cupsdSendError(con, HTTP_SERVER_ERROR, CUPSD_AUTH_NONE);
+ free(clirange);
+ context_free(tmpcon);
+ context_free(clicon);
@@ -1342,7 +1342,7 @@
+ }
+ if (setfilecon(con->filename, context_str(tmpcon)) == -1)
+ {
-+ cupsdSendError(con, HTTP_SERVER_ERROR, AUTH_NONE);
++ cupsdSendError(con, HTTP_SERVER_ERROR, CUPSD_AUTH_NONE);
+ context_free(tmpcon);
+ context_free(clicon);
+ return (cupsdCloseClient(con));
diff --git a/cups-str2650.patch b/cups-str2650.patch
deleted file mode 100644
index 695806c..0000000
--- a/cups-str2650.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-diff -up cups-1.3.5/cups/adminutil.c.str2650 cups-1.3.5/cups/adminutil.c
---- cups-1.3.5/cups/adminutil.c.str2650 2007-11-30 07:00:59.000000000 +0000
-+++ cups-1.3.5/cups/adminutil.c 2008-01-09 12:14:45.000000000 +0000
-@@ -1057,7 +1057,7 @@ _cupsAdminGetServerSettings(
- in_admin_location = 0;
- in_location = 0;
- }
-- else if (!strcasecmp(line, "Allow") && in_admin_location &&
-+ else if (!strcasecmp(line, "Allow") &&
- strcasecmp(value, "localhost") && strcasecmp(value, "127.0.0.1")
- #ifdef AF_LOCAL
- && *value != '/'
-@@ -1067,9 +1067,9 @@ _cupsAdminGetServerSettings(
- #endif /* AF_INET6 */
- )
- {
-- remote_admin = 1;
--
-- if (!strcasecmp(value, "all"))
-+ if (in_admin_location)
-+ remote_admin = 1;
-+ else if (!strcasecmp(value, "all"))
- remote_any = 1;
- }
- else if (line[0] != '<' && !in_location && !in_policy)
diff --git a/cups-str2664.patch b/cups-str2664.patch
deleted file mode 100644
index 8ca7ee9..0000000
--- a/cups-str2664.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up cups-1.3.5/backend/runloop.c~ cups-1.3.5/backend/runloop.c
---- cups-1.3.5/backend/runloop.c~ 2007-08-22 19:34:34.000000000 +0100
-+++ cups-1.3.5/backend/runloop.c 2008-01-09 15:37:44.000000000 +0000
-@@ -216,7 +216,7 @@ backendRunLoop(
- FD_SET(CUPS_SC_FD, &input);
-
- FD_ZERO(&output);
-- if (print_bytes || !use_bc)
-+ if (print_bytes || (!use_bc && !side_cb))
- FD_SET(device_fd, &output);
-
- if (use_bc || side_cb)
diff --git a/cups.spec b/cups.spec
index 11b9c19..92adbf1 100644
--- a/cups.spec
+++ b/cups.spec
@@ -6,7 +6,7 @@
Summary: Common Unix Printing System
Name: cups
Version: 1.3.5
-Release: 3%{?dist}
+Release: 4%{?dist}
License: GPLv2
Group: System Environment/Daemons
Source: ftp://ftp.easysw.com/pub/cups/test//cups-%{version}-source.tar.bz2
@@ -24,6 +24,7 @@ Source12: cups.cron
Source13: pdftops.conf
Source14: textonly.filter
Source15: textonly.ppd
+Patch0: cups-1.3.x.patch
Patch1: cups-1.1.15-initscript.patch
Patch2: cups-no-gzip-man.patch
Patch3: cups-1.1.16-system-auth.patch
@@ -40,12 +41,10 @@ Patch13: cups-direct-usb.patch
Patch14: cups-lpr-help.patch
Patch16: cups-pid.patch
Patch17: cups-foomatic-recommended.patch
-Patch18: cups-str2650.patch
Patch19: cups-eggcups.patch
Patch20: cups-getpass.patch
Patch21: cups-driverd-timeout.patch
Patch22: cups-strict-ppd-line-length.patch
-Patch23: cups-str2664.patch
Patch25: cups-usb-paperout.patch
Patch100: cups-lspp.patch
Epoch: 1
@@ -138,6 +137,7 @@ lpd emulation.
%prep
%setup -q -n %{name}-%{version}
+%patch0 -p1 -b .1.3.x
%patch1 -p1 -b .noinit
%patch2 -p1 -b .no-gzip-man
%patch3 -p1 -b .system-auth
@@ -154,12 +154,10 @@ lpd emulation.
%patch14 -p1 -b .lpr-help
%patch16 -p1 -b .pid
%patch17 -p1 -b .foomatic-recommended
-%patch18 -p1 -b .str2650
%patch19 -p1 -b .eggcups
%patch20 -p1 -b .getpass
%patch21 -p1 -b .driverd-timeout
%patch22 -p1 -b .strict-ppd-line-length
-%patch23 -p1 -b .str2664
%patch25 -p1 -b .usb-paperout
%if %lspp
@@ -452,6 +450,10 @@ rm -rf $RPM_BUILD_ROOT
%{cups_serverbin}/daemon/cups-lpd
%changelog
+* Tue Feb 5 2008 Tim Waugh 1:1.3.5-4
+- Include fixes from svn up to revision 7287. No longer need str2650 or
+ str2664 patches.
+
* Fri Feb 1 2008 Tim Waugh
- Updated initscript for LSB exit codes and actions (bug #246897).