File libcdio-0.94-leak-08.patch of Package libcdio.24379
Partial patch.
The original commit breaks API and ABI. This patch extracts only leak
fixes.
From bf7ee89d6eb22887f356d90d03c03e4255dd236f Mon Sep 17 00:00:00 2001
From: "R. Bernstein" <rocky@gnu.org>
Date: Thu, 30 Nov 2017 06:38:17 -0500
Subject: [PATCH 8/20] Lots of cleanups...
isio9660.h, iso9660.c, iso9660.hpp
remove mode2 from is9660_fs_stat_translate() and in C++ version
go over doxygen comments. (More is needed)
iso-info.c, cd-info.c: use alloca() instead of malloc() where possible
test/Mamefile.am: correct remake comments for check-leaks
testisocd2.c: make leak free
iso9660_fs.c: fix memory leak in iso9660_ifs_find_lsn
---
configure.ac | 2 +-
include/cdio++/iso9660.hpp | 14 ++--
include/cdio/iso9660.h | 112 +++++++++++++++++++++++------
lib/cdio++/iso9660.cpp | 8 +--
lib/iso9660/iso9660_fs.c | 144 ++++++++++++++++++++++++++++++-------
src/cd-info.c | 12 ++--
test/Makefile.am | 2 +-
test/driver/Makefile.am | 2 +-
test/testisocd2.c | 13 ++--
9 files changed, 231 insertions(+), 78 deletions(-)
Index: libcdio-0.94/lib/iso9660/iso9660_fs.c
===================================================================
--- libcdio-0.94.orig/lib/iso9660/iso9660_fs.c
+++ libcdio-0.94/lib/iso9660/iso9660_fs.c
@@ -1527,8 +1527,12 @@ iso9660_stat_t *
iso9660_ifs_find_lsn(iso9660_t *p_iso, lsn_t i_lsn)
{
char *psz_full_filename = NULL;
- return find_lsn_recurse (p_iso, (iso9660_readdir_t *) iso9660_ifs_readdir,
- "/", i_lsn, &psz_full_filename);
+ iso9660_stat_t *ret =
+ find_lsn_recurse (p_iso, (iso9660_readdir_t *) iso9660_ifs_readdir,
+ "/", i_lsn, &psz_full_filename);
+ if (psz_full_filename != NULL)
+ free(psz_full_filename);
+ return ret;
}
/*!
@@ -1547,6 +1551,9 @@ iso9660_ifs_find_lsn_with_path(iso9660_t
/*!
Free the passed iso9660_stat_t structure.
+
+ @param p_stat iso9660 stat buffer to free.
+
*/
void
iso9660_stat_free(iso9660_stat_t *p_stat)
Index: libcdio-0.94/src/cd-info.c
===================================================================
--- libcdio-0.94.orig/src/cd-info.c
+++ libcdio-0.94/src/cd-info.c
@@ -68,6 +68,10 @@
#include <errno.h>
#endif
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
+
#define STRONG "__________________________________\n"
#define NORMAL ""
@@ -543,7 +547,7 @@ print_iso9660_recurse (CdIo_t *p_cdio, c
CdioList_t *p_dirlist = _cdio_list_new ();
CdioListNode_t *entnode;
uint8_t i_joliet_level;
- char *translated_name = (char *) malloc(4096);
+ char *translated_name = (char *) alloca(4096);
size_t translated_name_size = 4096;
i_joliet_level = (opts.no_joliet)
@@ -556,7 +560,6 @@ print_iso9660_recurse (CdIo_t *p_cdio, c
if (NULL == p_entlist) {
report( stderr, "Error getting above directory information\n" );
- free(translated_name);
free(p_dirlist);
return;
}
@@ -570,8 +573,6 @@ print_iso9660_recurse (CdIo_t *p_cdio, c
char _fullname[4096] = { 0, };
if (strlen(psz_iso_name) >= translated_name_size) {
translated_name_size = strlen(psz_iso_name)+1;
- free(translated_name);
- translated_name = (char *) malloc(translated_name_size);
if (!translated_name) {
report( stderr, "Error allocating memory\n" );
_cdio_list_free3 (p_dirlist, true, free);
@@ -603,7 +604,6 @@ print_iso9660_recurse (CdIo_t *p_cdio, c
p_statbuf->rr.i_symlink = 0;
}
}
- free (translated_name);
_cdio_list_free3 (p_entlist, true, (CdioDataFree_t) iso9660_stat_free);
Index: libcdio-0.94/test/testisocd2.c
===================================================================
--- libcdio-0.94.orig/test/testisocd2.c
+++ libcdio-0.94/test/testisocd2.c
@@ -134,7 +134,6 @@ main(int argc, const char *argv[])
rc = 5;
goto exit;
}
- free(psz_path);
} else {
fprintf(stderr, "Path returned for fs_find_lsn_with_path is NULL\n");
rc = 6;
@@ -152,11 +151,13 @@ main(int argc, const char *argv[])
goto exit;
}
exit:
- iso9660_stat_free(p_statbuf2);
- iso9660_stat_free(p_statbuf3);
- iso9660_stat_free(p_statbuf);
- iso9660_close(p_iso);
- exit(rc);
+ if (psz_path != NULL)
+ free(psz_path);
+ iso9660_stat_free(p_statbuf2);
+ iso9660_stat_free(p_statbuf3);
+ iso9660_stat_free(p_statbuf);
+ iso9660_close(p_iso);
+ exit(rc);
}
}