File libcdio-0.94-leak-07.patch of Package libcdio.24379
Backport.
The original commit breaks API and ABI.
The new 3-arg forms are renamed:
_cdio_list_node_free -> _cdio_list_node_free3
_cdio_list_free -> _cdio_list_free3
To use the new form, program has to use
+#define CDIO_API18
From 73800fc0cd81a735764f79b7f3f957d8a71eb02c Mon Sep 17 00:00:00 2001
From: "R. Bernstein" <rocky@gnu.org>
Date: Tue, 28 Nov 2017 23:39:14 -0500
Subject: [PATCH 7/20] WIP: deal with memory leaks from cdio_lists
TODO:
* create function for dirlist free; is:
_cdio_list_free (dirlist, true, free);
* create function for statbuf free; is:
_cdio_list_free (entlist, true, (CdioDataFree_t) iso9660_stat_free);
* Add targets to run valgrind to look for memory leaks
* Fix remaining memory leaks
---
configure.ac | 2 +-
example/extract.c | 4 +-
example/isofuzzy.c | 26 +++---
example/isolist.c | 29 +++----
example/udf1.c | 2 +-
example/udffile.c | 44 +++++-----
include/cdio++/iso9660.hpp | 174 ++++++++++++++++++-------------------
include/cdio/ds.h | 5 +-
include/cdio/types.h | 4 +
lib/cdio++/iso9660.cpp | 106 +++++++++++-----------
lib/driver/_cdio_stream.c | 2 +-
lib/driver/ds.c | 11 +--
lib/driver/image/nrg.c | 5 +-
lib/iso9660/iso9660_fs.c | 29 ++++---
src/cd-info.c | 8 +-
src/iso-info.c | 28 +++---
test/testisocd2.c | 34 +++++---
17 files changed, 263 insertions(+), 250 deletions(-)
Index: libcdio-0.94/configure.ac
===================================================================
--- libcdio-0.94.orig/configure.ac
+++ libcdio-0.94/configure.ac
@@ -190,7 +190,7 @@ AC_DEFINE(LIBCDIO_CONFIG_H, 1,
dnl headers
AC_HEADER_STDC
-AC_CHECK_HEADERS(errno.h fcntl.h glob.h limits.h pwd.h stdbool.h)
+AC_CHECK_HEADERS(alloca.h errno.h fcntl.h glob.h limits.h pwd.h stdbool.h)
AC_CHECK_HEADERS(stdarg.h stdbool.h stdio.h sys/cdio.h sys/param.h \
sys/time.h sys/timeb.h sys/utsname.h)
Index: libcdio-0.94/example/extract.c
===================================================================
--- libcdio-0.94.orig/example/extract.c
+++ libcdio-0.94/example/extract.c
@@ -1,6 +1,6 @@
/*
Copyright (C) 2012 Pete Batard <pete@akeo.ie>
- Based on samples copyright (c) 2003-2011 Rocky Bernstein <rocky@gnu.org>
+ Based on samples copyright (c) 2003-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
@@ -20,6 +20,8 @@
TODO: timestamp preservation, file permissions, Unicode
*/
+#define CDIO_API18
+
/* To handle files > 2 GB, we may need the Large File Support settings
defined in config.h. Comes first, as stdio.h depends on it. */
#ifdef HAVE_CONFIG_H
@@ -236,7 +238,7 @@ static int iso_extract_files(iso9660_t*
out:
if (fd != NULL)
fclose(fd);
- _cdio_list_free(p_entlist, true);
+ _cdio_list_free(p_entlist, true, (CdioDataFree_t) iso9660_stat_free);
return r;
}
Index: libcdio-0.94/example/isofuzzy.c
===================================================================
--- libcdio-0.94.orig/example/isofuzzy.c
+++ libcdio-0.94/example/isofuzzy.c
@@ -1,6 +1,6 @@
/*
- Copyright (C) 2005, 2008, 2009 Rocky Bernstein <rocky@gnu.org>
-
+ Copyright (C) 2005, 2008, 2009, 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
@@ -22,6 +22,8 @@
name.
*/
+#define CDIO_API18
+
/* This is the BIN we think there is an ISO 9660 image inside of. */
#define ISO9660_IMAGE_PATH "/tmp/"
#define ISO9660_IMAGE ISO9660_IMAGE_PATH "vcd_demo.bin"
@@ -55,39 +57,39 @@
int
main(int argc, const char *argv[])
{
- CdioList_t *entlist;
+ CdioList_t *p_entlist;
CdioListNode_t *entnode;
char const *psz_fname;
iso9660_t *p_iso;
- if (argc > 1)
+ if (argc > 1)
psz_fname = argv[1];
- else
+ else
psz_fname = ISO9660_IMAGE;
p_iso = iso9660_open_fuzzy (psz_fname, 5);
-
+
if (NULL == p_iso) {
- fprintf(stderr, "-- Sorry, could not find an ISO 9660 image from %s\n",
+ fprintf(stderr, "-- Sorry, could not find an ISO 9660 image from %s\n",
psz_fname);
return 1;
}
- entlist = iso9660_ifs_readdir (p_iso, "/");
-
+ p_entlist = iso9660_ifs_readdir (p_iso, "/");
+
/* Iterate over the list of nodes that iso9660_ifs_readdir gives */
- if (entlist) {
- _CDIO_LIST_FOREACH (entnode, entlist)
+ if (p_entlist) {
+ _CDIO_LIST_FOREACH (entnode, p_entlist)
{
char filename[4096];
- iso9660_stat_t *p_statbuf =
+ iso9660_stat_t *p_statbuf =
(iso9660_stat_t *) _cdio_list_node_data (entnode);
iso9660_name_translate(p_statbuf->filename, filename);
printf ("-- /%s\n", filename);
}
- _cdio_list_free (entlist, true);
+ _cdio_list_free(p_entlist, true, (CdioDataFree_t) iso9660_stat_free);
}
iso9660_close(p_iso);
Index: libcdio-0.94/example/isolist.c
===================================================================
--- libcdio-0.94.orig/example/isolist.c
+++ libcdio-0.94/example/isolist.c
@@ -1,7 +1,7 @@
/*
Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011
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
@@ -25,6 +25,8 @@
name (that comes with the libcdio distribution) will be used.
*/
+#define CDIO_API18
+
/* Set up a CD-DA image to test on which is in the libcdio distribution. */
#define ISO9660_IMAGE_PATH "../test/"
#define ISO9660_IMAGE ISO9660_IMAGE_PATH "copying.iso"
@@ -58,7 +60,7 @@
printf(title ": %s\n", psz_str); \
} \
free(psz_str); \
- psz_str = NULL;
+ psz_str = NULL;
int
@@ -70,15 +72,15 @@ main(int argc, const char *argv[])
iso9660_t *p_iso;
const char *psz_path="/";
- if (argc > 1)
+ if (argc > 1)
psz_fname = argv[1];
- else
+ else
psz_fname = ISO9660_IMAGE;
p_iso = iso9660_open (psz_fname);
-
+
if (NULL == p_iso) {
- fprintf(stderr, "Sorry, couldn't open %s as an ISO-9660 image\n",
+ fprintf(stderr, "Sorry, couldn't open %s as an ISO-9660 image\n",
psz_fname);
return 1;
}
@@ -93,28 +95,27 @@ main(int argc, const char *argv[])
print_vd_info("Volume ", iso9660_ifs_get_volume_id);
print_vd_info("Volume Set ", iso9660_ifs_get_volumeset_id);
}
-
+
p_entlist = iso9660_ifs_readdir (p_iso, psz_path);
-
+
/* Iterate over the list of nodes that iso9660_ifs_readdir gives */
-
+
if (p_entlist) {
_CDIO_LIST_FOREACH (p_entnode, p_entlist)
{
char filename[4096];
- iso9660_stat_t *p_statbuf =
+ iso9660_stat_t *p_statbuf =
(iso9660_stat_t *) _cdio_list_node_data (p_entnode);
iso9660_name_translate(p_statbuf->filename, filename);
- printf ("%s [LSN %6d] %8u %s%s\n",
+ printf ("%s [LSN %6d] %8u %s%s\n",
_STAT_DIR == p_statbuf->type ? "d" : "-",
p_statbuf->lsn, p_statbuf->size, psz_path, filename);
}
-
- _cdio_list_free (p_entlist, true);
+
+ _cdio_list_free(p_entlist, true, (CdioDataFree_t) iso9660_stat_free);
}
-
+
iso9660_close(p_iso);
return 0;
}
-
Index: libcdio-0.94/example/udf1.c
===================================================================
--- libcdio-0.94.orig/example/udf1.c
+++ libcdio-0.94/example/udf1.c
@@ -21,7 +21,7 @@
/* This is the UDF image. */
#define UDF_IMAGE_PATH "../"
-#define UDF_IMAGE "/src2/cd-images/udf/UDF102ISO.iso"
+#define UDF_IMAGE "../test/data/udf102.iso"
#ifdef HAVE_CONFIG_H
#include "config.h"
Index: libcdio-0.94/example/udffile.c
===================================================================
--- libcdio-0.94.orig/example/udffile.c
+++ libcdio-0.94/example/udffile.c
@@ -1,7 +1,7 @@
/*
- Copyright (C) 2005, 2006, 2008, 2009, 2010, 2011
+ Copyright (C) 2005, 2006, 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
@@ -18,7 +18,7 @@
/* Simple program to show using libudf to extract a file.
- This program can be compiled with either a C or C++ compiler. In
+ This program can be compiled with either a C or C++ compiler. In
the distribution we prefer C++ just to make sure we haven't broken
things on the C++ side.
*/
@@ -32,7 +32,7 @@
/* This is the UDF image. */
#define UDF_IMAGE_PATH "../"
-#define UDF_IMAGE "../test/udf102.iso"
+#define UDF_IMAGE "../test/data/udf102.iso"
#define UDF_FILENAME "/COPYING"
#define LOCAL_FILENAME "copying"
@@ -71,48 +71,52 @@ main(int argc, const char *argv[])
char const *psz_udf_fname;
char const *psz_local_fname;
- if (argc > 1)
+ if (argc > 1)
psz_udf_image = argv[1];
- else
+ else
psz_udf_image = UDF_IMAGE;
- if (argc > 2)
+ if (argc > 2)
psz_udf_fname = argv[2];
- else
+ else
psz_udf_fname = UDF_FILENAME;
- if (argc > 3)
+ if (argc > 3)
psz_local_fname = argv[3];
- else
+ else
psz_local_fname = LOCAL_FILENAME;
p_udf = udf_open (psz_udf_image);
-
+
if (NULL == p_udf) {
- fprintf(stderr, "Sorry, couldn't open %s as something using UDF\n",
+ fprintf(stderr, "Sorry, couldn't open %s as something using UDF\n",
psz_udf_image);
return 1;
} else {
udf_dirent_t *p_udf_root = udf_get_root(p_udf, true, 0);
udf_dirent_t *p_udf_file = NULL;
if (NULL == p_udf_root) {
- fprintf(stderr, "Sorry, couldn't find / in %s\n",
+ fprintf(stderr, "Sorry, couldn't find / in %s\n",
psz_udf_image);
+ udf_close(p_udf);
return 1;
}
-
+
p_udf_file = udf_fopen(p_udf_root, psz_udf_fname);
if (!p_udf_file) {
- fprintf(stderr, "Sorry, couldn't find %s in %s\n",
+ fprintf(stderr, "Sorry, couldn't find %s in %s\n",
psz_udf_fname, psz_udf_image);
+ udf_close(p_udf);
return 2;
-
+
}
if (!(p_outfd = fopen (psz_local_fname, "wb")))
{
perror ("fopen()");
+ udf_close(p_udf);
+ udf_dirent_free(p_udf_file);
return 3;
}
@@ -139,6 +143,7 @@ main(int argc, const char *argv[])
}
fflush (p_outfd);
+ udf_dirent_free(p_udf_file);
udf_dirent_free(p_udf_root);
udf_close(p_udf);
/* Make sure the file size has the exact same byte size. Without the
@@ -146,12 +151,11 @@ main(int argc, const char *argv[])
*/
if (ftruncate (fileno (p_outfd), i_file_length))
perror ("ftruncate()");
-
- printf("Extraction of file '%s' from %s successful.\n",
+
+ printf("Extraction of file '%s' from %s successful.\n",
psz_local_fname, psz_udf_image);
-
+
return 0;
}
}
}
-
Index: libcdio-0.94/include/cdio++/iso9660.hpp
===================================================================
--- libcdio-0.94.orig/include/cdio++/iso9660.hpp
+++ libcdio-0.94/include/cdio++/iso9660.hpp
@@ -48,68 +48,68 @@ public:
{
memset(&pvd, 0, sizeof(pvd));
}
-
+
PVD(iso9660_pvd_t *p_new_pvd)
- {
+ {
memcpy(&pvd, p_new_pvd, sizeof(pvd));
};
/*!
Return the PVD's application ID.
- NULL is returned if there is some problem in getting this.
+ NULL is returned if there is some problem in getting this.
*/
char * get_application_id();
-
+
int get_pvd_block_size();
-
+
/*!
Return the PVD's preparer ID.
- NULL is returned if there is some problem in getting this.
+ NULL is returned if there is some problem in getting this.
*/
char * get_preparer_id();
-
+
/*!
Return the PVD's publisher ID.
- NULL is returned if there is some problem in getting this.
+ NULL is returned if there is some problem in getting this.
*/
char * get_publisher_id();
-
+
const char *get_pvd_id();
-
+
int get_pvd_space_size();
-
+
uint8_t get_pvd_type();
-
+
/*! Return the primary volume id version number (of pvd).
- If there is an error 0 is returned.
+ If there is an error 0 is returned.
*/
int get_pvd_version();
-
+
/*! Return the LSN of the root directory for pvd.
- If there is an error CDIO_INVALID_LSN is returned.
+ If there is an error CDIO_INVALID_LSN is returned.
*/
lsn_t get_root_lsn();
-
+
/*!
Return the PVD's system ID.
- NULL is returned if there is some problem in getting this.
+ NULL is returned if there is some problem in getting this.
*/
char * get_system_id();
-
+
/*!
Return the PVD's volume ID.
- NULL is returned if there is some problem in getting this.
+ NULL is returned if there is some problem in getting this.
*/
char * get_volume_id();
-
+
/*!
Return the PVD's volumeset ID.
- NULL is returned if there is some problem in getting this.
+ NULL is returned if there is some problem in getting this.
*/
char * get_volumeset_id();
-
+
};
-
+
class Stat // ISO 9660 file information
{
public:
@@ -118,37 +118,37 @@ public:
typedef vector< ISO9660::Stat *> stat_vector_t;
Stat(iso9660_stat_t *p_new_stat)
- {
+ {
p_stat = p_new_stat;
};
- Stat(const Stat& copy_in)
+ Stat(const Stat& copy_in)
{
free(p_stat);
- p_stat = (iso9660_stat_t *)
- calloc( 1, sizeof(iso9660_stat_t)
+ p_stat = (iso9660_stat_t *)
+ calloc( 1, sizeof(iso9660_stat_t)
+ strlen(copy_in.p_stat->filename)+1 );
p_stat = copy_in.p_stat;
}
-
- const Stat& operator= (const Stat& right)
+
+ const Stat& operator= (const Stat& right)
{
free(p_stat);
this->p_stat = right.p_stat;
return right;
}
-
- ~Stat()
+
+ ~Stat()
{
iso9660_stat_free(p_stat);
p_stat = NULL;
}
-
+
};
#ifdef FS
#undef FS
-#endif
+#endif
class FS : public CdioDevice // ISO 9660 Filesystem on a CD or CD-image
{
public:
@@ -158,7 +158,7 @@ public:
/*!
Given a directory pointer, find the filesystem entry that contains
lsn and return information about it.
-
+
@return Stat * of entry if we found lsn, or NULL otherwise.
Caller must release returned object using delete when done.
*/
@@ -170,8 +170,8 @@ public:
PVD *read_pvd ();
/*!
- Read the Super block of an ISO 9660 image. This is the
- Primary Volume Descriptor (PVD) and perhaps a Supplemental Volume
+ Read the Super block of an ISO 9660 image. This is the
+ Primary Volume Descriptor (PVD) and perhaps a Supplemental Volume
Descriptor if (Joliet) extensions are acceptable.
*/
bool read_superblock (iso_extension_mask_t iso_extension_mask);
@@ -186,29 +186,29 @@ public:
/*!
Return file status for path name psz_path. NULL is returned on
error.
-
+
If translate is true, version numbers in the ISO 9660 name are
dropped, i.e. ;1 is removed and if level 1 ISO-9660 names are
lowercased.
-
+
Mode2 is used only if translate is true and is a hack that
really should go away in libcdio sometime. If set use mode 2
reading, otherwise use mode 1 reading.
-
+
@return file status object for psz_path. NULL is returned on
error. Caller must release returned object using delete when done.
*/
Stat *
stat (const char psz_path[], bool b_translate=false, bool b_mode2=false)
{
- if (b_translate)
- return new Stat(iso9660_fs_stat_translate (p_cdio, psz_path,
+ if (b_translate)
+ return new Stat(iso9660_fs_stat_translate (p_cdio, psz_path,
b_mode2));
- else
+ else
return new Stat(iso9660_fs_stat (p_cdio, psz_path));
}
};
-
+
class IFS // ISO 9660 filesystem image
{
public:
@@ -216,20 +216,20 @@ public:
typedef vector< ISO9660::Stat *> stat_vector_t;
IFS()
- {
- p_iso9660=NULL;
+ {
+ p_iso9660=NULL;
};
- ~IFS()
- {
- iso9660_close(p_iso9660);
+ ~IFS()
+ {
+ iso9660_close(p_iso9660);
p_iso9660 = (iso9660_t *) NULL;
};
-
+
/*! Close previously opened ISO 9660 image and free resources
associated with the image. Call this when done using using an ISO
9660 image.
-
+
@return true is unconditionally returned. If there was an error
false would be returned.
*/
@@ -238,45 +238,45 @@ public:
/*!
Given a directory pointer, find the filesystem entry that contains
lsn and return information about it.
-
+
Returns Stat* of entry if we found lsn, or NULL otherwise.
Caller must release returned object using delete when done.
*/
Stat *find_lsn(lsn_t i_lsn);
- /*!
+ /*!
Get the application ID. psz_app_id is set to NULL if there
is some problem in getting this and false is returned.
*/
- bool get_application_id(/*out*/ char * &psz_app_id)
+ bool get_application_id(/*out*/ char * &psz_app_id)
{
return iso9660_ifs_get_application_id(p_iso9660, &psz_app_id);
}
-
- /*!
- Return the Joliet level recognized.
+
+ /*!
+ Return the Joliet level recognized.
*/
uint8_t get_joliet_level();
-
- /*!
+
+ /*!
Get the preparer ID. psz_preparer_id is set to NULL if there
is some problem in getting this and false is returned.
*/
- bool get_preparer_id(/*out*/ char * &psz_preparer_id)
+ bool get_preparer_id(/*out*/ char * &psz_preparer_id)
{
return iso9660_ifs_get_preparer_id(p_iso9660, &psz_preparer_id);
}
- /*!
+ /*!
Get the publisher ID. psz_publisher_id is set to NULL if there
is some problem in getting this and false is returned.
*/
- bool get_publisher_id(/*out*/ char * &psz_publisher_id)
+ bool get_publisher_id(/*out*/ char * &psz_publisher_id)
{
return iso9660_ifs_get_publisher_id(p_iso9660, &psz_publisher_id);
}
-
- /*!
+
+ /*!
Get the system ID. psz_system_id is set to NULL if there
is some problem in getting this and false is returned.
*/
@@ -284,21 +284,21 @@ public:
{
return iso9660_ifs_get_system_id(p_iso9660, &psz_system_id);
}
-
+
/*! Return the volume ID in the PVD. psz_volume_id is set to
NULL if there is some problem in getting this and false is
returned.
*/
- bool get_volume_id(/*out*/ char * &psz_volume_id)
+ bool get_volume_id(/*out*/ char * &psz_volume_id)
{
return iso9660_ifs_get_volume_id(p_iso9660, &psz_volume_id);
}
-
+
/*! Return the volumeset ID in the PVD. psz_volumeset_id is set to
NULL if there is some problem in getting this and false is
returned.
*/
- bool get_volumeset_id(/*out*/ char * &psz_volumeset_id)
+ bool get_volumeset_id(/*out*/ char * &psz_volumeset_id)
{
return iso9660_ifs_get_volumeset_id(p_iso9660, &psz_volumeset_id);
}
@@ -312,16 +312,16 @@ public:
have a mode. NULL is returned on error. An open routine should be
called before using any read routine. If device object was
previously opened it is closed first.
-
+
@param psz_path location of ISO 9660 image
@param iso_extension_mask the kinds of ISO 9660 extensions will be
considered on access.
-
+
@return true if open succeeded or false if error.
-
+
@see open_fuzzy
*/
- bool open(const char *psz_path,
+ bool open(const char *psz_path,
iso_extension_mask_t iso_extension_mask=ISO_EXTENSION_NONE)
{
if (p_iso9660) iso9660_close(p_iso9660);
@@ -334,10 +334,10 @@ public:
checks. This may be useful when trying to read an ISO 9660 image
contained in a file format that libiso9660 doesn't know natively
(or knows imperfectly.)
-
+
Maybe in the future we will have a mode. NULL is returned on
error.
-
+
@see open
*/
bool open_fuzzy (const char *psz_path,
@@ -349,7 +349,7 @@ public:
PVD object is returned if read, and NULL if there was an error.
*/
PVD *read_pvd ();
-
+
/*!
Read the Super block of an ISO 9660 image but determine framesize
and datastart and a possible additional offset. Generally here we are
@@ -370,7 +370,7 @@ public:
@see read_superblock
*/
- bool
+ bool
read_superblock_fuzzy (iso_extension_mask_t iso_extension_mask
=ISO_EXTENSION_NONE,
uint16_t i_fuzz=20);
@@ -379,18 +379,18 @@ public:
pointers for the files inside that directory. The caller must free
the returned result.
*/
- bool readdir (const char psz_path[], stat_vector_t& stat_vector)
+ bool readdir (const char psz_path[], stat_vector_t& stat_vector)
{
CdioList_t *p_stat_list = iso9660_ifs_readdir (p_iso9660, psz_path);
-
+
if (p_stat_list) {
CdioListNode_t *p_entnode;
_CDIO_LIST_FOREACH (p_entnode, p_stat_list) {
- iso9660_stat_t *p_statbuf =
+ iso9660_stat_t *p_statbuf =
(iso9660_stat_t *) _cdio_list_node_data (p_entnode);
stat_vector.push_back(new ISO9660::Stat(p_statbuf));
}
- _cdio_list_free (p_stat_list, false);
+ _cdio_list_free (p_stat_list, false, (CdioDataFree_t) iso9660_stat_free);
return true;
} else {
return false;
@@ -400,25 +400,25 @@ public:
/*!
Seek to a position and then read n bytes. Size read is returned.
*/
- long int
- seek_read (void *ptr, lsn_t start, long int i_size=1)
+ long int
+ seek_read (void *ptr, lsn_t start, long int i_size=1)
{
return iso9660_iso_seek_read (p_iso9660, ptr, start, i_size);
}
-
- /*!
+
+ /*!
Return file status for pathname. NULL is returned on error.
Caller must release returned object using delete when done.
*/
Stat *
- stat (const char psz_path[], bool b_translate=false)
+ stat (const char psz_path[], bool b_translate=false)
{
- if (b_translate)
+ if (b_translate)
return new Stat(iso9660_ifs_stat_translate (p_iso9660, psz_path));
- else
+ else
return new Stat(iso9660_ifs_stat (p_iso9660, psz_path));
}
-
+
private:
iso9660_t *p_iso9660;
};
Index: libcdio-0.94/include/cdio/ds.h
===================================================================
--- libcdio-0.94.orig/include/cdio/ds.h
+++ libcdio-0.94/include/cdio/ds.h
@@ -50,6 +50,7 @@ extern "C" {
/** methods */
CdioList_t *_cdio_list_new (void);
+void _cdio_list_free3 (CdioList_t *p_list, int free_data, CdioDataFree_t free_fn);
void _cdio_list_free (CdioList_t *p_list, int free_data);
unsigned _cdio_list_length (const CdioList_t *list);
@@ -76,10 +77,17 @@ CdioListNode_t *_cdio_list_end (CdioList
CdioListNode_t *_cdio_list_node_next (CdioListNode_t *p_node);
-void _cdio_list_node_free (CdioListNode_t *p_node, int i_free_data);
+ void _cdio_list_node_free3 (CdioListNode_t *p_node, int i_free_data,
+ CdioDataFree_t free_fn);
+ void _cdio_list_node_free (CdioListNode_t *p_node, int i_free_data);
void *_cdio_list_node_data (CdioListNode_t *p_node);
+#ifdef CDIO_API18
+#define _cdio_list_free _cdio_list_free3
+#define _cdio_list_node_free _cdio_list_node_free3
+#endif
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
Index: libcdio-0.94/include/cdio/types.h
===================================================================
--- libcdio-0.94.orig/include/cdio/types.h
+++ libcdio-0.94/include/cdio/types.h
@@ -335,6 +335,10 @@ typedef uint8_t ubyte;
CDIO_TRACK_FLAG_SCMS = 0x10 /**< SCMS (5.29.2.7) */
} cdio_track_flag;
+
+/* Note that this matches the free() prototype.*/
+typedef void (*CdioDataFree_t)(void *ptr);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
Index: libcdio-0.94/lib/cdio++/iso9660.cpp
===================================================================
--- libcdio-0.94.orig/lib/cdio++/iso9660.cpp
+++ libcdio-0.94/lib/cdio++/iso9660.cpp
@@ -15,6 +15,8 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#define CDIO_API18
+
#ifdef HAVE_CONFIG_H
# include "config.h"
# define __CDIO_CONFIG_H__ 1
@@ -29,12 +31,12 @@
/*!
Given a directory pointer, find the filesystem entry that contains
lsn and return information about it.
-
+
@return Stat * of entry if we found lsn, or NULL otherwise.
Caller must release returned object using delete when done.
*/
ISO9660::Stat *
-ISO9660::FS::find_lsn(lsn_t i_lsn)
+ISO9660::FS::find_lsn(lsn_t i_lsn)
{
return new Stat(iso9660_find_fs_lsn(p_cdio, i_lsn));
}
@@ -55,12 +57,12 @@ ISO9660::FS::read_pvd ()
}
/*!
- Read the Super block of an ISO 9660 image. This is the
- Primary Volume Descriptor (PVD) and perhaps a Supplemental Volume
+ Read the Super block of an ISO 9660 image. This is the
+ Primary Volume Descriptor (PVD) and perhaps a Supplemental Volume
Descriptor if (Joliet) extensions are acceptable.
*/
-bool
-ISO9660::FS::read_superblock (iso_extension_mask_t iso_extension_mask)
+bool
+ISO9660::FS::read_superblock (iso_extension_mask_t iso_extension_mask)
{
return iso9660_fs_read_superblock (p_cdio, iso_extension_mask);
}
@@ -69,20 +71,20 @@ ISO9660::FS::read_superblock (iso_extens
pointers for the files inside that directory. The caller must free the
returned result.
*/
-bool
+bool
ISO9660::FS::readdir (const char psz_path[], stat_vector_t& stat_vector,
bool b_mode2)
{
- CdioList_t * p_stat_list = iso9660_fs_readdir (p_cdio, psz_path,
+ CdioList_t * p_stat_list = iso9660_fs_readdir (p_cdio, psz_path,
b_mode2);
if (p_stat_list) {
CdioListNode_t *p_entnode;
_CDIO_LIST_FOREACH (p_entnode, p_stat_list) {
- iso9660_stat_t *p_statbuf =
+ iso9660_stat_t *p_statbuf =
(iso9660_stat_t *) _cdio_list_node_data (p_entnode);
stat_vector.push_back(new ISO9660::Stat(p_statbuf));
}
- _cdio_list_free (p_stat_list, false);
+ _cdio_list_free (p_stat_list, false, (CdioDataFree_t) iso9660_stat_free);
return true;
} else {
return false;
@@ -92,11 +94,11 @@ ISO9660::FS::readdir (const char psz_pat
/*! Close previously opened ISO 9660 image and free resources
associated with the image. Call this when done using using an ISO
9660 image.
-
+
@return true is unconditionally returned. If there was an error
false would be returned.
*/
-bool
+bool
ISO9660::IFS::close()
{
iso9660_close(p_iso9660);
@@ -107,18 +109,18 @@ ISO9660::IFS::close()
/*!
Given a directory pointer, find the filesystem entry that contains
lsn and return information about it.
-
+
Returns Stat* of entry if we found lsn, or NULL otherwise.
Caller must release returned object using delete when done.
*/
ISO9660::Stat *
-ISO9660::IFS::find_lsn(lsn_t i_lsn)
+ISO9660::IFS::find_lsn(lsn_t i_lsn)
{
return new Stat(iso9660_ifs_find_lsn(p_iso9660, i_lsn));
}
-/*!
- Return the Joliet level recognized.
+/*!
+ Return the Joliet level recognized.
*/
uint8_t
ISO9660::IFS::get_joliet_level()
@@ -130,7 +132,7 @@ ISO9660::IFS::get_joliet_level()
Return true if ISO 9660 image has extended attrributes (XA).
*/
bool
-ISO9660::IFS::is_xa ()
+ISO9660::IFS::is_xa ()
{
return iso9660_ifs_is_xa (p_iso9660);
}
@@ -140,10 +142,10 @@ ISO9660::IFS::is_xa ()
checks. This may be useful when trying to read an ISO 9660 image
contained in a file format that libiso9660 doesn't know natively
(or knows imperfectly.)
-
+
Maybe in the future we will have a mode. NULL is returned on
error.
-
+
@see open
*/
bool
@@ -160,7 +162,7 @@ ISO9660::IFS::open_fuzzy (const char *ps
PVD object is returned if read, and NULL if there was an error.
*/
ISO9660::PVD *
-ISO9660::IFS::read_pvd ()
+ISO9660::IFS::read_pvd ()
{
iso9660_pvd_t pvd;
bool b_okay = iso9660_ifs_read_pvd (p_iso9660, &pvd);
@@ -175,7 +177,7 @@ ISO9660::IFS::read_pvd ()
and datastart and a possible additional offset. Generally here we are
not reading an ISO 9660 image but a CD-Image which contains an ISO 9660
filesystem.
-
+
@see read_superblock
*/
bool
@@ -190,110 +192,110 @@ ISO9660::IFS::read_superblock (iso_exten
and datastart and a possible additional offset. Generally here we are
not reading an ISO 9660 image but a CD-Image which contains an ISO 9660
filesystem.
-
+
@see read_superblock
*/
-bool
+bool
ISO9660::IFS::read_superblock_fuzzy (iso_extension_mask_t iso_extension_mask,
uint16_t i_fuzz)
{
- return iso9660_ifs_fuzzy_read_superblock (p_iso9660, iso_extension_mask,
+ return iso9660_ifs_fuzzy_read_superblock (p_iso9660, iso_extension_mask,
i_fuzz);
}
-char *
-ISO9660::PVD::get_application_id()
+char *
+ISO9660::PVD::get_application_id()
{
return iso9660_get_application_id(&pvd);
}
-int
-ISO9660::PVD::get_pvd_block_size()
+int
+ISO9660::PVD::get_pvd_block_size()
{
return iso9660_get_pvd_block_size(&pvd);
}
/*!
Return the PVD's preparer ID.
- NULL is returned if there is some problem in getting this.
+ NULL is returned if there is some problem in getting this.
*/
-char *
-ISO9660::PVD::get_preparer_id()
+char *
+ISO9660::PVD::get_preparer_id()
{
return iso9660_get_preparer_id(&pvd);
}
/*!
Return the PVD's publisher ID.
- NULL is returned if there is some problem in getting this.
+ NULL is returned if there is some problem in getting this.
*/
-char *
-ISO9660::PVD::get_publisher_id()
+char *
+ISO9660::PVD::get_publisher_id()
{
return iso9660_get_publisher_id(&pvd);
}
const char *
-ISO9660::PVD::get_pvd_id()
+ISO9660::PVD::get_pvd_id()
{
return iso9660_get_pvd_id(&pvd);
}
-int
-ISO9660::PVD::get_pvd_space_size()
+int
+ISO9660::PVD::get_pvd_space_size()
{
return iso9660_get_pvd_space_size(&pvd);
}
-uint8_t
+uint8_t
ISO9660::PVD::get_pvd_type() {
return iso9660_get_pvd_type(&pvd);
}
/*! Return the primary volume id version number (of pvd).
- If there is an error 0 is returned.
+ If there is an error 0 is returned.
*/
-int
-ISO9660::PVD::get_pvd_version()
+int
+ISO9660::PVD::get_pvd_version()
{
return iso9660_get_pvd_version(&pvd);
}
/*! Return the LSN of the root directory for pvd.
- If there is an error CDIO_INVALID_LSN is returned.
+ If there is an error CDIO_INVALID_LSN is returned.
*/
-lsn_t
-ISO9660::PVD::get_root_lsn()
+lsn_t
+ISO9660::PVD::get_root_lsn()
{
return iso9660_get_root_lsn(&pvd);
}
/*!
Return the PVD's system ID.
- NULL is returned if there is some problem in getting this.
+ NULL is returned if there is some problem in getting this.
*/
-char *
-ISO9660::PVD::get_system_id()
+char *
+ISO9660::PVD::get_system_id()
{
return iso9660_get_system_id(&pvd);
}
/*!
Return the PVD's volume ID.
- NULL is returned if there is some problem in getting this.
+ NULL is returned if there is some problem in getting this.
*/
-char *
-ISO9660::PVD::get_volume_id()
+char *
+ISO9660::PVD::get_volume_id()
{
return iso9660_get_volume_id(&pvd);
}
/*!
Return the PVD's volumeset ID.
- NULL is returned if there is some problem in getting this.
+ NULL is returned if there is some problem in getting this.
*/
-char *
-ISO9660::PVD::get_volumeset_id()
+char *
+ISO9660::PVD::get_volumeset_id()
{
return iso9660_get_volumeset_id(&pvd);
}
Index: libcdio-0.94/lib/driver/_cdio_stream.c
===================================================================
--- libcdio-0.94.orig/lib/driver/_cdio_stream.c
+++ libcdio-0.94/lib/driver/_cdio_stream.c
@@ -73,7 +73,7 @@ cdio_stream_destroy(CdioDataSource_t *p_
cdio_stream_close(p_obj);
p_obj->op.free(p_obj->user_data);
-
+ p_obj->user_data = NULL;
free(p_obj);
}
Index: libcdio-0.94/lib/driver/ds.c
===================================================================
--- libcdio-0.94.orig/lib/driver/ds.c
+++ libcdio-0.94/lib/driver/ds.c
@@ -61,13 +61,19 @@ _cdio_list_new (void)
}
void
-_cdio_list_free (CdioList_t *p_list, int free_data)
+_cdio_list_free3 (CdioList_t *p_list, int free_data, CdioDataFree_t free_fn)
{
while (_cdio_list_length (p_list))
- _cdio_list_node_free (_cdio_list_begin (p_list), free_data);
+ _cdio_list_node_free3 (_cdio_list_begin (p_list), free_data, free_fn);
free (p_list);
}
+__asm__(".symver _cdio_list_free3,_cdio_list_free@CDIO_18");
+void
+_cdio_list_free (CdioList_t *p_list, int free_data)
+{
+ _cdio_list_free3 (p_list, free_data, free);
+}
unsigned
_cdio_list_length (const CdioList_t *p_list)
@@ -180,7 +186,8 @@ _cdio_list_node_next (CdioListNode_t *p_
}
void
-_cdio_list_node_free (CdioListNode_t *p_node, int free_data)
+_cdio_list_node_free3 (CdioListNode_t *p_node,
+ int free_data, CdioDataFree_t free_fn)
{
CdioList_t *p_list;
CdioListNode_t *prev_node;
@@ -191,8 +198,8 @@ _cdio_list_node_free (CdioListNode_t *p_
cdio_assert (_cdio_list_length (p_list) > 0);
- if (free_data)
- free (_cdio_list_node_data (p_node));
+ if (free_data && free_fn)
+ free_fn (_cdio_list_node_data (p_node));
if (_cdio_list_length (p_list) == 1)
{
@@ -230,6 +237,13 @@ _cdio_list_node_free (CdioListNode_t *p_
free (p_node);
}
+void
+_cdio_list_node_free (CdioListNode_t *p_node, int free_data)
+{
+ _cdio_list_node_free3 (p_node, free_data, free);
+}
+__asm__(".symver _cdio_list_node_free3,_cdio_list_node_free3@CDIO_18");
+
void *
_cdio_list_node_data (CdioListNode_t *p_node)
{
Index: libcdio-0.94/lib/driver/image/nrg.c
===================================================================
--- libcdio-0.94.orig/lib/driver/image/nrg.c
+++ libcdio-0.94/lib/driver/image/nrg.c
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2003-2006, 2008-2009, 2011-2012, 2014
+ Copyright (C) 2003-2006, 2008-2009, 2011-2012, 2014, 2017
Rocky Bernstein <rocky@gnu.org>
Copyright (C) 2001, 2003 Herbert Valerio Riedel <hvr@gnu.org>
@@ -20,6 +20,8 @@
CD-image format residing inside a disk file (*.nrg).
*/
+#define CDIO_API18
+
#include "image.h"
#ifdef HAVE_STDIO_H
@@ -1107,7 +1109,7 @@ _free_nrg (void *p_user_data)
if (NULL == p_env) return;
if (NULL != p_env->mapping)
- _cdio_list_free (p_env->mapping, true);
+ _cdio_list_free (p_env->mapping, true, free);
/* The remaining part of the image is like the other image drivers,
so free that in the same way. */
@@ -1275,6 +1277,7 @@ cdio_is_nrg(const char *psz_nrg)
if (!(p_env->gen.data_source = cdio_stdio_new (psz_nrg))) {
cdio_warn ("can't open nrg image file %s for reading", psz_nrg);
+ free(p_env);
return false;
}
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
@@ -21,6 +21,8 @@
free bits that are allocated inside the data. */
+#define CDIO_API18
+
#if defined(HAVE_CONFIG_H) && !defined(__CDIO_CONFIG_H__)
#include "config.h"
#define __CDIO_CONFIG_H__ 1
@@ -258,6 +260,7 @@ iso9660_close (iso9660_t *p_iso)
{
if (NULL != p_iso) {
cdio_stdio_destroy(p_iso->stream);
+ p_iso->stream = NULL;
free(p_iso);
}
return true;
@@ -1283,13 +1286,13 @@ iso9660_fs_readdir (CdIo_t *p_cdio, cons
if (!_dirbuf)
{
cdio_warn("Couldn't calloc(1, %d)", p_stat->secsize * ISO_BLOCKSIZE);
- _cdio_list_free (retval, true);
+ _cdio_list_free (retval, true, NULL);
return NULL;
}
if (cdio_read_data_sectors (p_cdio, _dirbuf, p_stat->lsn,
ISO_BLOCKSIZE, p_stat->secsize)) {
- _cdio_list_free (retval, true);
+ _cdio_list_free (retval, true, NULL);
return NULL;
}
@@ -1351,7 +1354,7 @@ iso9660_ifs_readdir (iso9660_t *p_iso, c
{
cdio_warn("Invalid directory buffer sector size %u", p_stat->secsize);
iso9660_stat_free(p_stat);
- _cdio_list_free (retval, true);
+ _cdio_list_free (retval, true, NULL);
return NULL;
}
@@ -1360,13 +1363,13 @@ iso9660_ifs_readdir (iso9660_t *p_iso, c
{
cdio_warn("Couldn't calloc(1, %lu)", dirbuf_len);
iso9660_stat_free(p_stat);
- _cdio_list_free (retval, true);
+ _cdio_list_free (retval, true, NULL);
return NULL;
}
ret = iso9660_iso_seek_read (p_iso, _dirbuf, p_stat->lsn, p_stat->secsize);
if (ret != dirbuf_len) {
- _cdio_list_free (retval, true);
+ _cdio_list_free (retval, true, NULL);
iso9660_stat_free(p_stat);
free (_dirbuf);
return NULL;
@@ -1400,7 +1403,7 @@ iso9660_ifs_readdir (iso9660_t *p_iso, c
iso9660_stat_free(p_stat);
if (offset != dirbuf_len) {
- _cdio_list_free (retval, true);
+ _cdio_list_free (retval, true, (CdioDataFree_t) iso9660_stat_free);
return NULL;
}
@@ -1437,6 +1440,7 @@ find_lsn_recurse (void *p_image, iso9660
if (statbuf->type == _STAT_DIR
&& strcmp ((char *) statbuf->filename, ".")
&& strcmp ((char *) statbuf->filename, "..")) {
+ snprintf (*ppsz_full_filename, len, "%s%s/", psz_path, psz_filename);
_cdio_list_append (dirlist, strdup(*ppsz_full_filename));
}
@@ -1445,19 +1449,19 @@ find_lsn_recurse (void *p_image, iso9660
iso9660_stat_t *ret_stat = calloc(1, len2);
if (!ret_stat)
{
- _cdio_list_free (dirlist, true);
+ _cdio_list_free (dirlist, true, free);
cdio_warn("Couldn't calloc(1, %d)", len2);
return NULL;
}
memcpy(ret_stat, statbuf, len2);
- _cdio_list_free (entlist, true);
- _cdio_list_free (dirlist, true);
+ _cdio_list_free (entlist, true, (CdioDataFree_t) iso9660_stat_free);
+ _cdio_list_free (dirlist, true, free);
return ret_stat;
}
}
- _cdio_list_free (entlist, true);
+ _cdio_list_free (entlist, true, (CdioDataFree_t) iso9660_stat_free);
/* now recurse/descend over directories encountered */
@@ -1472,7 +1476,7 @@ find_lsn_recurse (void *p_image, iso9660
ppsz_full_filename);
if (NULL != ret_stat) {
- _cdio_list_free (dirlist, true);
+ _cdio_list_free (dirlist, true, free);
return ret_stat;
}
}
@@ -1481,7 +1485,7 @@ find_lsn_recurse (void *p_image, iso9660
free(*ppsz_full_filename);
*ppsz_full_filename = NULL;
}
- _cdio_list_free (dirlist, true);
+ _cdio_list_free (dirlist, true, free);
return NULL;
}
@@ -1548,8 +1552,9 @@ void
iso9660_stat_free(iso9660_stat_t *p_stat)
{
if (p_stat != NULL) {
- if (p_stat->rr.psz_symlink)
+ if (p_stat->rr.psz_symlink) {
CDIO_FREE_IF_NOT_NULL(p_stat->rr.psz_symlink);
+ }
free(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
@@ -574,8 +574,8 @@ print_iso9660_recurse (CdIo_t *p_cdio, c
translated_name = (char *) malloc(translated_name_size);
if (!translated_name) {
report( stderr, "Error allocating memory\n" );
- _cdio_list_free (p_dirlist, true);
- _cdio_list_free (p_entlist, true);
+ _cdio_list_free3 (p_dirlist, true, free);
+ _cdio_list_free3 (p_entlist, true, (CdioDataFree_t) iso9660_stat_free);
return;
}
}
@@ -605,7 +605,7 @@ print_iso9660_recurse (CdIo_t *p_cdio, c
}
free (translated_name);
- _cdio_list_free (p_entlist, true);
+ _cdio_list_free3 (p_entlist, true, (CdioDataFree_t) iso9660_stat_free);
printf ("\n");
@@ -618,7 +618,7 @@ print_iso9660_recurse (CdIo_t *p_cdio, c
print_iso9660_recurse (p_cdio, _fullname, fs);
}
- _cdio_list_free (p_dirlist, true);
+ _cdio_list_free3 (p_dirlist, true, free);
}
static void
Index: libcdio-0.94/src/iso-info.c
===================================================================
--- libcdio-0.94.orig/src/iso-info.c
+++ libcdio-0.94/src/iso-info.c
@@ -54,6 +54,10 @@
#include <unistd.h>
#endif
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
+
#if 0
#define STRONG "\033[1m"
#define NORMAL "\033[0m"
@@ -228,7 +232,7 @@ print_iso9660_recurse (iso9660_t *p_iso,
CdioList_t *dirlist = _cdio_list_new ();
CdioListNode_t *entnode;
uint8_t i_joliet_level = iso9660_ifs_get_joliet_level(p_iso);
- char *translated_name = (char *) malloc(4096);
+ char *translated_name = (char *) alloca(4096);
size_t translated_name_size = 4096;
entlist = iso9660_ifs_readdir (p_iso, psz_path);
if (opts.print_iso9660) {
@@ -236,7 +240,6 @@ print_iso9660_recurse (iso9660_t *p_iso,
}
if (NULL == entlist) {
- free(translated_name);
free(dirlist);
report( stderr, "Error getting above directory information\n" );
return;
@@ -244,9 +247,8 @@ print_iso9660_recurse (iso9660_t *p_iso,
rec_counter++;
if (rec_counter > CDIO_MAX_DIR_RECURSION) {
- free(translated_name);
free(dirlist);
- _cdio_list_free (entlist, true);
+ _cdio_list_free3 (entlist, true, (CdioDataFree_t) iso9660_stat_free);
report( stderr,
"Directory recursion too deep. ISO most probably damaged.\n" );
return;
@@ -259,14 +261,8 @@ print_iso9660_recurse (iso9660_t *p_iso,
iso9660_stat_t *p_statbuf = _cdio_list_node_data (entnode);
char *psz_iso_name = p_statbuf->filename;
char _fullname[4096] = { 0, };
- if (strlen(psz_iso_name) >= translated_name_size) {
+ 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" );
- return;
- }
}
if (yep != p_statbuf->rr.b3_rock || 1 == opts.no_rock_ridge) {
@@ -291,19 +287,15 @@ print_iso9660_recurse (iso9660_t *p_iso,
0 == opts.no_rock_ridge,
iso9660_ifs_is_xa(p_iso) && 0 == opts.no_xa,
psz_iso_name, translated_name);
- } else
+ } else {
if ( strcmp (psz_iso_name, ".") && strcmp (psz_iso_name, ".."))
printf("%9u %s%s\n", (unsigned int) p_statbuf->size, psz_path,
yep == p_statbuf->rr.b3_rock
? psz_iso_name : translated_name);
- if (p_statbuf->rr.i_symlink) {
- free(p_statbuf->rr.psz_symlink);
- p_statbuf->rr.i_symlink = 0;
}
}
- free (translated_name);
- _cdio_list_free (entlist, true);
+ _cdio_list_free3 (entlist, true, (CdioDataFree_t) iso9660_stat_free);
if (opts.print_iso9660) {
printf ("\n");
@@ -318,7 +310,7 @@ print_iso9660_recurse (iso9660_t *p_iso,
print_iso9660_recurse (p_iso, _fullname, rec_counter);
}
- _cdio_list_free (dirlist, true);
+ _cdio_list_free3 (dirlist, true, free);
}
static void
Index: libcdio-0.94/test/testisocd2.c
===================================================================
--- libcdio-0.94.orig/test/testisocd2.c
+++ libcdio-0.94/test/testisocd2.c
@@ -67,6 +67,7 @@ main(int argc, const char *argv[])
ISO9660_IMAGE);
return 1;
} else {
+ unsigned int rc=0;
uint8_t joliet_level = iso9660_ifs_get_joliet_level(p_iso);
if (joliet_level != 0) {
printf("Expecting joliet level to be 0, got %u\n", joliet_level);
@@ -74,7 +75,9 @@ main(int argc, const char *argv[])
} else {
printf("-- No joliet, as expected.\n");
}
+ iso9660_close(p_iso);
p_iso = iso9660_open_ext(ISO9660_IMAGE, ISO_EXTENSION_ALL);
+
joliet_level = iso9660_ifs_get_joliet_level(p_iso);
if ( joliet_level != 0) {
printf("Expecting joliet level to still be 0, got %d\n", joliet_level);
@@ -102,8 +105,8 @@ main(int argc, const char *argv[])
char buf[ISO_BLOCKSIZE];
char *psz_path = NULL;
const lsn_t i_lsn = p_statbuf->lsn;
- const iso9660_stat_t *p_statbuf2 = iso9660_ifs_find_lsn (p_iso, i_lsn);
- const iso9660_stat_t *p_statbuf3 =
+ iso9660_stat_t *p_statbuf2 = iso9660_ifs_find_lsn (p_iso, i_lsn);
+ iso9660_stat_t *p_statbuf3 =
iso9660_ifs_find_lsn_with_path (p_iso, i_lsn, &psz_path);
/* Compare the two statbufs. */
@@ -113,28 +116,29 @@ main(int argc, const char *argv[])
fprintf(stderr, "File stat information between fs_stat and "
"iso9660_ifs_find_lsn isn't the same\n");
- iso9660_stat_free(p_statbuf);
- exit(3);
+ rc = 3;
+ goto exit;
}
if (p_statbuf3->lsn != p_statbuf2->lsn ||
p_statbuf3->size != p_statbuf2->size ||
p_statbuf3->type != p_statbuf2->type) {
- iso9660_stat_free(p_statbuf);
- exit(4);
+ rc = 4;
+ goto exit;
}
if (psz_path != NULL) {
if (0 != strncmp("/./", psz_path, strlen("/./"))) {
fprintf(stderr, "Path returned for ifs_find_lsn_with_path "
"is not correct should be /./, is %s\n", psz_path);
- iso9660_stat_free(p_statbuf);
- exit(5);
+ rc = 5;
+ goto exit;
}
free(psz_path);
} else {
fprintf(stderr, "Path returned for fs_find_lsn_with_path is NULL\n");
- iso9660_stat_free(p_statbuf);
+ rc = 6;
+ goto exit;
exit(6);
}
@@ -144,11 +148,15 @@ main(int argc, const char *argv[])
{
fprintf(stderr, "Error reading ISO 9660 file at lsn %lu\n",
(long unsigned int) p_statbuf->lsn);
- iso9660_stat_free(p_statbuf);
- exit(7);
+ rc = 7;
+ goto exit;
}
- iso9660_stat_free(p_statbuf);
- exit(0);
+ exit:
+ iso9660_stat_free(p_statbuf2);
+ iso9660_stat_free(p_statbuf3);
+ iso9660_stat_free(p_statbuf);
+ iso9660_close(p_iso);
+ exit(rc);
}
}
Index: libcdio-0.94/lib/driver/Makefile.am
===================================================================
--- libcdio-0.94.orig/lib/driver/Makefile.am
+++ libcdio-0.94/lib/driver/Makefile.am
@@ -176,10 +176,16 @@ if BUILD_VERSIONED_LIBS
libcdio_la_LDFLAGS = $(libcdio_la_ldflags) -Wl,--version-script=libcdio.la.ver
libcdio_la_DEPENDENCIES = libcdio.la.ver
-libcdio.la.ver: $(srcdir)/libcdio.sym
+libcdio.la.ver: $(srcdir)/libcdio.sym $(srcdir)/libcdio18.sym
@echo 'CDIO_$(libcdio_la_MAJOR) { ' > $@
@echo ' global:' >> $@
- @sed 's/^/ /;s/$$/;/' $< >> $@
+ @sed 's/^/ /;s/$$/;/' $(srcdir)/libcdio.sym >> $@
+ @echo ' local:' >> $@
+ @echo ' *;' >> $@
+ @echo '};' >> $@
+ @echo 'CDIO_18 { ' >> $@
+ @echo ' global:' >> $@
+ @sed 's/^/ /;s/$$/;/' $(srcdir)/libcdio18.sym >> $@
@echo ' local:' >> $@
@echo ' *;' >> $@
@echo '};' >> $@
Index: libcdio-0.94/lib/driver/libcdio18.sym
===================================================================
--- /dev/null
+++ libcdio-0.94/lib/driver/libcdio18.sym
@@ -0,0 +1,2 @@
+_cdio_list_free3
+_cdio_list_node_free3