File libcdio-0.94-leak-19.patch of Package libcdio.24379
Partial patch. Backport.
From 8980bdebcb68916d2b2aea91b9d76e83a1a3c574 Mon Sep 17 00:00:00 2001
From: "R. Bernstein" <rocky@gnu.org>
Date: Fri, 29 Dec 2017 20:59:45 -0500
Subject: [PATCH 19/20] Memory leaks and lint found from clang "scan_build"
---
configure.ac | 2 +-
example/mmc3.c | 28 ++++++++++++----------
example/sample4.c | 49 +++++++++++++++++++++------------------
lib/driver/gnu_linux.c | 1 -
lib/driver/image/bincue.c | 2 +-
lib/driver/image/cdrdao.c | 2 +-
lib/driver/image/nrg.c | 22 +++++++++++-------
lib/iso9660/iso9660.c | 3 ++-
lib/iso9660/iso9660_fs.c | 12 ++++++++--
lib/iso9660/rock.c | 5 ++--
src/cdda-player.c | 3 +--
test/driver/cdda.c | 11 +++++----
test/driver/mmc_read.c | 10 ++++----
test/testgetdevices.c | 46 ++++++++++++++++++------------------
test/testiso9660.c | 6 ++---
test/testisocd.c | 2 --
16 files changed, 114 insertions(+), 90 deletions(-)
Index: libcdio-0.94/example/mmc3.c
===================================================================
--- libcdio-0.94.orig/example/mmc3.c
+++ libcdio-0.94/example/mmc3.c
@@ -1,6 +1,6 @@
/*
- Copyright (C) 2006, 2008, 2009, 2011 Rocky Bernstein <rocky@gnu.org>
-
+ Copyright (C) 2006, 2008, 2009, 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
@@ -51,8 +51,8 @@ main(int argc, const char *argv[])
char *psz_drive = NULL;
bool do_eject = false;
bool do_close = false;
-
- if (argc > 1)
+
+ if (argc > 1)
psz_drive = strdup(argv[1]);
if (!psz_drive) {
@@ -68,7 +68,7 @@ main(int argc, const char *argv[])
printf("-- Can't open %s\n", psz_drive);
exit(77);
}
-
+
ret = mmc_get_tray_status(p_cdio);
switch((int) ret) {
case 0:
@@ -82,28 +82,30 @@ main(int argc, const char *argv[])
default:
printf("-- Error status for drive %s: %s.\n", psz_drive,
cdio_driver_errmsg(ret));
+ free(psz_drive);
return 77;
}
-
+
ret = mmc_get_media_changed(p_cdio);
switch((int) ret) {
case 0:
- printf("-- CD-ROM drive %s media not changed since last test.\n",
+ printf("-- CD-ROM drive %s media not changed since last test.\n",
psz_drive);
break;
case 1:
printf("-- CD-ROM drive %s media changed since last test.\n", psz_drive);
break;
default:
- printf("-- Error status for drive %s: %s.\n", psz_drive,
+ printf("-- Error status for drive %s: %s.\n", psz_drive,
cdio_driver_errmsg(ret));
+ free(psz_drive);
return 77;
}
if (do_eject && argc > 2)
- ret = cdio_eject_media_drive(psz_drive);
+ cdio_eject_media_drive(psz_drive);
else
- ret = cdio_close_tray(psz_drive, &driver_id);
+ cdio_close_tray(psz_drive, &driver_id);
ret = mmc_get_tray_status(p_cdio);
switch((int) ret) {
@@ -116,13 +118,14 @@ main(int argc, const char *argv[])
default:
printf("Error status for drive %s: %s.\n", psz_drive,
cdio_driver_errmsg(ret));
+ free(psz_drive);
return 77;
}
-
+
ret = mmc_get_media_changed(p_cdio);
switch((int) ret) {
case 0:
- printf("-- CD-ROM drive %s media not changed since last test.\n",
+ printf("-- CD-ROM drive %s media not changed since last test.\n",
psz_drive);
break;
case 1:
@@ -131,6 +134,7 @@ main(int argc, const char *argv[])
default:
printf("-- Error status for drive %s: %s.\n", psz_drive,
cdio_driver_errmsg(ret));
+ free(psz_drive);
return 77;
}
Index: libcdio-0.94/example/sample4.c
===================================================================
--- libcdio-0.94.orig/example/sample4.c
+++ libcdio-0.94/example/sample4.c
@@ -1,6 +1,6 @@
/*
- Copyright (C) 2003, 2004, 2008, 2009, 2012 Rocky Bernstein <rocky@gnu.org>
-
+ Copyright (C) 2003-2004, 2008-2009, 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
the Free Software Foundation, either version 3 of the License, or
@@ -15,7 +15,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/*
+/*
A slightly improved sample3 program: we handle cdio logging and
take an optional CD-location.
*/
@@ -27,6 +27,9 @@
#ifdef HAVE_STDIO_H
#include <stdio.h>
#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
@@ -38,7 +41,7 @@
#include <cdio/cd_types.h>
#include <cdio/logging.h>
-static void
+static void
log_handler (cdio_log_level_t level, const char message[])
{
switch(level) {
@@ -51,7 +54,7 @@ log_handler (cdio_log_level_t level, con
}
static void
-print_analysis(cdio_iso_analysis_t cdio_iso_analysis,
+print_analysis(cdio_iso_analysis_t cdio_iso_analysis,
cdio_fs_anal_t fs, int first_data, unsigned int num_audio)
{
switch(CDIO_FSTYPE(fs)) {
@@ -111,7 +114,7 @@ print_analysis(cdio_iso_analysis_t cdio_
if (fs & CDIO_FS_ANAL_HIDDEN_TRACK)
printf("Hidden Track ");
if (fs & CDIO_FS_ANAL_PHOTO_CD)
- printf("%sPhoto CD ",
+ printf("%sPhoto CD ",
num_audio > 0 ? " Portfolio " : "");
if (fs & CDIO_FS_ANAL_CDTV)
printf("Commodore CDTV ");
@@ -134,7 +137,7 @@ main(int argc, const char *argv[])
{
CdIo_t *p_cdio;
cdio_fs_anal_t fs=0;
-
+
track_t num_tracks;
track_t first_track_num;
lsn_t start_track; /* first sector of track */
@@ -147,7 +150,7 @@ main(int argc, const char *argv[])
unsigned int i;
char *cd_image_name = NULL;
- if (argc > 1)
+ if (argc > 1)
cd_image_name = strdup(argv[1]);
cdio_log_set_handler (log_handler);
@@ -156,6 +159,7 @@ main(int argc, const char *argv[])
if (NULL == p_cdio) {
printf("-- Problem in trying to find a driver.\n\n");
+ free(cd_image_name);
return 77;
}
@@ -178,48 +182,49 @@ main(int argc, const char *argv[])
printf("-- Audio CD\n");
} else {
/* we have data track(s) */
- cdio_iso_analysis_t cdio_iso_analysis;
+ cdio_iso_analysis_t cdio_iso_analysis;
memset(&cdio_iso_analysis, 0, sizeof(cdio_iso_analysis));
-
+
for (i = first_data; i <= num_tracks; i++) {
lsn_t lsn;
track_format_t track_format = cdio_get_track_format(p_cdio, i);
-
+
lsn = cdio_get_track_lsn(p_cdio, i);
-
+
switch ( track_format ) {
case TRACK_FORMAT_AUDIO:
case TRACK_FORMAT_ERROR:
break;
case TRACK_FORMAT_CDI:
case TRACK_FORMAT_XA:
- case TRACK_FORMAT_DATA:
- case TRACK_FORMAT_PSX:
+ case TRACK_FORMAT_DATA:
+ case TRACK_FORMAT_PSX:
;
}
-
+
start_track = (i == 1) ? 0 : lsn;
-
+
/* save the start of the data area */
- if (i == first_data)
+ if (i == first_data)
data_start = start_track;
-
+
/* skip tracks which belong to the current walked session */
if (start_track < data_start + cdio_iso_analysis.isofs_size)
continue;
-
+
fs = cdio_guess_cd_type(p_cdio, start_track, i, &cdio_iso_analysis);
-
+
print_analysis(cdio_iso_analysis, fs, first_data, num_audio);
-
+
if ( !(CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660 ||
CDIO_FSTYPE(fs) == CDIO_FS_ISO_HFS ||
CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) )
/* no method for non-ISO9660 multisessions */
- break;
+ break;
}
}
+ free(cd_image_name);
cdio_destroy(p_cdio);
return 0;
}
Index: libcdio-0.94/lib/driver/gnu_linux.c
===================================================================
--- libcdio-0.94.orig/lib/driver/gnu_linux.c
+++ libcdio-0.94/lib/driver/gnu_linux.c
@@ -1580,7 +1580,6 @@ close_tray_linux (const char *psz_device
cdio_info ("CDROM_DRIVE_STATUS failed: %s, trying anyway",
strerror(errno));
try_anyway:
- i_rc = DRIVER_OP_SUCCESS;
if((i_rc = ioctl(fd, CDROMCLOSETRAY)) != 0) {
cdio_warn ("ioctl CDROMCLOSETRAY failed: %s\n", strerror(errno));
i_rc = DRIVER_OP_ERROR;
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
@@ -212,7 +212,7 @@ _read_bincue (void *p_user_data, void *d
final_size += this_size;
memcpy (p, buf, this_size);
p += this_size;
- this_size = cdio_stream_read(p_env->gen.data_source, buf, rem, 1);
+ cdio_stream_read(p_env->gen.data_source, buf, rem, 1);
/* Skip over stuff at end of this sector and the beginning of the next.
*/
Index: libcdio-0.94/lib/driver/image/cdrdao.c
===================================================================
--- libcdio-0.94.orig/lib/driver/image/cdrdao.c
+++ libcdio-0.94/lib/driver/image/cdrdao.c
@@ -219,7 +219,7 @@ _read_cdrdao (void *user_data, void *dat
final_size += this_size;
memcpy (p, buf, this_size);
p += this_size;
- this_size = cdio_stream_read(this_track->data_source, buf, rem, 1);
+ cdio_stream_read(this_track->data_source, buf, rem, 1);
/* Skip over stuff at end of this sector and the beginning of the next.
*/
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
@@ -247,16 +247,15 @@ parse_nrg (_img_private_t *p_env, const
entries /= sizeof (_cuex_array_t);
if (CUES_ID == opcode) {
- lsn_t lsn = UINT32_FROM_BE (_entries[0].lsn);
unsigned int idx;
unsigned int i = 0;
-
- cdio_debug ("CUES type image detected" );
-
+ lsn_t lsn; /* = UINT32_FROM_BE (_entries[0].lsn); */
/* CUES LSN has 150 pregap include at beginning? -/
cdio_assert (lsn == 0?);
*/
+ cdio_debug ("CUES type image detected" );
+
p_env->is_cues = true; /* HACK alert. */
p_env->gen.i_tracks = 0;
p_env->gen.i_first_track = 1;
@@ -1271,12 +1270,15 @@ cdio_is_nrg(const char *psz_nrg)
_img_private_t *p_env = calloc(1, sizeof (_img_private_t));
bool is_nrg = false;
- if (psz_nrg == NULL) return false;
+ if (psz_nrg == NULL) {
+ is_nrg = false;
+ goto exit;
+ }
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;
+ is_nrg = false;
+ goto exit;
}
if (parse_nrg(p_env, psz_nrg, CDIO_LOG_INFO)) {
@@ -1285,11 +1287,15 @@ cdio_is_nrg(const char *psz_nrg)
size_t psz_len;
psz_len = strlen(psz_nrg);
/* At least 4 characters needed for .nrg extension */
- if ( psz_len < 4 ) return false;
+ if ( psz_len < 4 ) {
+ is_nrg = false;
+ goto exit;
+ }
is_nrg = strncasecmp( psz_nrg+(psz_len-3), "nrg", 3 ) == 0;
#endif
}
+ exit:
_free_nrg(p_env);
return is_nrg;
}
Index: libcdio-0.94/lib/iso9660/iso9660.c
===================================================================
--- libcdio-0.94.orig/lib/iso9660/iso9660.c
+++ libcdio-0.94/lib/iso9660/iso9660.c
@@ -781,7 +781,8 @@ iso9660_dir_add_entry_su(void *dir,
? strlen(filename) : 1); /* working hack! */
memcpy(&idr->filename.str[1], filename, from_711(idr->filename.len));
- memcpy(&dir8[offset] + su_offset, su_data, su_size);
+ if (su_size > 0 && su_data)
+ memcpy(&dir8[offset] + su_offset, su_data, su_size);
}
void
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
@@ -1105,7 +1105,10 @@ _fs_iso_stat_traverse (iso9660_t *p_iso,
}
ret = iso9660_iso_seek_read (p_iso, _dirbuf, _root->lsn, _root->secsize);
- if (ret!=ISO_BLOCKSIZE*_root->secsize) return NULL;
+ if (ret!=ISO_BLOCKSIZE*_root->secsize) {
+ free(_dirbuf);
+ return NULL;
+ }
while (offset < (_root->secsize * ISO_BLOCKSIZE))
{
@@ -1346,12 +1349,14 @@ iso9660_fs_readdir (CdIo_t *p_cdio, cons
if (!_dirbuf)
{
cdio_warn("Couldn't calloc(1, %d)", p_stat->secsize * ISO_BLOCKSIZE);
+ iso9660_stat_free(p_stat);
_cdio_list_free (retval, true, NULL);
return NULL;
}
if (cdio_read_data_sectors (p_cdio, _dirbuf, p_stat->lsn,
ISO_BLOCKSIZE, p_stat->secsize)) {
+ iso9660_stat_free(p_stat);
_cdio_list_free (retval, true, NULL);
return NULL;
}
@@ -1689,7 +1694,10 @@ iso_have_rr_traverse (iso9660_t *p_iso,
}
ret = iso9660_iso_seek_read (p_iso, _dirbuf, _root->lsn, _root->secsize);
- if (ret!=ISO_BLOCKSIZE*_root->secsize) return false;
+ if (ret!=ISO_BLOCKSIZE*_root->secsize) {
+ free(_dirbuf);
+ return false;
+ }
while (offset < (_root->secsize * ISO_BLOCKSIZE))
{
Index: libcdio-0.94/lib/iso9660/rock.c
===================================================================
--- libcdio-0.94.orig/lib/iso9660/rock.c
+++ libcdio-0.94/lib/iso9660/rock.c
@@ -432,8 +432,9 @@ parse_rock_ridge_stat_internal(iso9660_d
switch(p_sl->flags &~1){
case 0:
realloc_symlink(p_stat, p_sl->len);
- memcpy(&(p_stat->rr.psz_symlink[p_stat->rr.i_symlink]),
- p_sl->text, p_sl->len);
+ if (p_sl->text && p_sl->len)
+ memcpy(&(p_stat->rr.psz_symlink[p_stat->rr.i_symlink]),
+ p_sl->text, p_sl->len);
p_stat->rr.i_symlink += p_sl->len;
break;
case 4:
Index: libcdio-0.94/src/cdda-player.c
===================================================================
--- libcdio-0.94.orig/src/cdda-player.c
+++ libcdio-0.94/src/cdda-player.c
@@ -269,7 +269,6 @@ select_wait(int sec)
fd_set se;
FD_ZERO(&se);
- FD_SET(0,&se);
tv.tv_sec = sec;
tv.tv_usec = 0;
return select(1,&se,NULL,NULL,&tv);
@@ -288,7 +287,7 @@ action(const char *psz_action)
}
if (!psz_action)
- psz_action = psz_action_line;
+ ;
else if (psz_action && strlen(psz_action))
snprintf(psz_action_line, sizeof(psz_action_line), "action : %s",
psz_action);
Index: libcdio-0.94/test/driver/cdda.c
===================================================================
--- libcdio-0.94.orig/test/driver/cdda.c
+++ libcdio-0.94/test/driver/cdda.c
@@ -1,6 +1,6 @@
/* -*- C -*-
Copyright (C) 2012 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
@@ -15,7 +15,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/*
+/*
Unit test for cdda-like things lib/driver/disc.c
*/
#ifdef HAVE_CONFIG_H
@@ -40,8 +40,9 @@
int
main(int argc, const char *argv[])
{
- char *mcn = cdio_get_mcn(NULL);
-
+ char *mcn;
+ cdio_get_mcn(NULL);
+
cdio_log_set_handler(log_handler);
cdio_loglevel_default = (argc > 1) ? CDIO_LOG_DEBUG : CDIO_LOG_INFO;
@@ -51,6 +52,6 @@ main(int argc, const char *argv[])
printf("Should have gotten NULL for MCN for cdio object\n");
return 1;
}
-
+
return 0;
}
Index: libcdio-0.94/test/driver/mmc_read.c
===================================================================
--- libcdio-0.94.orig/test/driver/mmc_read.c
+++ libcdio-0.94/test/driver/mmc_read.c
@@ -303,7 +303,7 @@ wait_for_drive(CdIo_t *p_cdio, unsigned
static int
test_read(char *psz_drive_path, unsigned int i_flag)
{
- int sense_avail = 0, i_ret, i_sense_valid, i_size, alloc_len = 10;
+ int sense_avail = 0, i_ret = 0, i_sense_valid, i_size, alloc_len = 10;
bool b_verbose = !!(i_flag & 1);
int old_log_level = cdio_loglevel_default;
cdio_mmc_request_sense_t sense_reply;
@@ -326,7 +326,7 @@ test_read(char *psz_drive_path, unsigned
scsi_tuple = cdio_get_arg(p_cdio, "scsi-tuple");
if (scsi_tuple == NULL) {
fprintf(stderr, "Error: cdio_get_arg(\"scsi-tuple\") returns NULL.\n");
- i_ret = 6; goto ex;
+ i_ret += 6; goto ex;
} else if (i_flag & 1)
printf("Drive '%s' has cdio_get_arg(\"scsi-tuple\") = '%s'\n",
psz_drive_path, scsi_tuple);
@@ -339,11 +339,11 @@ test_read(char *psz_drive_path, unsigned
fprintf(stderr,
"Error: Drive not ready. Only %d sense bytes. Expected >= 18.\n",
sense_avail);
- i_ret = 2; goto ex;
+ i_ret += 2; goto ex;
}
/* Cause sense reply failure by requesting inappropriate mode page 3Eh */
- i_ret = mode_sense(p_cdio, &sense_avail, &sense_reply,
+ i_ret += mode_sense(p_cdio, &sense_avail, &sense_reply,
0x3e, 0, alloc_len, buf, &i_size, b_verbose);
if (i_ret != 0 && sense_avail < 18) {
@@ -452,7 +452,7 @@ main(int argc, const char *argv[])
printf("Got status %d back from get_disc_erasable(%s)\n",
i_status, psz_source);
}
- i_status = get_disctype(p_cdio, b_verbose);
+ get_disctype(p_cdio, b_verbose);
if ( psz_have_mmc
&& 0 == strncmp("true", psz_have_mmc, sizeof("true")) ) {
Index: libcdio-0.94/test/testgetdevices.c
===================================================================
--- libcdio-0.94.orig/test/testgetdevices.c
+++ libcdio-0.94/test/testgetdevices.c
@@ -171,32 +171,34 @@ main(int argc, const char *argv[])
if (ret != 0) return ret;
if (0 == chdir(DATA_DIR)) {
- nrg_images = cdio_get_devices(DRIVER_NRG);
-
- for (imgs=nrg_images; *imgs != NULL; imgs++) {
- printf("-- NRG image %s\n", *imgs);
- }
-
- if (!is_in(nrg_images, nrg_files[0])) {
- cdio_free_device_list(nrg_images);
- return 10;
- }
-
- for (i=0; i<2; i++) {
- if (is_in(bincue_images, cue_files[i])) {
- printf("-- %s parses as a CDRWIN BIN/CUE csheet.\n",
- cue_files[i]);
- } else {
- printf("-- %s doesn't parse as a CDRWIN BIN/CUE csheet.\n",
- cue_files[i]);
- ret = i+1;
- }
- }
+ int invalid_images = 0;
+ nrg_images = cdio_get_devices(DRIVER_NRG);
+ for (imgs=nrg_images; *imgs != NULL; imgs++) {
+ printf("-- NRG image %s\n", *imgs);
+ }
+
+ if (!is_in(nrg_images, nrg_files[0])) {
+ cdio_free_device_list(nrg_images);
+ return 10;
+ }
+
+ for (i=0; i<2; i++) {
+ if (is_in(bincue_images, cue_files[i])) {
+ printf("-- %s parses as a CDRWIN BIN/CUE csheet.\n",
+ cue_files[i]);
+ } else {
+ printf("-- %s doesn't parse as a CDRWIN BIN/CUE csheet.\n",
+ cue_files[i]);
+ invalid_images += 1;
+ }
+ }
+ printf("invaid images is %d\n", invalid_images);
+ ret = invalid_images != 2;
}
cdio_free_device_list(nrg_images);
cdio_free_device_list(bincue_images);
- return 0;
+ return ret;
#endif
}
Index: libcdio-0.94/test/testiso9660.c
===================================================================
--- libcdio-0.94.orig/test/testiso9660.c
+++ libcdio-0.94/test/testiso9660.c
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2003, 2006, 2007, 2008, 2009, 2011
+ Copyright (C) 2003, 2006-2009, 2011, 2017
Rocky Bernstein <rocky@gnu.org>
This program is free software: you can redistribute it and/or modify
@@ -173,12 +173,12 @@ main (int argc, const char *argv[])
* Test iso9660_strncpy_pad
*********************************************/
- dst_p = iso9660_strncpy_pad(dst, "1_3", 5, ISO9660_DCHARS);
+ iso9660_strncpy_pad(dst, "1_3", 5, ISO9660_DCHARS);
if ( 0 != strncmp(dst, "1_3 ", 5) ) {
printf("Failed iso9660_strncpy_pad DCHARS\n");
return 31;
}
- dst_p = iso9660_strncpy_pad(dst, "ABC!123", 2, ISO9660_ACHARS);
+ iso9660_strncpy_pad(dst, "ABC!123", 2, ISO9660_ACHARS);
if ( 0 != strncmp(dst, "AB", 2) ) {
printf("Failed iso9660_strncpy_pad ACHARS truncation\n");
return 32;
Index: libcdio-0.94/test/testisocd.c
===================================================================
--- libcdio-0.94.orig/test/testisocd.c
+++ libcdio-0.94/test/testisocd.c
@@ -147,8 +147,6 @@ main(int argc, const char *argv[])
rc=7;
}
exit:
- if (psz_path != NULL)
- free(psz_path);
iso9660_stat_free(p_statbuf);
iso9660_stat_free(p_statbuf2);
iso9660_stat_free(p_statbuf3);