/*
- * Copyright (C) 2003-2014 Andre Noll <maan@tuebingen.mpg.de>
+ * Copyright (C) 2003 Andre Noll <maan@tuebingen.mpg.de>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
static void mp3_get_id3(__a_unused unsigned char *map,
__a_unused size_t numbytes, int fd, struct taginfo *tags)
{
- int i;
+ int i, new_fd;
struct id3_tag *id3_t;
- struct id3_file *id3_f = id3_file_fdopen(fd, ID3_FILE_MODE_READONLY);
+ struct id3_file *id3_f;
+
+ /*
+ * We are not supposed to close fd, but to avoid memory leaks we must
+ * call id3_file_close() on the id3_file after we are done. As
+ * id3_file_close() closes fd, we first create a copy for libid3tag.
+ */
+ new_fd = dup(fd);
+ if (new_fd < 0)
+ return;
+ id3_f = id3_file_fdopen(new_fd, ID3_FILE_MODE_READONLY);
if (!id3_f)
return;