From ed33e372141f07081eac156b6eb0cc2a2e1b00fd Mon Sep 17 00:00:00 2001 From: Chris Moeller Date: Thu, 30 Jun 2016 15:40:43 -0700 Subject: [PATCH] Fix file handle leak in vgmstream decoder. --- Plugins/vgmstream/vgmstream/VGMDecoder.m | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Plugins/vgmstream/vgmstream/VGMDecoder.m b/Plugins/vgmstream/vgmstream/VGMDecoder.m index a03987d40..f054f8875 100644 --- a/Plugins/vgmstream/vgmstream/VGMDecoder.m +++ b/Plugins/vgmstream/vgmstream/VGMDecoder.m @@ -110,15 +110,13 @@ VGMSTREAM *init_vgmstream_from_cogfile(const char *path) { VGMSTREAM *vgm; sf = cogsf_create_from_path(path); - if (!sf) return NULL; - vgm = init_vgmstream_from_STREAMFILE(sf); - if (!vgm) goto err1; + if (sf) { + vgm = init_vgmstream_from_STREAMFILE(sf); + cogsf_close((COGSTREAMFILE *)sf); + } return vgm; -err1: - cogsf_close((COGSTREAMFILE *)sf); - return NULL; } @implementation VGMDecoder @@ -195,6 +193,13 @@ err1: - (long)seek:(long)frame { + // Constrain the seek offset to within the loop, if any + if(stream->loop_flag && (stream->loop_end_sample - stream->loop_start_sample) && frame >= stream->loop_end_sample) { + frame -= stream->loop_start_sample; + frame %= (stream->loop_end_sample - stream->loop_start_sample); + frame += stream->loop_start_sample; + } + if (frame < framesRead) { reset_vgmstream( stream ); framesRead = 0;