]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Fix memory leaks found by Coverity (Issue #5375)
authorMichael R Sweet <michael.r.sweet@gmail.com>
Tue, 21 Aug 2018 14:01:44 +0000 (10:01 -0400)
committerMichael R Sweet <michael.r.sweet@gmail.com>
Tue, 21 Aug 2018 14:01:44 +0000 (10:01 -0400)
CHANGES.md
backend/ipp.c
cgi-bin/search.c
cups/http-addrlist.c
cups/http.c
ppdc/ppdc-source.cxx
scheduler/cups-driverd.cxx

index 31b0db0efc3dc531f36e62d2ef8bb0b8c3358c6b..2ee127c1adbafe35f11902a6cdfb0bcf115cce99 100644 (file)
@@ -1,4 +1,4 @@
-CHANGES - 2.3b6 - 2018-08-19
+CHANGES - 2.3b6 - 2018-08-21
 ============================
 
 Changes in CUPS v2.3b6
@@ -21,6 +21,7 @@ Changes in CUPS v2.3b6
 - Fixed some typos in the label printer drivers (Issue #5350)
 - The IPP Everywhere "driver" no longer does local filtering when printing to
   a shared CUPS printer (Issue #5361)
+- Fixed some memory leaks discovered by Coverity (Issue #5375)
 - The scheduler was being backgrounded on macOS, causing applications to spin
   (rdar://40436080)
 - The scheduler did not validate that required initial request attributes were
index 32eb3aaa4bc311e3d6d7998983428455d9589258..2a880bd759f5914ad5479876379121edc0436343 100644 (file)
@@ -3612,6 +3612,8 @@ update_reasons(ipp_attribute_t *attr,     /* I - printer-state-reasons or NULL */
     }
   }
 
+  cupsArrayDelete(new_reasons);
+
   _cupsMutexUnlock(&report_mutex);
 
  /*
index 3956afc33c7e0acb2f8182c00a56d8fb66d19ae3..ad1f5ed0ead0b4e602a0c107c78ff274ef451040 100644 (file)
@@ -1,10 +1,11 @@
 /*
  * Search routines for CUPS.
  *
- * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2007-2018 by Apple Inc.
  * Copyright 1997-2006 by Easy Software Products.
  *
- * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
+ * Licensed under Apache License v2.0.  See the file "LICENSE" for more
+ * information.
  */
 
 /*
@@ -361,4 +362,5 @@ void
 cgiFreeSearch(void *search)            /* I - Search context */
 {
   regfree((regex_t *)search);
+  free(search);
 }
index 5d510140b91a0b1b90135b2cc5b38dca2b8198a6..688901a7dd643464b0eb5b44cb2a47ff670598ef 100644 (file)
@@ -1,10 +1,11 @@
 /*
  * 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.
  *
- * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
+ * Licensed under Apache License v2.0.  See the file "LICENSE" for more
+ * information.
  */
 
 /*
@@ -612,6 +613,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);
          }
index a9235b087008e5a560931e03b341320390ef7f50..d9332cc83130402fac7c8c8f563b7064b4f3bd6e 100644 (file)
@@ -3915,7 +3915,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);
   }
 
index be24cebae893c7a02680902f1e128ccde1f7eb91..4e8cba7bb3472dab415f0e0548a2d67dcbeba8ae 100644 (file)
@@ -1,10 +1,11 @@
 //
 // 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.
 //
-// Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
+// Licensed under Apache License v2.0.  See the file "LICENSE" for more
+// information.
 //
 
 //
@@ -2665,6 +2666,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);
index 657eee0a0ace52c62e07797728bfaf7c000bd3a4..b518a93258178774b839d557560eba3ceabc79c6 100644 (file)
@@ -153,7 +153,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);
@@ -163,12 +163,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,
@@ -204,13 +204,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);
@@ -428,7 +428,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? */
 {
@@ -445,7 +445,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));
@@ -475,11 +475,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
   {
    /*
@@ -517,7 +517,7 @@ cat_ppd(const char *name,           /* I - PPD name */
         cupsdSendIPPTrailer();
       }
 
-      return (1);
+      exit(1);
     }
 
    /*
@@ -547,15 +547,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);
 }
 
 
@@ -778,7 +778,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 */
@@ -810,7 +810,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);
 }
 
 
@@ -1004,7 +1004,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 */
@@ -1566,7 +1566,7 @@ list_ppds(int        request_id,  /* I - Request ID */
   if (request_id)
     cupsdSendIPPTrailer();
 
-  return (0);
+  exit(0);
 }