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