From 1a3ff20f73dd9438375cc15978243f4084a0e7a5 Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Tue, 21 Aug 2018 09:59:39 -0400 Subject: [PATCH] Fix memory leaks found by Coverity (Issue #5375) --- backend/ipp.c | 2 ++ cgi-bin/search.c | 3 ++- cups/http-addrlist.c | 3 ++- cups/http.c | 2 +- ppdc/ppdc-source.cxx | 3 ++- scheduler/cups-driverd.cxx | 40 +++++++++++++++++++------------------- 6 files changed, 29 insertions(+), 24 deletions(-) diff --git a/backend/ipp.c b/backend/ipp.c index 0a9d27cfe6..f62304ac6f 100644 --- a/backend/ipp.c +++ b/backend/ipp.c @@ -3593,6 +3593,8 @@ update_reasons(ipp_attribute_t *attr, /* I - printer-state-reasons or NULL */ } } + cupsArrayDelete(new_reasons); + _cupsMutexUnlock(&report_mutex); /* diff --git a/cgi-bin/search.c b/cgi-bin/search.c index 3d1a18df18..399331d9b3 100644 --- a/cgi-bin/search.c +++ b/cgi-bin/search.c @@ -1,7 +1,7 @@ /* * Search routines for CUPS. * - * Copyright 2007-2014 by Apple Inc. + * Copyright 2007-2018 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -365,4 +365,5 @@ void cgiFreeSearch(void *search) /* I - Search context */ { regfree((regex_t *)search); + free(search); } diff --git a/cups/http-addrlist.c b/cups/http-addrlist.c index e5fc940e1b..3e0f2ca012 100644 --- a/cups/http-addrlist.c +++ b/cups/http-addrlist.c @@ -1,7 +1,7 @@ /* * HTTP address list routines for CUPS. * - * Copyright 2007-2017 by Apple Inc. + * Copyright 2007-2018 by Apple Inc. * Copyright 1997-2007 by Easy Software Products, all rights reserved. * * These coded instructions, statements, and computer programs are the @@ -618,6 +618,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p if (!temp) { httpAddrFreeList(first); + freeaddrinfo(results); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); return (NULL); } diff --git a/cups/http.c b/cups/http.c index 34f0822456..76df91e04e 100644 --- a/cups/http.c +++ b/cups/http.c @@ -3959,7 +3959,7 @@ http_create( if ((http = calloc(sizeof(http_t), 1)) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); - httpAddrFreeList(addrlist); + httpAddrFreeList(myaddrlist); return (NULL); } diff --git a/ppdc/ppdc-source.cxx b/ppdc/ppdc-source.cxx index 7b77c2ee7d..aa2542c566 100644 --- a/ppdc/ppdc-source.cxx +++ b/ppdc/ppdc-source.cxx @@ -1,7 +1,7 @@ // // Source class for the CUPS PPD Compiler. // -// Copyright 2007-2014 by Apple Inc. +// Copyright 2007-2018 by Apple Inc. // Copyright 2002-2007 by Easy Software Products. // // These coded instructions, statements, and computer programs are the @@ -2669,6 +2669,7 @@ ppdcSource::scan_file(ppdcFile *fp, // I - File to read // Add it to the current option... if (!o) { + c->release(); _cupsLangPrintf(stderr, _("ppdc: Choice found on line %d of %s with no " "Option."), fp->line, fp->filename); diff --git a/scheduler/cups-driverd.cxx b/scheduler/cups-driverd.cxx index 45e6e6557c..e6684a1390 100644 --- a/scheduler/cups-driverd.cxx +++ b/scheduler/cups-driverd.cxx @@ -157,7 +157,7 @@ static ppd_info_t *add_ppd(const char *filename, const char *name, size_t size, int model_number, int type, const char *scheme); static int cat_drv(const char *name, int request_id); -static int cat_ppd(const char *name, int request_id); +static void cat_ppd(const char *name, int request_id); static int cat_static(const char *name, int request_id); static int cat_tar(const char *name, int request_id); static int compare_inodes(struct stat *a, struct stat *b); @@ -167,12 +167,12 @@ static int compare_names(const ppd_info_t *p0, const ppd_info_t *p1); static int compare_ppds(const ppd_info_t *p0, const ppd_info_t *p1); -static int dump_ppds_dat(const char *filename); +static void dump_ppds_dat(const char *filename); static void free_array(cups_array_t *a); static cups_file_t *get_file(const char *name, int request_id, const char *subdir, char *buffer, size_t bufsize, char **subfile); -static int list_ppds(int request_id, int limit, const char *opt); +static void list_ppds(int request_id, int limit, const char *opt); static int load_drivers(cups_array_t *include, cups_array_t *exclude); static int load_drv(const char *filename, const char *name, @@ -208,13 +208,13 @@ main(int argc, /* I - Number of command-line args */ */ if (argc == 3 && !strcmp(argv[1], "cat")) - return (cat_ppd(argv[2], 0)); + cat_ppd(argv[2], 0); else if ((argc == 2 || argc == 3) && !strcmp(argv[1], "dump")) - return (dump_ppds_dat(argv[2])); + dump_ppds_dat(argv[2]); else if (argc == 4 && !strcmp(argv[1], "get")) - return (cat_ppd(argv[3], atoi(argv[2]))); + cat_ppd(argv[3], atoi(argv[2])); else if (argc == 5 && !strcmp(argv[1], "list")) - return (list_ppds(atoi(argv[2]), atoi(argv[3]), argv[4])); + list_ppds(atoi(argv[2]), atoi(argv[3]), argv[4]); else { fputs("Usage: cups-driverd cat ppd-name\n", stderr); @@ -432,7 +432,7 @@ cat_drv(const char *name, /* I - PPD name */ * 'cat_ppd()' - Copy a PPD file to stdout. */ -static int /* O - Exit code */ +static void cat_ppd(const char *name, /* I - PPD name */ int request_id) /* I - Request ID for response? */ { @@ -449,7 +449,7 @@ cat_ppd(const char *name, /* I - PPD name */ if (strstr(name, "../")) { fputs("ERROR: Invalid PPD name.\n", stderr); - return (1); + exit(1); } strlcpy(scheme, name, sizeof(scheme)); @@ -479,11 +479,11 @@ cat_ppd(const char *name, /* I - PPD name */ puts("Content-Type: application/ipp\n"); if (!scheme[0]) - return (cat_static(name, request_id)); + exit(cat_static(name, request_id)); else if (!strcmp(scheme, "drv")) - return (cat_drv(name, request_id)); + exit(cat_drv(name, request_id)); else if (!strcmp(scheme, "file")) - return (cat_tar(name, request_id)); + exit(cat_tar(name, request_id)); else { /* @@ -521,7 +521,7 @@ cat_ppd(const char *name, /* I - PPD name */ cupsdSendIPPTrailer(); } - return (1); + exit(1); } /* @@ -551,15 +551,15 @@ cat_ppd(const char *name, /* I - PPD name */ fprintf(stderr, "ERROR: [cups-driverd] Unable to execute \"%s\" - %s\n", line, strerror(errno)); - return (1); + exit(1); } } /* - * Return with no errors... + * Exit with no errors... */ - return (0); + exit(0); } @@ -782,7 +782,7 @@ compare_ppds(const ppd_info_t *p0, /* I - First PPD file */ * 'dump_ppds_dat()' - Dump the contents of the ppds.dat file. */ -static int /* O - Exit status */ +static void dump_ppds_dat(const char *filename) /* I - Filename */ { char temp[1024]; /* ppds.dat filename */ @@ -814,7 +814,7 @@ dump_ppds_dat(const char *filename) /* I - Filename */ ppd->record.make_and_model, ppd->record.device_id, ppd->record.scheme); - return (0); + exit(0); } @@ -1008,7 +1008,7 @@ get_file(const char *name, /* I - Name */ * 'list_ppds()' - List PPD files. */ -static int /* O - Exit code */ +static void list_ppds(int request_id, /* I - Request ID */ int limit, /* I - Limit */ const char *opt) /* I - Option argument */ @@ -1570,7 +1570,7 @@ list_ppds(int request_id, /* I - Request ID */ if (request_id) cupsdSendIPPTrailer(); - return (0); + exit(0); } -- 2.47.3