File libcdio-0.94-leak-04.patch of Package libcdio.7811

Partial patch.
From acf1ff0fcb8cd1ec815709277fa316ca049beb66 Mon Sep 17 00:00:00 2001
From: "R. Bernstein" <rocky@gnu.org>
Date: Mon, 20 Nov 2017 17:56:19 -0500
Subject: [PATCH 4/20] Reduce memory leaks...

remove depricated things in dh.h

Note: a reworking of ds.h is needed to handle data which has alloc memory.
---
 include/cdio/ds.h        | 22 +++++-----------
 lib/driver/device.c      |  3 ++-
 lib/iso9660/iso9660_fs.c | 10 ++++---
 test/testisocd.c         | 57 ++++++++++++++++++++++++++++------------
 4 files changed, 56 insertions(+), 36 deletions(-)

diff --git a/include/cdio/ds.h b/include/cdio/ds.h
index 6662c58a..c56c33c7 100644
--- a/include/cdio/ds.h
+++ b/include/cdio/ds.h
@@ -18,11 +18,11 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-/** \file ds.h 
+/** \file ds.h
  *  \brief  The top-level header for list-related data structures.
 
-    Note: this header will is slated to get removed and libcdio will use 
-    glib.h routines instead. 
+    Note: this header will is slated to get removed and libcdio will use
+    glib.h routines instead.
 */
 
 
@@ -60,11 +53,11 @@ void _cdio_list_prepend (CdioList_t *p_list, void *p_data);
 
 void _cdio_list_append (CdioList_t *p_list, void *p_data);
 
-void _cdio_list_foreach (CdioList_t *p_list, _cdio_list_iterfunc_t func, 
+void _cdio_list_foreach (CdioList_t *p_list, _cdio_list_iterfunc_t func,
                          void *p_user_data);
 
-CdioListNode_t *_cdio_list_find (CdioList_t *p_list, 
-                                 _cdio_list_iterfunc_t cmp_func, 
+CdioListNode_t *_cdio_list_find (CdioList_t *p_list,
+                                 _cdio_list_iterfunc_t cmp_func,
                                  void *p_user_data);
 
 #define _CDIO_LIST_FOREACH(node, list) \
@@ -88,11 +81,10 @@ void *_cdio_list_node_data (CdioListNode_t *p_node);
 
 #endif /* CDIO_DS_H_ */
 
-/* 
+/*
  * Local variables:
  *  c-file-style: "gnu"
  *  tab-width: 8
  *  indent-tabs-mode: nil
  * End:
  */
-
diff --git a/lib/driver/device.c b/lib/driver/device.c
index 8baf9811..12dc9153 100644
--- a/lib/driver/device.c
+++ b/lib/driver/device.c
@@ -31,6 +31,7 @@
 #include <cdio/cd_types.h>
 #include <cdio/logging.h>
 #include "cdio_private.h"
+#include <cdio/util.h>
 #include <cdio/mmc_cmds.h>
 
 #ifdef HAVE_STDLIB_H
@@ -476,7 +477,7 @@ cdio_free_device_list (char * ppsz_device_list[])
     free(*ppsz_device_list);
     *ppsz_device_list = NULL;
   }
-  free(ppsz_device_list_save);
+  CDIO_FREE_IF_NOT_NULL(ppsz_device_list_save);
 }
 
 
diff --git a/lib/iso9660/iso9660_fs.c b/lib/iso9660/iso9660_fs.c
index 2620bdb2..6a781cd3 100644
--- a/lib/iso9660/iso9660_fs.c
+++ b/lib/iso9660/iso9660_fs.c
@@ -16,6 +16,10 @@
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 /* iso9660 filesystem-based routines */
+
+/* FIXME: _cdio_list_free for iso9660 statbuf is insufficient because it doesn't
+   free bits that are allocated inside the data. */
+
 
 #if defined(HAVE_CONFIG_H) && !defined(__CDIO_CONFIG_H__)
 #include "config.h"
@@ -753,7 +757,7 @@ _iso9660_dir_to_statbuf (iso9660_dir_t *p_iso9660_dir, bool_3way_t b_xa,
   uint8_t dir_len= iso9660_get_dir_len(p_iso9660_dir);
   iso711_t i_fname;
   unsigned int stat_len;
-  iso9660_stat_t *p_stat;
+  iso9660_stat_t *p_stat = NULL;
   bool err;
 
   if (!dir_len) return NULL;
@@ -1339,8 +1343,8 @@ iso9660_fs_readdir (CdIo_t *p_cdio, const char psz_path[], bool b_mode2)
 
     cdio_assert (offset == (p_stat->secsize * ISO_BLOCKSIZE));
 
-    free (_dirbuf);
-    free (p_stat);
+    free(_dirbuf);
+    iso9660_stat_free(p_stat);
     return retval;
   }
 }
diff --git a/test/testisocd.c b/test/testisocd.c
index 789d33b1..27ca635b 100644
--- a/test/testisocd.c
+++ b/test/testisocd.c
@@ -1,7 +1,7 @@
-/* 
-  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2011 Rocky Bernstein 
+/*
+  Copyright (C) 2003-2008, 2011, 2017 Rocky Bernstein
   <rocky@gnu.org>
-  
+
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
@@ -47,14 +47,14 @@
 int
 main(int argc, const char *argv[])
 {
-  char **ppsz_cd_drives;  /* List of all drives with an ISO9660 filesystem. */
+  char **ppsz_cd_drives = NULL; /* All drives with an ISO9660 filesystem. */
   driver_id_t driver_id;  /* Driver ID found */
   char *psz_drive;        /* Name of drive */
   CdIo_t *p_cdio;
 
   /* See if we can find a device with a loaded CD-DA in it. If successful
      drive_id will be set.  */
