diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 3ddf0f5..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# cups-filters - -#### Description -{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md deleted file mode 100644 index a460a07..0000000 --- a/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# cups-filters - -#### 介绍 -{**以下是码云平台说明,您可以替换此简介** -码云是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 -无论是个人、团队、或是企业,都能够用码云实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} - -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 码云特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 -5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/cups-filters-1.20.3.tar.xz b/cups-filters-1.20.3.tar.xz new file mode 100644 index 0000000..9d501e5 Binary files /dev/null and b/cups-filters-1.20.3.tar.xz differ diff --git a/cups-filters-cleareof.patch b/cups-filters-cleareof.patch new file mode 100644 index 0000000..8b9731f --- /dev/null +++ b/cups-filters-cleareof.patch @@ -0,0 +1,11 @@ +diff -up cups-filters-1.20.3/filter/foomatic-rip/foomaticrip.c.cleareof cups-filters-1.20.3/filter/foomatic-rip/foomaticrip.c +--- cups-filters-1.20.3/filter/foomatic-rip/foomaticrip.c.cleareof 2018-09-21 13:38:05.882666106 +0200 ++++ cups-filters-1.20.3/filter/foomatic-rip/foomaticrip.c 2018-09-21 13:38:55.330277816 +0200 +@@ -663,6 +663,7 @@ int print_file(const char *filename, int + rip_die(EXIT_PRNERR_NORETRY_BAD_SETTINGS, + "Couldn't dup stdout of pdf-to-ps\n"); + ++ clearerr(stdin); + ret = print_file("", 0); + + wait_for_process(renderer_pid); diff --git a/cups-filters-covscan.patch b/cups-filters-covscan.patch new file mode 100644 index 0000000..9a225c3 --- /dev/null +++ b/cups-filters-covscan.patch @@ -0,0 +1,678 @@ +diff --git a/backend/beh.c b/backend/beh.c +index 9ba6613..7514e33 100644 +--- a/backend/beh.c ++++ b/backend/beh.c +@@ -223,6 +223,8 @@ call_backend(char *uri, /* I - URI of final destination */ + */ + + strncpy(scheme, uri, sizeof(scheme)); ++ if (strlen(uri) > 1023) ++ scheme[1023] = '\0'; + if ((ptr = strchr(scheme, ':')) != NULL) + *ptr = '\0'; + +diff --git a/backend/implicitclass.c b/backend/implicitclass.c +index 3ce4d10..1593191 100644 +--- a/backend/implicitclass.c ++++ b/backend/implicitclass.c +@@ -104,6 +104,8 @@ main(int argc, /* I - Number of command-line args */ + } + ptr1 ++; + strncpy(queue_name, ptr1, sizeof(queue_name)); ++ if (strlen(ptr1) > 1023) ++ queue_name[1023] = '\0'; + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", ippPort(), "/printers/%s", queue_name); + job_id = argv[1]; +@@ -162,6 +164,8 @@ main(int argc, /* I - Number of command-line args */ + /* Read destination host name (or message) and check whether it is + complete (second double quote) */ + strncpy(dest_host, ptr1, sizeof(dest_host)); ++ if (strlen(ptr1) > 1023) ++ dest_host[1023] = '\0'; + ptr1 = dest_host; + if ((ptr2 = strchr(ptr1, '"')) != NULL) { + *ptr2 = '\0'; +diff --git a/cupsfilters/colormanager.c b/cupsfilters/colormanager.c +index 70074a3..a4a929d 100644 +--- a/cupsfilters/colormanager.c ++++ b/cupsfilters/colormanager.c +@@ -272,6 +272,9 @@ _get_colord_profile(const char *printer_name, /* Dest name */ + free(qualifier); + } + ++ if (icc_profile != NULL) ++ free(icc_profile); ++ + return is_profile_set; + + } +@@ -325,8 +328,11 @@ _get_ppd_icc_fallback (ppd_file_t *ppd, char **qualifier) + if (attr->value[0] != '/') + snprintf(full_path, sizeof(full_path), + "%s/profiles/%s", CUPSDATA, attr->value); +- else ++ else { + strncpy(full_path, attr->value, sizeof(full_path)); ++ if (strlen(attr->value) > 1023) ++ full_path[1023] = '\0'; ++ } + + /* check the file exists */ + if (access(full_path, 0)) { +diff --git a/cupsfilters/image-sgilib.c b/cupsfilters/image-sgilib.c +index 0b70c13..bf2dd80 100644 +--- a/cupsfilters/image-sgilib.c ++++ b/cupsfilters/image-sgilib.c +@@ -282,7 +282,7 @@ sgiOpenFile(FILE *file, /* I - File to open */ + sgip->mode = SGI_WRITE; + + putshort(SGI_MAGIC, sgip->file); +- putc((sgip->comp = comp) != 0, sgip->file); ++ putc(((sgip->comp = comp) != 0) ? '1': '0', sgip->file); + putc(sgip->bpp = bpp, sgip->file); + putshort(3, sgip->file); /* Dimensions */ + putshort(sgip->xsize = xsize, sgip->file); +diff --git a/cupsfilters/image-sun.c b/cupsfilters/image-sun.c +index 609b194..989d039 100644 +--- a/cupsfilters/image-sun.c ++++ b/cupsfilters/image-sun.c +@@ -114,6 +114,7 @@ _cupsImageReadSunRaster( + ras_depth == 0 || ras_depth > 32) + { + fputs("DEBUG: Raster image cannot be loaded!\n", stderr); ++ fclose(fp); + return (1); + } + +diff --git a/cupsfilters/ppdgenerator.c b/cupsfilters/ppdgenerator.c +index 052e3c5..3bc4d8a 100644 +--- a/cupsfilters/ppdgenerator.c ++++ b/cupsfilters/ppdgenerator.c +@@ -937,6 +937,10 @@ load_opt_strings_catalog(const char *location, cups_array_t *options) + } + } + cupsFileClose(fp); ++ if (choice_name != NULL) ++ free(choice_name); ++ if (opt_name != NULL) ++ free(opt_name); + if (filename == tmpfile) + unlink(filename); + } +diff --git a/cupsfilters/raster.c b/cupsfilters/raster.c +index 8203690..67d6b9b 100644 +--- a/cupsfilters/raster.c ++++ b/cupsfilters/raster.c +@@ -151,11 +151,14 @@ cupsRasterParseIPPOptions(cups_page_header2_t *h, /* I - Raster header */ + strcasestr(s, "right") || + strcasestr(s, "side") || + strcasestr(s, "main")) +- media_source = strdup(s); ++ { ++ if (media_source == NULL) ++ media_source = strdup(s); ++ } + else + media_type = strdup(s); + } +- if (size_found) ++ if (page_size == NULL && size_found) + page_size = strdup(size_found->pwg); + } + } +@@ -1079,6 +1082,13 @@ cupsRasterParseIPPOptions(cups_page_header2_t *h, /* I - Raster header */ + h->cupsRenderingIntent[0] = '\0'; + #endif /* HAVE_CUPS_1_7 */ + ++ if (media_source != NULL) ++ free(media_source); ++ if (media_type != NULL) ++ free(media_type); ++ if (page_size != NULL) ++ free(page_size); ++ + return (0); + } + +diff --git a/filter/bannertopdf.c b/filter/bannertopdf.c +index b78ea37..2b9bd76 100644 +--- a/filter/bannertopdf.c ++++ b/filter/bannertopdf.c +@@ -513,6 +513,15 @@ static int generate_banner_pdf(banner_t *banner, + pdf_duplicate_page(doc, 1, copies); + + pdf_write(doc, stdout); ++ ++ opt_t * opt_current = known_opts; ++ opt_t * opt_next = NULL; ++ while (opt_current != NULL) ++ { ++ opt_next = opt_current->next; ++ free(opt_current); ++ opt_current = opt_next; ++ } + free(buf); + pdf_free(doc); + return 0; +diff --git a/filter/foomatic-rip/foomaticrip.c b/filter/foomatic-rip/foomaticrip.c +index 2a642ed..13d2035 100644 +--- a/filter/foomatic-rip/foomaticrip.c ++++ b/filter/foomatic-rip/foomaticrip.c +@@ -666,6 +666,11 @@ int print_file(const char *filename, int convert) + ret = print_file("", 0); + + wait_for_process(renderer_pid); ++ if (in != NULL) ++ fclose(in); ++ if (out != NULL) ++ fclose(out); ++ + return ret; + } + +@@ -683,6 +688,8 @@ int print_file(const char *filename, int convert) + + case UNKNOWN_FILE: + _log("Cannot process \"%s\": Unknown filetype.\n", filename); ++ if (file != NULL) ++ fclose(file); + return 0; + } + +@@ -811,10 +818,14 @@ int main(int argc, char** argv) + + if (getenv("PPD")) { + strncpy(job->ppdfile, getenv("PPD"), 2048); ++ if (strlen(getenv("PPD")) > 2047) ++ job->ppdfile[2047] = '\0'; + spooler = SPOOLER_CUPS; +- if (getenv("CUPS_SERVERBIN")) +- strncpy(cupsfilterpath, getenv("CUPS_SERVERBIN"), +- sizeof(cupsfilterpath)); ++ if (getenv("CUPS_SERVERBIN")) { ++ strncpy(cupsfilterpath, getenv("CUPS_SERVERBIN"), sizeof(cupsfilterpath)); ++ if (strlen(getenv("CUPS_SERVERBIN")) > PATH_MAX-1) ++ cupsfilterpath[PATH_MAX-1] = '\0'; ++ } + } + + /* Check status of printer color management from the color manager */ +@@ -834,10 +845,14 @@ int main(int argc, char** argv) + allow duplicates, and use the last specified one */ + while ((str = arglist_get_value(arglist, "-p"))) { + strncpy(job->ppdfile, str, 2048); ++ if (strlen(str) > 2047) ++ job->ppdfile[2047] = '\0'; + arglist_remove(arglist, "-p"); + } + while ((str = arglist_get_value(arglist, "--ppd"))) { + strncpy(job->ppdfile, str, 2048); ++ if (strlen(str) > 2047) ++ job->ppdfile[2047] = '\0'; + arglist_remove(arglist, "--ppd"); + } + +@@ -1020,6 +1035,7 @@ int main(int argc, char** argv) + cmd[0] = '\0'; + + snprintf(gstoraster, sizeof(gstoraster), "gs -dQUIET -dDEBUG -dPARANOIDSAFER -dNOPAUSE -dBATCH -dNOINTERPOLATE -dNOMEDIAATTRS -sDEVICE=cups -dShowAcroForm %s -sOutputFile=- -", cmd); ++ free(icc_profile); + } + + /* build Ghostscript/CUPS driver command line */ +diff --git a/filter/foomatic-rip/options.c b/filter/foomatic-rip/options.c +index 325a0a6..798ddf9 100644 +--- a/filter/foomatic-rip/options.c ++++ b/filter/foomatic-rip/options.c +@@ -1031,12 +1031,10 @@ int option_set_value(option_t *opt, int optionset, const char *value) + /* TODO only set the changed option, not all of them */ + choice = option_find_choice(fromopt, + option_get_value(fromopt, optionset)); +- + composite_set_values(fromopt, optionset, choice->command); +- } +- else { ++ free(newvalue); ++ } else + val->value = newvalue; +- } + + if (option_is_composite(opt)) { + /* set dependent values */ +@@ -1914,6 +1912,8 @@ int ppd_supports_pdf() + if (startswith(cmd, "gs")) + { + strncpy(cmd_pdf, cmd, 4096); ++ if (strlen(cmd) > 4095) ++ cmd_pdf[4095] = '\0'; + return 1; + } + +diff --git a/filter/foomatic-rip/spooler.c b/filter/foomatic-rip/spooler.c +index 236551f..4f27563 100644 +--- a/filter/foomatic-rip/spooler.c ++++ b/filter/foomatic-rip/spooler.c +@@ -94,6 +94,8 @@ void init_cups(list_t *arglist, dstr_t *filelist, jobparams_t *job) + CUPS puts the print queue name into the PRINTER environment variable + when calling filters. */ + strncpy(job->printer, getenv("PRINTER"), 256); ++ if (strlen(getenv("PRINTER")) > 255) ++ job->printer[255] = '\0'; + + free(cups_options); + } +diff --git a/filter/pdftops.c b/filter/pdftops.c +index 55d2ec1..a648444 100644 +--- a/filter/pdftops.c ++++ b/filter/pdftops.c +@@ -427,6 +427,8 @@ main(int argc, /* I - Number of command-line args */ + if ((val = cupsGetOption("make-and-model", num_options, options)) != NULL) + { + strncpy(make_model, val, sizeof(make_model)); ++ if (strlen(val) > 127) ++ make_model[127] = '\0'; + for (ptr = make_model; *ptr; ptr ++) + if (*ptr == '-') *ptr = ' '; + } +diff --git a/filter/pdftoraster.cxx b/filter/pdftoraster.cxx +index 4cd656a..0c63ab8 100644 +--- a/filter/pdftoraster.cxx ++++ b/filter/pdftoraster.cxx +@@ -558,8 +558,10 @@ static void parseOpts(int argc, char **argv) + if (!cm_disabled) + cmGetPrinterIccProfile(getenv("PRINTER"), &profile, ppd); + +- if (profile != NULL) +- colorProfile = cmsOpenProfileFromFile(profile,"r"); ++ if (profile != NULL) { ++ colorProfile = cmsOpenProfileFromFile(profile,"r"); ++ free(profile); ++ } + + #ifdef HAVE_CUPS_1_7 + if ((attr = ppdFindAttr(ppd,"PWGRaster",0)) != 0 && +diff --git a/filter/rastertoescpx.c b/filter/rastertoescpx.c +index 5a3e5df..a0ec416 100644 +--- a/filter/rastertoescpx.c ++++ b/filter/rastertoescpx.c +@@ -1141,7 +1141,10 @@ EndPage(ppd_file_t *ppd, /* I - PPD file */ + } + } + else ++ { + free(DotBuffers[0]); ++ DotBuffers[0] = NULL; ++ } + + /* + * Output a page eject sequence... +@@ -1440,7 +1443,7 @@ CompressData(ppd_file_t *ppd, /* I - PPD file information */ + + printf("\033i"); + putchar(ctable[PrinterPlanes - 1][plane]); +- putchar(type != 0); ++ putchar((type != 0) ? '1': '0'); + putchar(BitPlanes); + putchar(bytes & 255); + putchar(bytes >> 8); +@@ -1470,7 +1473,7 @@ CompressData(ppd_file_t *ppd, /* I - PPD file information */ + bytes *= 8; + + printf("\033."); +- putchar(type != 0); ++ putchar((type != 0) ? '1': '0'); + putchar(ystep); + putchar(xstep); + putchar(rows); +@@ -1907,6 +1910,10 @@ main(int argc, /* I - Number of command-line arguments */ + if (fd != 0) + close(fd); + ++ for (int i = 0; i < 7; i++) ++ if (DotBuffers[i] != NULL) ++ free(DotBuffers[i]); ++ + return (page == 0); + } + +diff --git a/filter/rastertops.c b/filter/rastertops.c +index d5d955b..531eb70 100644 +--- a/filter/rastertops.c ++++ b/filter/rastertops.c +@@ -282,6 +282,8 @@ write_flate(cups_raster_t *ras, /* I - Image data */ + if (fwrite(out, 1, have, stdout) != have) + { + (void)deflateEnd(&strm); ++ if (convertedpix != NULL) ++ free(convertedpix); + return Z_ERRNO; + } + } while (strm.avail_out == 0); +diff --git a/filter/sys5ippprinter.c b/filter/sys5ippprinter.c +index ad75551..9a92c8e 100644 +--- a/filter/sys5ippprinter.c ++++ b/filter/sys5ippprinter.c +@@ -570,6 +570,8 @@ exec_filter(const char *filter, /* I - Filter to execute */ + dup2(fd, 2); + close(fd); + } ++ else ++ close(fd); + fcntl(2, F_SETFL, O_NDELAY); + } + +@@ -578,6 +580,8 @@ exec_filter(const char *filter, /* I - Filter to execute */ + dup2(fd, 3); + close(fd); + } ++ else ++ close(fd); + fcntl(3, F_SETFL, O_NDELAY); + + if ((fd = open("/dev/null", O_RDWR)) > 4) +@@ -585,6 +589,8 @@ exec_filter(const char *filter, /* I - Filter to execute */ + dup2(fd, 4); + close(fd); + } ++ else ++ close(fd); + fcntl(4, F_SETFL, O_NDELAY); + + /* +@@ -654,8 +660,11 @@ exec_filters(cups_array_t *filters, /* I - Array of filters to run */ + { + next = (char *)cupsArrayNext(filters); + +- if (filter[0] == '/') ++ if (filter[0] == '/') { + strncpy(program, filter, sizeof(program)); ++ if (strlen(filter) > 1023) ++ program[1023] = '\0'; ++ } + else + { + if ((cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) +diff --git a/utils/cups-browsed.c b/utils/cups-browsed.c +index a2a4a08..19a2ac8 100644 +--- a/utils/cups-browsed.c ++++ b/utils/cups-browsed.c +@@ -2245,7 +2245,10 @@ is_disabled(const char *printer, const char *reason) { + pstate = (ipp_pstate_t)ippGetInteger(attr, 0); + else if (!strcmp(ippGetName(attr), "printer-state-message") && + ippGetValueTag(attr) == IPP_TAG_TEXT) { +- free(pstatemsg); ++ if (pstatemsg != NULL) { ++ free(pstatemsg); ++ pstatemsg = NULL; ++ } + p = ippGetString(attr, 0, NULL); + if (p != NULL) pstatemsg = strdup(p); + } +@@ -2262,16 +2265,22 @@ is_disabled(const char *printer, const char *reason) { + case IPP_PRINTER_IDLE: + case IPP_PRINTER_PROCESSING: + ippDelete(response); +- free(pstatemsg); ++ if (pstatemsg != NULL) { ++ free(pstatemsg); ++ pstatemsg = NULL; ++ } + return NULL; + case IPP_PRINTER_STOPPED: + ippDelete(response); + if (reason == NULL) + return pstatemsg; +- else if (strcasestr(pstatemsg, reason) != NULL) ++ else if (pstatemsg != NULL && (strcasestr(pstatemsg, reason) != NULL)) + return pstatemsg; + else { +- free(pstatemsg); ++ if (pstatemsg != NULL) { ++ free(pstatemsg); ++ pstatemsg = NULL; ++ } + return NULL; + } + } +@@ -2280,12 +2289,18 @@ is_disabled(const char *printer, const char *reason) { + debug_printf("No information regarding enabled/disabled found about the requested printer '%s'\n", + printer); + ippDelete(response); +- free(pstatemsg); ++ if (pstatemsg != NULL) { ++ free(pstatemsg); ++ pstatemsg = NULL; ++ } + return NULL; + } + debug_printf("ERROR: Request for printer info failed: %s\n", + cupsLastErrorString()); +- free(pstatemsg); ++ if (pstatemsg != NULL) { ++ free(pstatemsg); ++ pstatemsg = NULL; ++ } + return NULL; + } + +@@ -3040,6 +3055,8 @@ on_printer_state_changed (CupsNotifier *object, + dest_host = p->ip ? p->ip : p->host; + dest_port = p->port; + strncpy(dest_name, remote_cups_queue, sizeof(dest_name)); ++ if (strlen(remote_cups_queue) > 1023) ++ dest_name[1023] = '\0'; + dest_index = i; + debug_printf("Printer %s on host %s, port %d is idle, take this as destination and stop searching.\n", + remote_cups_queue, p->host, p->port); +@@ -3056,8 +3073,9 @@ on_printer_state_changed (CupsNotifier *object, + min_jobs = num_jobs; + dest_host = p->ip ? p->ip : p->host; + dest_port = p->port; +- strncpy(dest_name, remote_cups_queue, +- sizeof(dest_name)); ++ strncpy(dest_name, remote_cups_queue, sizeof(dest_name)); ++ if (strlen(remote_cups_queue) > 1023) ++ dest_name[1023] = '\0'; + dest_index = i; + } + debug_printf("Printer %s on host %s, port %d is printing and it has %d jobs.\n", +@@ -3566,8 +3584,9 @@ create_remote_printer_entry (const char *queue_name, + IPP_TAG_KEYWORD)) != NULL) { + debug_printf(" Attr: %s\n", ippGetName(attr)); + for (i = 0; i < ippGetCount(attr); i ++) { +- strncpy(valuebuffer, ippGetString(attr, i, NULL), +- sizeof(valuebuffer)); ++ strncpy(valuebuffer, ippGetString(attr, i, NULL), sizeof(valuebuffer)); ++ if (strlen(ippGetString(attr, i, NULL)) > 65535) ++ valuebuffer[65535] = '\0'; + debug_printf(" Keyword: %s\n", valuebuffer); + if (valuebuffer[0] > '1') + break; +@@ -3598,8 +3617,9 @@ create_remote_printer_entry (const char *queue_name, + debug_printf(" Value: %s\n", valuebuffer); + if (valuebuffer[0] == '\0') { + for (i = 0; i < ippGetCount(attr); i ++) { +- strncpy(valuebuffer, ippGetString(attr, i, NULL), +- sizeof(valuebuffer)); ++ strncpy(valuebuffer, ippGetString(attr, i, NULL), sizeof(valuebuffer)); ++ if (strlen(ippGetString(attr, i, NULL)) > 65535) ++ valuebuffer[65535] = '\0'; + debug_printf(" Keyword: %s\n", valuebuffer); + if (valuebuffer[0] != '\0') + break; +@@ -3629,8 +3649,9 @@ create_remote_printer_entry (const char *queue_name, + debug_printf(" Value: %s\n", valuebuffer); + if (valuebuffer[0] == '\0') { + for (i = 0; i < ippGetCount(attr); i ++) { +- strncpy(valuebuffer, ippGetString(attr, i, NULL), +- sizeof(valuebuffer)); ++ strncpy(valuebuffer, ippGetString(attr, i, NULL), sizeof(valuebuffer)); ++ if (strlen(ippGetString(attr, i, NULL)) > 65535) ++ valuebuffer[65535] = '\0'; + debug_printf(" Keyword: %s\n", valuebuffer); + if (valuebuffer[0] != '\0') + break; +@@ -3663,8 +3684,9 @@ create_remote_printer_entry (const char *queue_name, + debug_printf(" Value: %s\n", p->queue_name, valuebuffer); + if (valuebuffer[0] == '\0') { + for (i = 0; i < ippGetCount(attr); i ++) { +- strncpy(valuebuffer, ippGetString(attr, i, NULL), +- sizeof(valuebuffer)); ++ strncpy(valuebuffer, ippGetString(attr, i, NULL), sizeof(valuebuffer)); ++ if (strlen(ippGetString(attr, i, NULL)) > 65535) ++ valuebuffer[65535] = '\0'; + debug_printf(" Keyword: %s\n", valuebuffer); + if (valuebuffer[0] != '\0') + break; +@@ -4498,6 +4520,8 @@ gboolean update_cups_queues(gpointer unused) { + } else { + /* Device URI: ipp(s)://:631/printers/ */ + strncpy(device_uri, p->uri, sizeof(device_uri)); ++ if (strlen(p->uri) > HTTP_MAX_URI-1) ++ device_uri[HTTP_MAX_URI-1] = '\0'; + debug_printf("Print queue %s is for an IPP network printer, or we do not get notifications from CUPS, using direct device URI %s\n", + p->queue_name, device_uri); + } +@@ -4606,6 +4630,8 @@ gboolean update_cups_queues(gpointer unused) { + } else if (!strncmp(line, "*Default", 8)) { + cont_line_read = 0; + strncpy(keyword, line + 8, sizeof(keyword)); ++ if ((strlen(line) + 8) > 1023) ++ keyword[1023] = '\0'; + for (keyptr = keyword; *keyptr; keyptr ++) + if (*keyptr == ':' || isspace(*keyptr & 255)) + break; +@@ -7144,7 +7170,7 @@ read_configuration (const char *filename) + in the configuration file is used. */ + while ((i < cupsArrayCount(command_line_config) && + (value = cupsArrayIndex(command_line_config, i++)) && +- strncpy(line, value, sizeof(line))) || ++ strncpy(line, value, sizeof(line)) && ((strlen(value) > HTTP_MAX_BUFFER-1)? line[HTTP_MAX_BUFFER-1] = '\0': 1)) || + cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) { + if (linenum < 0) { + /* We are still reading options from the command line ("-o ..."), +@@ -7371,6 +7397,7 @@ read_configuration (const char *filename) + if (filter->cregexp) + regfree(filter->cregexp); + free(filter); ++ filter = NULL; + } + } else if ((!strcasecmp(line, "BrowseInterval") || !strcasecmp(line, "BrowseTimeout")) && value) { + int t = atoi(value); +@@ -7386,8 +7413,11 @@ read_configuration (const char *filename) + debug_printf("Invalid %s value: %d\n", + line, t); + } else if (!strcasecmp(line, "DomainSocket") && value) { +- if (value[0] != '\0') ++ if (value[0] != '\0') { ++ if (DomainSocket != NULL) ++ free(DomainSocket); + DomainSocket = strdup(value); ++ } + } else if ((!strcasecmp(line, "HttpLocalTimeout") || !strcasecmp(line, "HttpRemoteTimeout")) && value) { + int t = atoi(value); + if (t >= 0) { +@@ -7555,6 +7585,10 @@ read_configuration (const char *filename) + } + } + cupsArrayAdd (clusters, cluster); ++ if (start != NULL) { ++ free(start); ++ start = NULL; ++ } + continue; + cluster_fail: + if (cluster) { +@@ -7568,6 +7602,11 @@ read_configuration (const char *filename) + cupsArrayDelete (cluster->members); + } + free(cluster); ++ cluster = NULL; ++ } ++ if (start != NULL) { ++ free(start); ++ start = NULL; + } + } else if (!strcasecmp(line, "LoadBalancing") && value) { + if (!strncasecmp(value, "QueueOnClient", 13)) +@@ -7575,7 +7614,7 @@ read_configuration (const char *filename) + else if (!strncasecmp(value, "QueueOnServers", 14)) + LoadBalancingType = QUEUE_ON_SERVERS; + } else if (!strcasecmp(line, "DefaultOptions") && value) { +- if (strlen(value) > 0) ++ if (DefaultOptions == NULL && strlen(value) > 0) + DefaultOptions = strdup(value); + } else if (!strcasecmp(line, "AutoShutdown") && value) { + char *p, *saveptr; +@@ -7949,10 +7988,12 @@ int main(int argc, char*argv[]) { + daemon, not with remote ones. */ + if (getenv("CUPS_SERVER") != NULL) { + strncpy(local_server_str, getenv("CUPS_SERVER"), sizeof(local_server_str)); ++ if (strlen(getenv("CUPS_SERVER")) > 1023) ++ local_server_str[1023] = '\0'; + } else { + #ifdef CUPS_DEFAULT_DOMAINSOCKET + if (DomainSocket == NULL) +- DomainSocket = CUPS_DEFAULT_DOMAINSOCKET; ++ DomainSocket = strdup(CUPS_DEFAULT_DOMAINSOCKET); + #endif + if (DomainSocket != NULL) { + struct stat sockinfo; /* Domain socket information */ +@@ -8293,6 +8334,11 @@ fail: + if (debug_logfile == 1) + stop_debug_logging(); + ++ if (DefaultOptions != NULL) ++ free(DefaultOptions); ++ if (DomainSocket != NULL) ++ free(DomainSocket); ++ + return ret; + + help: +diff --git a/utils/driverless.c b/utils/driverless.c +index 7fc6dae..fe61e58 100644 +--- a/utils/driverless.c ++++ b/utils/driverless.c +@@ -227,12 +227,16 @@ list_printers (int mode) + + if (txt_usb_mfg[0] != '\0') { + strncpy(make, txt_usb_mfg, sizeof(make)); ++ if (strlen(txt_usb_mfg) > 511) ++ make[511] = '\0'; + ptr = device_id + strlen(device_id); + snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), + "MFG:%s;", txt_usb_mfg); + } + if (txt_usb_mdl[0] != '\0') { + strncpy(model, txt_usb_mdl, sizeof(model)); ++ if (strlen(txt_usb_mdl) > 255) ++ model[255] = '\0'; + ptr = device_id + strlen(device_id); + snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), + "MDL:%s;", txt_usb_mdl); +@@ -243,15 +247,22 @@ list_printers (int mode) + *ptr == ')') + *ptr = '\0'; + strncpy(model, txt_product + 1, sizeof(model)); ++ if ((strlen(txt_product) + 1) > 255) ++ model[255] = '\0'; + } else + strncpy(model, txt_product, sizeof(model)); + } else if (txt_ty[0] != '\0') { + strncpy(model, txt_ty, sizeof(model)); ++ if (strlen(txt_ty) > 255) ++ model[255] = '\0'; + if ((ptr = strchr(model, ',')) != NULL) + *ptr = '\0'; + } +- if (txt_pdl[0] != '\0') ++ if (txt_pdl[0] != '\0') { + strncpy(pdl, txt_pdl, sizeof(pdl)); ++ if (strlen(txt_pdl) > 255) ++ pdl[255] = '\0'; ++ } + + if (!device_id[0] && strcasecmp(model, "Unknown")) { + if (make[0]) diff --git a/cups-filters-createall.patch b/cups-filters-createall.patch new file mode 100644 index 0000000..8079537 --- /dev/null +++ b/cups-filters-createall.patch @@ -0,0 +1,21 @@ +diff -up cups-filters-1.16.1/utils/cups-browsed.conf.in.createall cups-filters-1.16.1/utils/cups-browsed.conf.in +--- cups-filters-1.16.1/utils/cups-browsed.conf.in.createall 2018-01-02 17:17:51.555941155 +0100 ++++ cups-filters-1.16.1/utils/cups-browsed.conf.in 2018-01-02 17:19:49.651048564 +0100 +@@ -359,7 +359,7 @@ BrowseRemoteProtocols @BROWSEREMOTEPROTO + + # LocalQueueNamingRemoteCUPS DNS-SD + # LocalQueueNamingRemoteCUPS MakeModel +-# LocalQueueNamingRemoteCUPS RemoteName ++LocalQueueNamingRemoteCUPS RemoteName + # LocalQueueNamingIPPPrinter DNS-SD + # LocalQueueNamingIPPPrinter MakeModel + +@@ -453,7 +453,7 @@ BrowseRemoteProtocols @BROWSEREMOTEPROTO + # CreateIPPPrinterQueues AppleRaster + # CreateIPPPrinterQueues Everywhere AppleRaster + # CreateIPPPrinterQueues Driverless +-# CreateIPPPrinterQueues All ++CreateIPPPrinterQueues All + + + # If cups-browsed is automatically creating print queues for native diff --git a/cups-filters.spec b/cups-filters.spec new file mode 100644 index 0000000..2bc6899 --- /dev/null +++ b/cups-filters.spec @@ -0,0 +1,165 @@ +%global _service cups-browsed.service +Summary: OpenPrinting CUPS filters, backends, and cups-browsed +Name: cups-filters +Version: 1.20.3 +Release: 10 +License: GPLv2 and GPLv2+ and GPLv3 and GPLv3+ and LGPLv2+ and MIT and BSD with advertising +Url: http://www.linuxfoundation.org/collaborate/workgroups/openprinting/cups-filters +Source0: http://www.openprinting.org/download/cups-filters/cups-filters-%{version}.tar.xz +Patch01: cups-filters-createall.patch +Patch02: poppler-0.64.patch +Patch03: cups-filters-covscan.patch +Patch04: cups-filters-cleareof.patch + +BuildRequires: pkgconf-pkg-config pkgconfig(libqpdf) pkgconfig(libpng) pkgconfig(dbus-1) +BuildRequires: poppler-cpp-devel libtiff-devel avahi-devel libjpeg-turbo-devel pkgconfig(zlib) +BuildRequires: pkgconfig(ijs) pkgconfig(freetype2) pkgconfig(lcms2) pkgconfig(poppler) +BuildRequires: pkgconfig(avahi-glib) pkgconfig(glib-2.0) pkgconfig(fontconfig) +BuildRequires: systemd cups-devel python3-cups ghostscript gcc gcc-c++ poppler-utils +BuildRequires: autoconf automake dejavu-sans-fonts libtool + +Requires: poppler-utils ghostscript cups-filesystem +Requires: liberation-mono-fonts bc grep sed which cups + +%{?systemd_requires} + +Obsoletes: ghostscript-cups +Obsoletes: foomatic-filters +Obsoletes: %{name}-libs < %{version}-%{release} +Provides: %{name}-libs = %{version}-%{release} + +%description +This project provides backends, filters, and other software that was once +part of the core CUPS distribution but is no longer maintained by Apple +Inc. In addition it contains additional filters and software developed +independently of Apple, especially filters for the PDF-centric printing +workflow introduced by OpenPrinting and a daemon to browse Bonjour broadcasts +of remote CUPS printers to make these printers available locally and to +provide backward compatibility to the old CUPS broadcasting and browsing +of CUPS 1.5.x and older. + +%package devel +Summary: Development files for %{name} +License: LGPLv2 and MIT +Requires: %{name}-libs = %{version}-%{release} + +%description devel +This package contains the development files for %{name} + +%package_help + +%prep +%autosetup -n %{name}-%{version} -p1 + +%build +./autogen.sh + +%configure --disable-static \ + --with-pdftops=hybrid \ + --enable-driverless \ + --with-rcdir=no \ + --enable-dbus \ + --disable-silent-rules \ + --disable-mutool \ + --enable-auto-setup-driverless + +%make_build + +%install +%make_install DESTDIR=%{buildroot} + +install -d %{buildroot}%{_pkgdocdir}/fontembed/ +cp -p fontembed/README %{buildroot}%{_pkgdocdir}/fontembed/ +install -d %{buildroot}%{_unitdir} +install -p -m 644 utils/%{_service} %{buildroot}%{_unitdir} +cp -a %{_cups_serverbin}/filter/foomatic-rip %{buildroot}%{_bindir}/foomatic-rip +sed -i '/urftopdf/d' %{buildroot}%{_datadir}/cups/mime/cupsfilters.convs + +%check +make check + +%post +%systemd_post %{_service} +/sbin/ldconfig + +if [ $1 -eq 1 ] ; then + IN=%{_sysconfdir}/cups/cupsd.conf + OUT=%{_sysconfdir}/cups/cups-browsed.conf + keyword=BrowsePoll + if [ -f "$OUT" ]; then + echo -e "\n + fi + + if [ -f "$IN" ] && grep -iq ^$keyword "$IN"; then + if ! grep -iq ^$keyword "$OUT"; then + (cat >> "$OUT" <> "$OUT") || : + fi + sed -i -e "s,^$keyword, + fi +fi + +%preun +%systemd_preun %{_service} + +%postun +%systemd_postun_with_restart %{_service} +/sbin/ldconfig + + +%files +%{_pkgdocdir}/NEWS +%{_pkgdocdir}/README +%{_pkgdocdir}/AUTHORS +%{_pkgdocdir}/COPYING +%{_pkgdocdir}/fontembed/README +%config(noreplace) %{_sysconfdir}/cups/cups-browsed.conf +%attr(0755,root,root) %{_cups_serverbin}/filter/* +%attr(0755,root,root) %{_cups_serverbin}/backend/parallel +%attr(0700,root,root) %{_cups_serverbin}/backend/serial +%attr(0755,root,root) %{_cups_serverbin}/backend/implicitclass +%attr(0755,root,root) %{_cups_serverbin}/backend/beh +%attr(0755,root,root) %{_cups_serverbin}/backend/cups-brf +%{_bindir}/foomatic-rip +%{_bindir}/driverless +%{_datadir}/cups/ppdc/* +%{_datadir}/cups/drv/* +%{_datadir}/cups/mime/* +%{_datadir}/cups/banners +%{_datadir}/cups/braille +%{_datadir}/cups/charsets +%{_datadir}/cups/data/* +%{_sbindir}/cups-browsed +%{_datadir}/ppd/cupsfilters +%dir %{_pkgdocdir}/ +%{_libdir}/libcupsfilters.so.1* +%{_libdir}/libfontembed.so.1* +%{_unitdir}/%{_service} +%{_cups_serverbin}/backend/driverless +%{_cups_serverbin}/driver/driverless +%exclude %{_bindir}/ttfread +%exclude %{_prefix}/lib/debug/usr/bin/ttfread-1.20.3-10.aarch64.debug +%exclude %{_libdir}/libcupsfilters.la +%exclude %{_libdir}/libfontembed.la +%exclude %{_datadir}/doc/cups-filters/INSTALL + +%files devel +%{_datadir}/cups/ppdc/escp.h +%{_includedir}/cupsfilters +%{_includedir}/fontembed +%{_libdir}/libcupsfilters.so +%{_libdir}/libfontembed.so +%{_libdir}/pkgconfig/libcupsfilters.pc +%{_libdir}/pkgconfig/libfontembed.pc + +%files help +%{_mandir}/man1/driverless.1.gz +%{_mandir}/man1/foomatic-rip.1.gz +%{_mandir}/man5/cups-browsed.conf.5.gz +%{_mandir}/man8/cups-browsed.8.gz + +%changelog +* Tue Nov 12 2019 caomeng - 1.20.3-10 +- Package init diff --git a/poppler-0.64.patch b/poppler-0.64.patch new file mode 100644 index 0000000..4babcf1 --- /dev/null +++ b/poppler-0.64.patch @@ -0,0 +1,28 @@ +From 07a0a423a8469a2dd6d7f64bb3b62ba6ac42cc28 Mon Sep 17 00:00:00 2001 +From: Lars Wendler +Date: Fri, 20 Jul 2018 15:20:11 +0200 +Subject: [PATCH] GooString needs to be const since >=poppler-0.64.0 + +This only fails with >=poppler-0.67.0 but the change to const was done +in 0.64.0 +--- + filter/pdf.cxx | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/filter/pdf.cxx b/filter/pdf.cxx +index 206ccf88..665eab09 100644 +--- a/filter/pdf.cxx ++++ b/filter/pdf.cxx +@@ -734,6 +734,9 @@ extern "C" int pdf_fill_form(pdf_t *doc, opt_t *opt) + } + + FormField *ff = fm_text->getField(); ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 64 ++ const ++#endif + GooString *field_name; + field_name = ff->getFullyQualifiedName(); + if ( ! field_name ) +-- +2.17.1 +