/*
- * Copyright (C) 2003-2013 Andre Noll <maan@systemlinux.org>
+ * 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;
}
for (i = 0; i < id3_t->nframes; i++) {
struct id3_frame *fr = id3_t->frames[i];
- if (!strcmp(fr->id, "TIT2")) {
+ if (!strcmp(fr->id, ID3_FRAME_TITLE)) {
if (!tags->title)
tags->title = get_strings(fr);
continue;
}
- if (!strcmp(fr->id, "TPE1")) {
+ if (!strcmp(fr->id, ID3_FRAME_ARTIST)) {
if (!tags->artist)
tags->artist = get_strings(fr);
continue;
}
- if (!strcmp(fr->id, "TALB")) {
+ if (!strcmp(fr->id, ID3_FRAME_ALBUM)) {
if (!tags->album)
tags->album = get_strings(fr);
continue;
}
- if (!strcmp(fr->id, "TDRC")) {
+ if (!strcmp(fr->id, ID3_FRAME_YEAR)) {
if (!tags->year)
tags->year = get_strings(fr);
continue;
}
- if (!strcmp(fr->id, "COMM")) {
+ if (!strcmp(fr->id, ID3_FRAME_COMMENT)) {
if (!tags->comment)
tags->comment = get_strings(fr);
continue;