# HG changeset patch # User nkeynes # Date 1193556226 0 # Node ID 3a49695e081a5696f15be8517c035c65d56f1061 # Parent 0120dc87e05d396d16312353da264b0956f3d9e9 Fix CDI with multiple tracks/session Fix file being closed too early --- a/src/gdrom/cdi.c Sat Oct 27 05:48:22 2007 +0000 +++ b/src/gdrom/cdi.c Sun Oct 28 07:23:46 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: cdi.c,v 1.9 2007-10-27 05:44:54 nkeynes Exp $ + * $Id: cdi.c,v 1.10 2007-10-28 07:23:46 nkeynes Exp $ * * CDI CD-image file support * @@ -107,7 +107,6 @@ disc = gdrom_image_new(filename, f); if( disc == NULL ) { - fclose(f); ERROR("Unable to allocate memory!"); return NULL; } @@ -117,7 +116,7 @@ fread( &track_count, sizeof(track_count), 1, f ); if( track_count + total_tracks > 99 ) { ERROR( "Invalid number of tracks, bad cdi image\n" ); - disc->close(disc); + gdrom_image_destroy_no_close(disc); return NULL; } for( j=0; jclose(disc); + gdrom_image_destroy_no_close(disc); return NULL; } fseek( f, 4, SEEK_CUR ); @@ -148,7 +147,7 @@ image->track[total_tracks].flags = 0x01; if( trk.sector_size != 2 ) { ERROR( "Invalid combination of mode %d with size %d", trk.mode, trk.sector_size ); - disc->close(disc); + gdrom_image_destroy_no_close(disc); return NULL; } break; @@ -158,7 +157,7 @@ image->track[total_tracks].flags = 0x41; if( trk.sector_size != 0 ) { ERROR( "Invalid combination of mode %d with size %d", trk.mode, trk.sector_size ); - disc->close(disc); + gdrom_image_destroy_no_close(disc); return NULL; } break; @@ -176,13 +175,13 @@ case 2: default: ERROR( "Invalid combination of mode %d with size %d", trk.mode, trk.sector_size ); - disc->close(disc); + gdrom_image_destroy_no_close(disc); return NULL; } break; default: ERROR( "Unsupported track mode %d", trk.mode ); - disc->close(disc); + gdrom_image_destroy_no_close(disc); return NULL; } image->track[total_tracks].offset = posn + @@ -191,11 +190,12 @@ total_tracks++; fread( marker, 1, 9, f ); if( memcmp( marker, EXT_MARKER, 9 ) == 0 ) { - fseek( f, 91, SEEK_CUR ); + fseek( f, 79, SEEK_CUR ); } else { - fseek( f, 3, SEEK_CUR ); + fseek( f, -9, SEEK_CUR ); } } + fseek( f, 12, SEEK_CUR ); } image->track_count = total_tracks; return disc; --- a/src/gdrom/gdimage.c Sat Oct 27 05:48:22 2007 +0000 +++ b/src/gdrom/gdimage.c Sun Oct 28 07:23:46 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: gdimage.c,v 1.3 2007-10-27 05:44:54 nkeynes Exp $ + * $Id: gdimage.c,v 1.4 2007-10-28 07:23:46 nkeynes Exp $ * * GD-Rom image-file common functions. * @@ -80,6 +80,19 @@ free( disc ); } +void gdrom_image_destroy_no_close( gdrom_disc_t disc ) +{ + gdrom_image_t img = (gdrom_image_t)disc; + if( img->file != NULL ) { + img->file = NULL; + } + if( disc->name != NULL ) { + g_free( disc->name ); + disc->name = NULL; + } + free( disc ); +} + static int gdrom_image_get_track_by_lba( gdrom_image_t image, uint32_t lba ) { int i; --- a/src/gdrom/gdrom.h Sat Oct 27 05:48:22 2007 +0000 +++ b/src/gdrom/gdrom.h Sun Oct 28 07:23:46 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: gdrom.h,v 1.13 2007-10-27 05:44:54 nkeynes Exp $ + * $Id: gdrom.h,v 1.14 2007-10-28 07:23:46 nkeynes Exp $ * * This file defines the structures and functions used by the GD-Rom * disc driver. (ie, the modules that supply a CD image to be used by the @@ -181,6 +181,12 @@ void gdrom_image_dump_info( gdrom_disc_t d ); /** + * Destroy an image data structure without closing the file + * (Intended for use from image loaders only) + */ +void gdrom_image_destroy_no_close( gdrom_disc_t d ); + +/** * Retrieve the disc table of contents, and write it into the buffer in the * format expected by the DC. * @return 0 on success, error code on failure (eg no disc mounted) --- a/src/gdrom/linux.c Sat Oct 27 05:48:22 2007 +0000 +++ b/src/gdrom/linux.c Sun Oct 28 07:23:46 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: linux.c,v 1.6 2007-10-27 05:44:54 nkeynes Exp $ + * $Id: linux.c,v 1.7 2007-10-28 07:23:46 nkeynes Exp $ * * Linux cd-rom device driver. * @@ -115,7 +115,7 @@ gdrom_error_t status = linux_read_disc_toc( (gdrom_image_t)disc ); if( status != 0 ) { - disc->close(disc); + gdrom_image_destroy_no_close(disc); if( status == 0xFFFF ) { ERROR("Unable to load disc table of contents (%s)", strerror(errno)); } else { --- a/src/gdrom/nrg.c Sat Oct 27 05:48:22 2007 +0000 +++ b/src/gdrom/nrg.c Sun Oct 28 07:23:46 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: nrg.c,v 1.6 2007-10-27 05:44:54 nkeynes Exp $ + * $Id: nrg.c,v 1.7 2007-10-28 07:23:46 nkeynes Exp $ * * Nero (NRG) CD file format. File information stolen shamelessly from * libcdio. @@ -180,7 +180,6 @@ disc = gdrom_image_new(filename, f); if( disc == NULL ) { - fclose(f); ERROR("Unable to allocate memory!"); return NULL; } @@ -249,7 +248,7 @@ image->track[track_id].lba = ntohl(etnf->lba) + (i+1)*GDROM_PREGAP; image->track[track_id].mode = nrg_track_mode( ntohl(etnf->mode) ); if( image->track[track_id].mode == -1 ) { - disc->close(disc); + gdrom_image_destroy_no_close(disc); return NULL; } if( image->track[track_id].mode == GDROM_CDDA )