diff options
Diffstat (limited to 'lib/rbcodec/metadata/ape.c')
-rw-r--r-- | lib/rbcodec/metadata/ape.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/lib/rbcodec/metadata/ape.c b/lib/rbcodec/metadata/ape.c index 718f547bda..f72ce9179e 100644 --- a/lib/rbcodec/metadata/ape.c +++ b/lib/rbcodec/metadata/ape.c | |||
@@ -27,11 +27,8 @@ | |||
27 | #include "metadata.h" | 27 | #include "metadata.h" |
28 | #include "metadata_common.h" | 28 | #include "metadata_common.h" |
29 | #include "metadata_parsers.h" | 29 | #include "metadata_parsers.h" |
30 | #include "structec.h" | ||
31 | 30 | ||
32 | #define APETAG_HEADER_LENGTH 32 | 31 | #define APETAG_HEADER_LENGTH 32 |
33 | #define APETAG_HEADER_FORMAT "8llll8" | ||
34 | #define APETAG_ITEM_HEADER_FORMAT "ll" | ||
35 | #define APETAG_ITEM_TYPE_MASK 3 | 32 | #define APETAG_ITEM_TYPE_MASK 3 |
36 | 33 | ||
37 | struct apetag_header | 34 | struct apetag_header |
@@ -57,12 +54,22 @@ bool read_ape_tags(int fd, struct mp3entry* id3) | |||
57 | { | 54 | { |
58 | struct apetag_header header; | 55 | struct apetag_header header; |
59 | 56 | ||
60 | if ((lseek(fd, -APETAG_HEADER_LENGTH, SEEK_END) < 0) | 57 | if (lseek(fd, -APETAG_HEADER_LENGTH, SEEK_END) < 0) |
61 | || (ecread(fd, &header, 1, APETAG_HEADER_FORMAT, IS_BIG_ENDIAN) | 58 | return false; |
62 | != APETAG_HEADER_LENGTH) | 59 | |
63 | || (memcmp(header.id, "APETAGEX", sizeof(header.id)))) | 60 | if (read(fd, &header, sizeof(header)) != APETAG_HEADER_LENGTH) |
64 | { | ||
65 | return false; | 61 | return false; |
62 | |||
63 | if (memcmp(header.id, "APETAGEX", sizeof(header.id))) | ||
64 | return false; | ||
65 | |||
66 | /* APE tag is little endian - convert to native byte order if needed */ | ||
67 | if (IS_BIG_ENDIAN) | ||
68 | { | ||
69 | header.version = swap32(header.version); | ||
70 | header.length = swap32(header.version); | ||
71 | header.item_count = swap32(header.version); | ||
72 | header.flags = swap32(header.version); | ||
66 | } | 73 | } |
67 | 74 | ||
68 | if ((header.version == 2000) && (header.item_count > 0) | 75 | if ((header.version == 2000) && (header.item_count > 0) |
@@ -90,13 +97,16 @@ bool read_ape_tags(int fd, struct mp3entry* id3) | |||
90 | { | 97 | { |
91 | break; | 98 | break; |
92 | } | 99 | } |
93 | 100 | ||
94 | if (ecread(fd, &item, 1, APETAG_ITEM_HEADER_FORMAT, IS_BIG_ENDIAN) | 101 | if (read(fd, &item, sizeof(item)) != sizeof(item)) |
95 | < (long) sizeof(item)) | ||
96 | { | ||
97 | return false; | 102 | return false; |
103 | |||
104 | if (IS_BIG_ENDIAN) | ||
105 | { | ||
106 | item.length = swap32(item.length); | ||
107 | item.flags = swap32(item.flags); | ||
98 | } | 108 | } |
99 | 109 | ||
100 | tag_remaining -= sizeof(item); | 110 | tag_remaining -= sizeof(item); |
101 | r = read_string(fd, name, sizeof(name), 0, tag_remaining); | 111 | r = read_string(fd, name, sizeof(name), 0, tag_remaining); |
102 | 112 | ||