aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/id3v23_extractor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/id3v23_extractor.c')
-rw-r--r--src/plugins/id3v23_extractor.c41
1 files changed, 17 insertions, 24 deletions
diff --git a/src/plugins/id3v23_extractor.c b/src/plugins/id3v23_extractor.c
index 11b04d9..71553c2 100644
--- a/src/plugins/id3v23_extractor.c
+++ b/src/plugins/id3v23_extractor.c
@@ -35,19 +35,6 @@
35 35
36#include "convert.h" 36#include "convert.h"
37 37
38static struct EXTRACTOR_Keywords *
39addKeyword (EXTRACTOR_KeywordList * oldhead,
40 char *phrase, EXTRACTOR_KeywordType type)
41{
42 EXTRACTOR_KeywordList *keyword;
43
44 keyword = malloc (sizeof (EXTRACTOR_KeywordList));
45 keyword->next = oldhead;
46 keyword->keyword = phrase;
47 keyword->keywordType = type;
48 return keyword;
49}
50
51typedef struct 38typedef struct
52{ 39{
53 const char *text; 40 const char *text;
@@ -122,7 +109,7 @@ EXTRACTOR_id3v23_extract (const unsigned char *data,
122 (data[0] != 0x49) || 109 (data[0] != 0x49) ||
123 (data[1] != 0x44) || 110 (data[1] != 0x44) ||
124 (data[2] != 0x33) || (data[3] != 0x03) || (data[4] != 0x00)) 111 (data[2] != 0x33) || (data[3] != 0x03) || (data[4] != 0x00))
125 return prev; 112 return 0;
126 unsync = (data[5] & 0x80) > 0; 113 unsync = (data[5] & 0x80) > 0;
127 extendedHdr = (data[5] & 0x40) > 0; 114 extendedHdr = (data[5] & 0x40) > 0;
128 experimental = (data[5] & 0x20) > 0; 115 experimental = (data[5] & 0x20) > 0;
@@ -130,7 +117,7 @@ EXTRACTOR_id3v23_extract (const unsigned char *data,
130 ((data[7] & 0x7F) << 14) | 117 ((data[7] & 0x7F) << 14) |
131 ((data[8] & 0x7F) << 7) | ((data[9] & 0x7F) << 0)); 118 ((data[8] & 0x7F) << 7) | ((data[9] & 0x7F) << 0));
132 if ((tsize + 10 > size) || (experimental)) 119 if ((tsize + 10 > size) || (experimental))
133 return prev; 120 return 0;
134 pos = 10; 121 pos = 10;
135 padding = 0; 122 padding = 0;
136 if (extendedHdr) 123 if (extendedHdr)
@@ -144,14 +131,14 @@ EXTRACTOR_id3v23_extract (const unsigned char *data,
144 if (padding < tsize) 131 if (padding < tsize)
145 tsize -= padding; 132 tsize -= padding;
146 else 133 else
147 return prev; 134 return 0;
148 } 135 }
149 136
150 137
151 while (pos < tsize) 138 while (pos < tsize)
152 { 139 {
153 if (pos + 10 > tsize) 140 if (pos + 10 > tsize)
154 return prev; 141 return 0;
155 csize = 142 csize =
156 (data[pos + 4] << 24) + (data[pos + 5] << 16) + (data[pos + 6] << 8) + 143 (data[pos + 4] << 24) + (data[pos + 5] << 16) + (data[pos + 6] << 8) +
157 data[pos + 7]; 144 data[pos + 7];
@@ -200,20 +187,26 @@ EXTRACTOR_id3v23_extract (const unsigned char *data,
200 pos++; 187 pos++;
201 if ((word != NULL) && (strlen (word) > 0)) 188 if ((word != NULL) && (strlen (word) > 0))
202 { 189 {
203 prev = addKeyword (prev, word, tmap[i].type); 190 if (0 != proc (proc_cls,
204 } 191 "id3v2",
205 else 192 tmap[i].type,
206 { 193 EXTRACTOR_METAFORMAT_UTF8,
207 if (word != NULL) 194 "text/plain",
208 free (word); 195 word,
196 strlen(word)+1))
197 {
198 free (word);
199 return 1;
200 }
209 } 201 }
202 free (word);
210 break; 203 break;
211 } 204 }
212 i++; 205 i++;
213 } 206 }
214 pos += 10 + csize; 207 pos += 10 + csize;
215 } 208 }
216 return prev; 209 return 0;
217} 210}
218 211
219/* end of id3v23_extractor.c */ 212/* end of id3v23_extractor.c */