-  ppsz_cd_drives = 
+  ppsz_cd_drives =
     cdio_get_devices_with_cap_ret(NULL, CDIO_FS_ANAL_ISO9660_ANY,
 				  true, &driver_id);
 
@@ -64,15 +64,19 @@ main(int argc, const char *argv[])
     psz_drive = strdup(ppsz_cd_drives[0]);
     /* Don't need a list of CD's with CD-DA's any more. */
     cdio_free_device_list(ppsz_cd_drives);
+    ppsz_cd_drives = NULL;
   } else {
     printf("-- Unable find or access a CD-ROM drive with an ISO-9660 "
 	   "filesystem.\n");
+    if (ppsz_cd_drives)
+      cdio_free_device_list(ppsz_cd_drives);
     exit(SKIP_TEST_RC);
   }
 
   p_cdio = cdio_open (psz_drive, driver_id);
   if (!p_cdio) {
     fprintf(stderr, "Sorry, couldn't open %s\n", psz_drive);
+    free(psz_drive);
     return 1;
   } else {
     /* You make get different results looking up "/" versus "/." and the
@@ -81,38 +85,53 @@ main(int argc, const char *argv[])
        find "." and in that Rock-Ridge information might be found which fills
        in more stat information that iso9660_fs_find_lsn also will find.
        . Ideally iso9660_fs_stat should be fixed. */
-       iso9660_stat_t *p_statbuf = iso9660_fs_stat (p_cdio, "/.");
+    iso9660_stat_t *p_statbuf = iso9660_fs_stat (p_cdio, "/.");
 
+    free(psz_drive);
     if (NULL == p_statbuf) {
-      fprintf(stderr, 
+      fprintf(stderr,
 	      "Could not get ISO-9660 file information for file /.\n");
       cdio_destroy(p_cdio);
       exit(2);
     } else {
       /* Now try getting the statbuf another way */
+
       char buf[ISO_BLOCKSIZE];
       char *psz_path = NULL;
       const lsn_t i_lsn = p_statbuf->lsn;
-      const iso9660_stat_t *p_statbuf2 = iso9660_fs_find_lsn (p_cdio, i_lsn);
-      const iso9660_stat_t *p_statbuf3 = 
+      iso9660_stat_t *p_statbuf2 = iso9660_fs_find_lsn (p_cdio, i_lsn);
+
+      /*
+	 // FIXME: This is for memory testing. iso966_stat_free leaves
+         // around junk. Some if it is in a faulty cdio_list_free() routine.
+         iso9660_stat_free(p_statbuf);
+         iso9660_stat_free(p_statbuf2);
+         cdio_destroy(p_cdio);
+         return 0;
+      */
+
+      iso9660_stat_t *p_statbuf3 =
 	iso9660_fs_find_lsn_with_path (p_cdio, i_lsn, &psz_path);
 
       /* Compare the two statbufs. */
-#if 0
-      if (0 != memcmp(p_statbuf, p_statbuf2, sizeof(iso9660_stat_t))) {
-#else
-      if (p_statbuf->lsn != p_statbuf2->lsn || 
+      if (p_statbuf->lsn != p_statbuf2->lsn ||
 	  p_statbuf->size != p_statbuf2->size ||
 	  p_statbuf->type != p_statbuf2->type) {
-#endif
 	  fprintf(stderr, "File stat information between fs_stat and "
 		  "fs_find_lsn isn't the same\n");
+
+	  iso9660_stat_free(p_statbuf);
+	  iso9660_stat_free(p_statbuf2);
+	  cdio_destroy(p_cdio);
 	  exit(3);
       }
 
       if (0 != memcmp(p_statbuf3, p_statbuf2, sizeof(iso9660_stat_t))) {
 	  fprintf(stderr, "File stat information between fs_find_lsn and "
 		  "fs_find_lsn_with_path isn't the same\n");
+	  iso9660_stat_free(p_statbuf2);
+	  iso9660_stat_free(p_statbuf3);
+	  cdio_destroy(p_cdio);
 	  exit(4);
       }
 
@@ -120,25 +139,29 @@ main(int argc, const char *argv[])
 	if (0 != strncmp("/./", psz_path, strlen("/./"))) {
 	  fprintf(stderr, "Path returned for fs_find_lsn_with_path "
 		  "is not correct should be /./, is %s\n", psz_path);
-	  exit(5);
 	  free(psz_path);
+	  cdio_destroy(p_cdio);
+	  exit(5);
 	}
       } else {
 	fprintf(stderr, "Path returned for fs_find_lsn_with_path is NULL\n");
+	cdio_destroy(p_cdio);
 	exit(6);
       }
-      
+
       /* Try reading from the directory. */
       memset (buf, 0, ISO_BLOCKSIZE);
       if ( 0 != cdio_read_data_sectors (p_cdio, buf, i_lsn, ISO_BLOCKSIZE, 1) )
 	{
 	  fprintf(stderr, "Error reading ISO 9660 file at lsn %lu\n",
 		  (long unsigned int) p_statbuf->lsn);
+	  iso9660_stat_free(p_statbuf);
+	  cdio_destroy(p_cdio);
 	  exit(7);
 	}
       exit(0);
     }
   }
-  
+
   exit(0);
 }
-- 
2.17.0
openSUSE Build Service is sponsored by