Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.2:Rings:1-MinimalX
libcdio
libcdio-0.94-leak-03.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File libcdio-0.94-leak-03.patch of Package libcdio
Backport. From 942dccd64d4281976ed321d32daa26d005be2d6f Mon Sep 17 00:00:00 2001 From: "R. Bernstein" <rocky@gnu.org> Date: Sun, 19 Nov 2017 23:48:32 -0500 Subject: [PATCH 3/20] Remove more memory leaks; remove more #ifdefs --- include/cdio/util.h | 26 +++++++++++++++---------- lib/driver/image/bincue.c | 2 +- lib/driver/image_common.c | 20 ++++++++++--------- lib/driver/image_common.h | 41 ++++++++++++++++++--------------------- lib/iso9660/iso9660_fs.c | 39 ++++++++++++++----------------------- src/util.c | 2 +- test/Makefile.am | 12 ++++++++++-- test/driver/Makefile.am | 10 +++++++++- test/testisocd2.c | 11 +++++++++-- 9 files changed, 91 insertions(+), 72 deletions(-) Index: libcdio-0.94/include/cdio/util.h =================================================================== --- libcdio-0.94.orig/include/cdio/util.h +++ libcdio-0.94/include/cdio/util.h @@ -21,8 +21,8 @@ #define CDIO_UTIL_H_ /*! - \file util.h - \brief Miscellaneous utility functions. + \file util.h + \brief Miscellaneous utility functions. Warning: this will probably get removed/replaced by using glib.h */ @@ -65,8 +65,14 @@ _cdio_len2blocks (uint32_t i_len, uint16 return i_blocks; } + +/*! free() and NULL out p_obj it is not already null. */ +#define CDIO_FREE_IF_NOT_NULL(p_obj) \ + if (NULL != p_obj) { free(p_obj); p_obj=NULL; }; + + /* round up to next block boundary */ -static CDIO_INLINE unsigned +static CDIO_INLINE unsigned _cdio_ceil2block (unsigned offset, uint16_t i_blocksize) { return _cdio_len2blocks (offset, i_blocksize) * i_blocksize; @@ -99,11 +105,11 @@ _cdio_memdup (const void *mem, size_t co char * _cdio_strdup_upper (const char str[]); -/* Duplicate path and make it platform compliant. Typically needed for - MinGW/MSYS where a "/c/..." path must be translated to "c:/..." for - use with fopen(), etc. Returned string must be freed by the caller - using cdio_free(). */ -char * +/*! Duplicate path and make it platform compliant. Typically needed for + MinGW/MSYS where a "/c/..." path must be translated to "c:/..." for + use with fopen(), etc. Returned string must be freed by the caller + using cdio_free(). */ +char * _cdio_strdup_fixpath (const char path[]); void @@ -125,7 +131,7 @@ char *cdio_realpath (const char *psz_src #ifdef WANT_FOLLOW_SYMLINK_COMPATIBILITY # define cdio_follow_symlink cdio_realpath #endif - + #ifdef __cplusplus } #endif @@ -133,7 +139,7 @@ char *cdio_realpath (const char *psz_src #endif /* CDIO_UTIL_H_ */ -/* +/* * Local variables: * c-file-style: "gnu" * tab-width: 8 Index: libcdio-0.94/lib/driver/image/bincue.c =================================================================== --- libcdio-0.94.orig/lib/driver/image/bincue.c +++ libcdio-0.94/lib/driver/image/bincue.c @@ -744,7 +744,7 @@ parse_cuefile (_img_private_t *cd, const goto err_exit; } if (cd) { -#if FIXED_ME +#ifdef FIXME cd->tocent[i].indexes[cd->tocent[i].nindex++] = lba; #else track_info_t *this_track= Index: libcdio-0.94/lib/driver/image_common.c =================================================================== --- libcdio-0.94.orig/lib/driver/image_common.c +++ libcdio-0.94/lib/driver/image_common.c @@ -1,5 +1,6 @@ /* - Copyright (C) 2004-2005, 2008, 2010-2011, 2013 Rocky Bernstein <rocky@gnu.org> + Copyright (C) 2004-2005, 2008, 2010-2011, 2013, 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 @@ -26,6 +27,7 @@ #include "image.h" #include "image_common.h" +#include <cdio/util.h> #include "_cdio_stdio.h" #ifdef HAVE_STDLIB_H @@ -61,14 +63,14 @@ _free_image (void *p_user_data) for (i_track=0; i_track < p_env->gen.i_tracks; i_track++) { track_info_t *p_tocent = &(p_env->tocent[i_track]); - free_if_notnull(p_tocent->filename); - free_if_notnull(p_tocent->isrc); + CDIO_FREE_IF_NOT_NULL(p_tocent->filename); + CDIO_FREE_IF_NOT_NULL(p_tocent->isrc); if (p_tocent->data_source) cdio_stdio_destroy(p_tocent->data_source); } - free_if_notnull(p_env->psz_mcn); - free_if_notnull(p_env->psz_cue_name); - free_if_notnull(p_env->psz_access_mode); + CDIO_FREE_IF_NOT_NULL(p_env->psz_mcn); + CDIO_FREE_IF_NOT_NULL(p_env->psz_cue_name); + CDIO_FREE_IF_NOT_NULL(p_env->psz_access_mode); cdtext_destroy(p_env->gen.cdtext); cdio_generic_stdio_free(p_env); free(p_env); @@ -365,19 +367,19 @@ _set_arg_image (void *p_user_data, const if (!strcmp (key, "source")) { - free_if_notnull (p_env->gen.source_name); + CDIO_FREE_IF_NOT_NULL(p_env->gen.source_name); if (!value) return DRIVER_OP_ERROR; p_env->gen.source_name = strdup (value); } else if (!strcmp (key, "cue")) { - free_if_notnull (p_env->psz_cue_name); + CDIO_FREE_IF_NOT_NULL(p_env->psz_cue_name); if (!value) return DRIVER_OP_ERROR; p_env->psz_cue_name = strdup (value); } else if (!strcmp (key, "access-mode")) { - free_if_notnull (p_env->psz_access_mode); + CDIO_FREE_IF_NOT_NULL(p_env->psz_access_mode); if (!value) return DRIVER_OP_ERROR; p_env->psz_access_mode = strdup (value); } Index: libcdio-0.94/lib/driver/image_common.h =================================================================== --- libcdio-0.94.orig/lib/driver/image_common.h +++ libcdio-0.94/lib/driver/image_common.h @@ -15,8 +15,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -/*! Common image routines. - +/*! Common image routines. + Because _img_private_t may vary over image formats, the routines are included into the image drivers after _img_private_t is defined. In order for the below routines to work, there is a large part of @@ -28,19 +28,19 @@ #define CDIO_DRIVER_IMAGE_COMMON_H_ typedef struct { - /* Things common to all drivers like this. + /* Things common to all drivers like this. This must be first. */ - generic_img_private_t gen; - internal_position_t pos; - + generic_img_private_t gen; + internal_position_t pos; + char *psz_cue_name; char *psz_access_mode; /* Just the name of the driver. We add this for regularity with other real CD drivers which has an access mode. */ - char *psz_mcn; /* Media Catalog Number (5.22.3) + char *psz_mcn; /* Media Catalog Number (5.22.3) exactly 13 bytes */ - track_info_t tocent[CDIO_CD_MAX_TRACKS+1]; /* entry info for each track + track_info_t tocent[CDIO_CD_MAX_TRACKS+1]; /* entry info for each track add 1 for leadout. */ discmode_t disc_mode; @@ -60,9 +60,6 @@ typedef struct { #endif } _img_private_t; -#define free_if_notnull(p_obj) \ - if (NULL != p_obj) { free(p_obj); p_obj=NULL; }; - /*! We don't need the image any more. Free all memory associated with it. @@ -81,7 +78,7 @@ const char * _get_arg_image (void *user_ */ cdtext_t * _get_cdtext_image(void *p_user_data); -/*! +/*! Get disc type associated with cd_obj. */ discmode_t _get_discmode_image (void *p_user_data); @@ -96,12 +93,12 @@ void _get_drive_cap_image (const void *u cdio_drive_misc_cap_t *p_misc_cap); /*! - Return the number of of the first track. + Return the number of of the first track. CDIO_INVALID_TRACK is returned on error. */ track_t _get_first_track_num_image(void *p_user_data); -/*! +/*! Find out if media has changed since the last call. @param p_user_data the CD object to be acted upon. @return 1 if media has changed since last call, 0 if not. Error @@ -120,12 +117,12 @@ int get_media_changed_image(const void * char * _get_mcn_image(const void *p_user_data); /*! - Return the number of tracks. + Return the number of tracks. */ track_t _get_num_tracks_image(void *p_user_data); -/*! +/*! Return the starting MSF (minutes/secs/frames) for the track number track_num in obj. Tracks numbers start at 1. The "leadout" track is specified either by @@ -147,10 +144,10 @@ track_flag_t get_track_copy_permit_image /*! Return 1 if track has pre-emphasis, 0 if not, or -1 for error. Is this meaningful if not an audio track? - + pre-emphasis is a non linear frequency response. */ -track_flag_t get_track_preemphasis_image(const void *p_user_data, +track_flag_t get_track_preemphasis_image(const void *p_user_data, track_t i_track); /*! Return the starting LBA for the pregap for track number i_track. @@ -170,7 +167,7 @@ char *get_track_isrc_image(const void *p /*! Read a data sector - + @param p_cdio object to read from @param p_buf place to read data into. The caller should make sure @@ -188,14 +185,14 @@ char *get_track_isrc_image(const void *p @param i_blocks number of blocks to read. */ -driver_return_code_t -read_data_sectors_image ( void *p_user_data, void *p_buf, +driver_return_code_t +read_data_sectors_image ( void *p_user_data, void *p_buf, lsn_t i_lsn, uint16_t i_blocksize, uint32_t i_blocks ); /*! Set the arg "key" with "value" in the source device. - Currently "source" to set the source device in I/O operations + Currently "source" to set the source device in I/O operations is the only valid key. 0 is returned if no error was found, and nonzero if there as an error. 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 @@ -801,8 +801,7 @@ _iso9660_dir_to_statbuf (iso9660_dir_t * iso9660_get_dtime(&(p_iso9660_dir->recording_time), true, &(p_stat->tm)); if (dir_len < sizeof (iso9660_dir_t)) { - free(p_stat->rr.psz_symlink); - free(p_stat); + iso9660_stat_free(p_stat); return NULL; } @@ -1021,14 +1020,12 @@ _fs_stat_traverse (const CdIo_t *p_cdio, if (!cmp) { iso9660_stat_t *ret_stat = _fs_stat_traverse (p_cdio, p_iso9660_stat, &splitpath[1]); - free(p_iso9660_stat->rr.psz_symlink); - free(p_iso9660_stat); + iso9660_stat_free(p_iso9660_stat); free (_dirbuf); return ret_stat; } - free(p_iso9660_stat->rr.psz_symlink); - free(p_iso9660_stat); + iso9660_stat_free(p_iso9660_stat); offset += iso9660_get_dir_len(p_iso9660_dir); } @@ -1126,14 +1123,11 @@ _fs_iso_stat_traverse (iso9660_t *p_iso, if (!cmp) { iso9660_stat_t *ret_stat = _fs_iso_stat_traverse (p_iso, p_stat, &splitpath[1]); - free(p_stat->rr.psz_symlink); - free(p_stat); + iso9660_stat_free(p_stat); free (_dirbuf); return ret_stat; } - - free(p_stat->rr.psz_symlink); - free(p_stat); + iso9660_stat_free(p_stat); offset += iso9660_get_dir_len(p_iso9660_dir); } @@ -1272,8 +1266,7 @@ iso9660_fs_readdir (CdIo_t *p_cdio, cons if (!p_stat) return NULL; if (p_stat->type != _STAT_DIR) { - free(p_stat->rr.psz_symlink); - free(p_stat); + iso9660_stat_free(p_stat); return NULL; } @@ -1338,8 +1331,7 @@ iso9660_ifs_readdir (iso9660_t *p_iso, c if (!p_stat) return NULL; if (p_stat->type != _STAT_DIR) { - free(p_stat->rr.psz_symlink); - free(p_stat); + iso9660_stat_free(p_stat); return NULL; } @@ -1354,8 +1346,7 @@ iso9660_ifs_readdir (iso9660_t *p_iso, c if (!dirbuf_len) { cdio_warn("Invalid directory buffer sector size %u", p_stat->secsize); - free(p_stat->rr.psz_symlink); - free(p_stat); + iso9660_stat_free(p_stat); _cdio_list_free (retval, true); return NULL; } @@ -1364,8 +1355,7 @@ iso9660_ifs_readdir (iso9660_t *p_iso, c if (!_dirbuf) { cdio_warn("Couldn't calloc(1, %lu)", dirbuf_len); - free(p_stat->rr.psz_symlink); - free(p_stat); + iso9660_stat_free(p_stat); _cdio_list_free (retval, true); return NULL; } @@ -1373,8 +1363,7 @@ iso9660_ifs_readdir (iso9660_t *p_iso, c ret = iso9660_iso_seek_read (p_iso, _dirbuf, p_stat->lsn, p_stat->secsize); if (ret != dirbuf_len) { _cdio_list_free (retval, true); - free(p_stat->rr.psz_symlink); - free(p_stat); + iso9660_stat_free(p_stat); free (_dirbuf); return NULL; } @@ -1404,8 +1393,7 @@ iso9660_ifs_readdir (iso9660_t *p_iso, c } free (_dirbuf); - free(p_stat->rr.psz_symlink); - free (p_stat); + iso9660_stat_free(p_stat); if (offset != dirbuf_len) { _cdio_list_free (retval, true); @@ -1555,8 +1543,11 @@ iso9660_ifs_find_lsn_with_path(iso9660_t void iso9660_stat_free(iso9660_stat_t *p_stat) { - if (p_stat != NULL) + if (p_stat != NULL) { + if (p_stat->rr.psz_symlink) + CDIO_FREE_IF_NOT_NULL(p_stat->rr.psz_symlink); free(p_stat); + } } /*! Index: libcdio-0.94/src/util.c =================================================================== --- libcdio-0.94.orig/src/util.c +++ libcdio-0.94/src/util.c @@ -389,7 +389,7 @@ print_drive_capabilities(cdio_drive_read report( stdout, _("Can set drive speed : %s\n"), i_misc_cap & CDIO_DRIVE_CAP_MISC_SELECT_SPEED ? "Yes" : "No" ); -#if FIXED +#ifdef FIXED report( stdout, _("Can detect if CD changed : %s\n"), i_misc_cap & CDIO_DRIVE_CAP_MISC_MEDIA_CHANGED ? "Yes" : "No" ); #endif Index: libcdio-0.94/test/Makefile.am =================================================================== --- libcdio-0.94.orig/test/Makefile.am +++ libcdio-0.94/test/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2003-2006, 2008-2013 Rocky Bernstein <rocky@gnu.org> +# Copyright (C) 2003-2006, 2008-2013, 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 @@ -18,6 +18,9 @@ #################################################### # # +.PHONY: test check-short check-iso_read_large check-iso-read-terse \ + make-executable clean-local-check check-leaks + SUBDIRS = data driver hack = check_sizeof testassert testgetdevices testischar \ @@ -132,6 +135,11 @@ make-executable: check_nrg.sh check_cue. fi clean-local: clean-local-check -.PHONY: clean-local-check clean-local-check: -rm -rf exampleIso*.iso.prep *.log *.trs *.orig *.rej + +#: run regression tests. "test" is the same thing as "check" +check-leaks: $(check_PROGRAMS) + for p in $(check_PROGRAMS); do \ + valgrind ./$$p; \ + done Index: libcdio-0.94/test/driver/Makefile.am =================================================================== --- libcdio-0.94.orig/test/driver/Makefile.am +++ libcdio-0.94/test/driver/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2009, 2010, 2012 Rocky Bernstein <rocky@gnu.org> +# Copyright (C) 2009, 2010, 2012, 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 @@ -13,6 +13,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. +.PHONY: check-leaks test check-short + DATA_DIR = $(abs_top_srcdir)/test/data AM_CPPFLAGS = $(LIBCDIO_CFLAGS) $(LIBISO9660_CFLAGS) -DDATA_DIR=\"$(DATA_DIR)\" @@ -75,6 +77,12 @@ MOSTLYCLEANFILES = \ #: run regression tests. "test" is the same thing as "check" test: check-am +#: run regression tests. "test" is the same thing as "check" +check-leaks: $(check_PROGRAMS) + for p in $(check_PROGRAMS); do \ + valgrind ./$$p; \ + done + #: Run all tests without bloated output check-short: $(MAKE) check 2>&1 | ruby @abs_top_srcdir@/make-check-filter.rb Index: libcdio-0.94/test/testisocd2.c =================================================================== --- libcdio-0.94.orig/test/testisocd2.c +++ libcdio-0.94/test/testisocd2.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2003-2008, 2012-2013 Rocky Bernstein + Copyright (C) 2003-2008, 2012-2013, 2017 Rocky Bernstein <rocky@gnu.org> This program is free software: you can redistribute it and/or modify @@ -89,12 +89,13 @@ 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_ifs_stat (p_iso, "/."); + iso9660_stat_t *p_statbuf = iso9660_ifs_stat (p_iso, "/."); if (NULL == p_statbuf) { fprintf(stderr, "Could not get ISO-9660 file information for file /.\n"); iso9660_close(p_iso); + iso9660_stat_free(p_statbuf); exit(2); } else { /* Now try getting the statbuf another way */ @@ -112,12 +113,14 @@ 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); } 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); } @@ -125,11 +128,13 @@ main(int argc, const char *argv[]) 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); } free(psz_path); } else { fprintf(stderr, "Path returned for fs_find_lsn_with_path is NULL\n"); + iso9660_stat_free(p_statbuf); exit(6); } @@ -139,8 +144,10 @@ 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); } + iso9660_stat_free(p_statbuf); exit(0); } }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor