Mercurial > audlegacy-plugins
comparison src/sndfile/plugin.c @ 2555:04b1b020be88
VFS file handle was not correctly closed and freed in certain situations,
causing a filehandle shortage and crash. Fixed, based on patch and report
by Teru KAMOGASHIRA.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 08 May 2008 22:16:12 +0300 |
parents | 8d09a4d017ea |
children | bd3a24b39058 |
comparison
equal
deleted
inserted
replaced
2554:8d09a4d017ea | 2555:04b1b020be88 |
---|---|
93 sf_tell | 93 sf_tell |
94 }; | 94 }; |
95 | 95 |
96 | 96 |
97 static SNDFILE * | 97 static SNDFILE * |
98 open_sndfile_from_uri(gchar *filename, VFSFile *vfsfile, SF_INFO *tmp_sfinfo) | 98 open_sndfile_from_uri(gchar *filename, VFSFile **vfsfile, SF_INFO *tmp_sfinfo) |
99 { | 99 { |
100 SNDFILE *snd_file = NULL; | 100 SNDFILE *snd_file = NULL; |
101 vfsfile = aud_vfs_fopen(filename, "rb"); | 101 *vfsfile = aud_vfs_fopen(filename, "rb"); |
102 | 102 |
103 if (vfsfile == NULL) | 103 if (*vfsfile == NULL) |
104 return NULL; | 104 return NULL; |
105 | 105 |
106 snd_file = sf_open_virtual (&sf_virtual_io, SFM_READ, tmp_sfinfo, vfsfile); | 106 snd_file = sf_open_virtual (&sf_virtual_io, SFM_READ, tmp_sfinfo, *vfsfile); |
107 if (snd_file == NULL) | 107 if (snd_file == NULL) |
108 aud_vfs_fclose(vfsfile); | 108 aud_vfs_fclose(*vfsfile); |
109 | 109 |
110 return snd_file; | 110 return snd_file; |
111 } | 111 } |
112 | 112 |
113 static void | 113 static void |
141 SNDFILE *tmp_sndfile; | 141 SNDFILE *tmp_sndfile; |
142 SF_INFO tmp_sfinfo; | 142 SF_INFO tmp_sfinfo; |
143 gboolean lossy = FALSE; | 143 gboolean lossy = FALSE; |
144 gchar *codec, *format, *subformat; | 144 gchar *codec, *format, *subformat; |
145 | 145 |
146 tmp_sndfile = open_sndfile_from_uri(filename, vfsfile, &tmp_sfinfo); | 146 tmp_sndfile = open_sndfile_from_uri(filename, &vfsfile, &tmp_sfinfo); |
147 if ( sf_get_string(tmp_sndfile, SF_STR_TITLE) == NULL) | 147 if ( sf_get_string(tmp_sndfile, SF_STR_TITLE) == NULL) |
148 aud_tuple_associate_string(ti, FIELD_TITLE, NULL, g_path_get_basename(filename)); | 148 aud_tuple_associate_string(ti, FIELD_TITLE, NULL, g_path_get_basename(filename)); |
149 else | 149 else |
150 aud_tuple_associate_string(ti, FIELD_TITLE, NULL, sf_get_string(tmp_sndfile, SF_STR_TITLE)); | 150 aud_tuple_associate_string(ti, FIELD_TITLE, NULL, sf_get_string(tmp_sndfile, SF_STR_TITLE)); |
151 | 151 |
349 VFSFile *vfsfile = NULL; | 349 VFSFile *vfsfile = NULL; |
350 SNDFILE *tmp_sndfile; | 350 SNDFILE *tmp_sndfile; |
351 SF_INFO tmp_sfinfo; | 351 SF_INFO tmp_sfinfo; |
352 | 352 |
353 /* Have to open the file to see if libsndfile can handle it. */ | 353 /* Have to open the file to see if libsndfile can handle it. */ |
354 tmp_sndfile = open_sndfile_from_uri(filename, vfsfile, &tmp_sfinfo); | 354 tmp_sndfile = open_sndfile_from_uri(filename, &vfsfile, &tmp_sfinfo); |
355 | 355 |
356 if (!tmp_sndfile) | 356 if (!tmp_sndfile) |
357 return FALSE; | 357 return FALSE; |
358 | 358 |
359 /* It can so close file and return TRUE. */ | 359 /* It can so close file and return TRUE. */ |
444 return; | 444 return; |
445 | 445 |
446 pcmbitwidth = 32; | 446 pcmbitwidth = 32; |
447 song_title = get_title(playback->filename); | 447 song_title = get_title(playback->filename); |
448 | 448 |
449 sndfile = open_sndfile_from_uri(playback->filename, vfsfile, &sfinfo); | 449 sndfile = open_sndfile_from_uri(playback->filename, &vfsfile, &sfinfo); |
450 | 450 |
451 if (!sndfile) | 451 if (!sndfile) |
452 return; | 452 return; |
453 | 453 |
454 bit_rate = sfinfo.samplerate * pcmbitwidth; | 454 bit_rate = sfinfo.samplerate * pcmbitwidth; |