From 11fbd76145ffa366f2d36217e95b81c0abc3e43b Mon Sep 17 00:00:00 2001 From: Tim Waugh Date: Feb 05 2008 15:37:24 +0000 Subject: - Include fixes from svn up to revision 7287. No longer need str2650 or str2664 patches. --- 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"
+ 
+ +

cupsManualCopies

+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". + ++

marker-change-time (integer)

++ ++

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.

++ ++

marker-colors (1setof name(MAX))

++ ++

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".

++ ++

marker-levels (1setof integer(-1:100))

++ ++

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.

++ ++

marker-names (1setof name(MAX))

++ ++

The marker-names attribute specifies the name(s) for each supply in the ++printer. It is only available when the driver provides supply levels.

++ ++

marker-types (1setof type3 keyword)

++ ++

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
  • ++ ++
++ +

port-monitor" (name(127))

+ +

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).