112 lines
3.5 KiB
Diff
112 lines
3.5 KiB
Diff
diff --git a/src/itdb_itunesdb.c b/src/itdb_itunesdb.c
|
|
index c41e758..3f352e1 100644
|
|
--- a/src/itdb_itunesdb.c
|
|
+++ b/src/itdb_itunesdb.c
|
|
@@ -1286,6 +1286,45 @@ static gint32 get_mhod_type (FContents *cts, glong seek, guint32 *ml)
|
|
return type;
|
|
}
|
|
|
|
+static char *extract_mhod_string (FContents *cts, glong seek)
|
|
+{
|
|
+ gunichar2 *entry_utf16;
|
|
+ char *entry_utf8;
|
|
+ gint string_type;
|
|
+ gsize len;
|
|
+
|
|
+ /* type of string: 0x02: UTF8, 0x01 or 0x00: UTF16 LE */
|
|
+ string_type = get32lint (cts, seek);
|
|
+ len = get32lint (cts, seek+4); /* length of string */
|
|
+ g_return_val_if_fail (len < G_MAXUINT - 2, NULL);
|
|
+ if (string_type != 0x02) {
|
|
+ /* UTF-16 string */
|
|
+ entry_utf16 = g_new0 (gunichar2, (len+2)/2);
|
|
+ if (seek_get_n_bytes (cts, (gchar *)entry_utf16, seek+16, len)) {
|
|
+ fixup_little_utf16 (entry_utf16);
|
|
+ entry_utf8= g_utf16_to_utf8 (entry_utf16, -1, NULL, NULL, NULL);
|
|
+ g_free (entry_utf16);
|
|
+ } else {
|
|
+ g_free (entry_utf16);
|
|
+ return NULL;
|
|
+ }
|
|
+ } else {
|
|
+ /* UTF-8 string */
|
|
+ entry_utf8 = g_new0 (gchar, len+1);
|
|
+ if (!seek_get_n_bytes (cts, entry_utf8, seek+16, len)) {
|
|
+ g_free (entry_utf8);
|
|
+ return NULL;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (g_utf8_validate (entry_utf8, -1, NULL)) {
|
|
+ return entry_utf8;
|
|
+ } else {
|
|
+ g_free (entry_utf8);
|
|
+ return NULL;
|
|
+ }
|
|
+}
|
|
+
|
|
/* Returns the contents of the mhod at position @mhod_seek. This can
|
|
be a simple string or something more complicated as in the case for
|
|
Itdb_SPLPREF OR Itdb_SPLRULES.
|
|
@@ -1303,12 +1342,10 @@ static gint32 get_mhod_type (FContents *cts, glong seek, guint32 *ml)
|
|
|
|
static MHODData get_mhod (FImport *fimp, glong mhod_seek, guint32 *ml)
|
|
{
|
|
- gunichar2 *entry_utf16 = NULL;
|
|
MHODData result;
|
|
gint32 xl;
|
|
guint32 mhod_len;
|
|
gint32 header_length;
|
|
- guint32 string_type;
|
|
gulong seek;
|
|
FContents *cts;
|
|
|
|
@@ -1384,34 +1421,9 @@ static MHODData get_mhod (FImport *fimp, glong mhod_seek, guint32 *ml)
|
|
case MHOD_ID_SORT_ALBUMARTIST:
|
|
case MHOD_ID_SORT_COMPOSER:
|
|
case MHOD_ID_SORT_TVSHOW:
|
|
- /* type of string: 0x02: UTF8, 0x01 or 0x00: UTF16 LE */
|
|
- string_type = get32lint (cts, seek);
|
|
- xl = get32lint (cts, seek+4); /* length of string */
|
|
- g_return_val_if_fail (xl < G_MAXUINT - 2, result);
|
|
- if (string_type != 0x02)
|
|
- {
|
|
- entry_utf16 = g_new0 (gunichar2, (xl+2)/2);
|
|
- if (seek_get_n_bytes (cts, (gchar *)entry_utf16, seek+16, xl))
|
|
- {
|
|
- fixup_little_utf16 (entry_utf16);
|
|
- result.data.string = g_utf16_to_utf8 (entry_utf16, -1,
|
|
- NULL, NULL, NULL);
|
|
- g_free (entry_utf16);
|
|
- }
|
|
- else
|
|
- { /* error */
|
|
- g_free (entry_utf16);
|
|
- return result; /* *ml==-1, result.valid==FALSE */
|
|
- }
|
|
- }
|
|
- else
|
|
- {
|
|
- result.data.string = g_new0 (gchar, xl+1);
|
|
- if (!seek_get_n_bytes (cts, result.data.string, seek+16, xl))
|
|
- { /* error */
|
|
- g_free (entry_utf16);
|
|
- return result; /* *ml==-1, result.valid==FALSE */
|
|
- }
|
|
+ result.data.string = extract_mhod_string (cts, seek);
|
|
+ if (result.data.string == NULL) {
|
|
+ return result;
|
|
}
|
|
break;
|
|
case MHOD_ID_PODCASTURL:
|
|
--- libgpod-0.7.2/src/itdb_itunesdb.c.old 2009-10-19 16:53:13.000000000 +0100
|
|
+++ libgpod-0.7.2/src/itdb_itunesdb.c 2009-10-19 16:53:57.000000000 +0100
|
|
@@ -1423,6 +1423,7 @@ static MHODData get_mhod (FImport *fimp,
|
|
case MHOD_ID_SORT_TVSHOW:
|
|
result.data.string = extract_mhod_string (cts, seek);
|
|
if (result.data.string == NULL) {
|
|
+ *ml = mhod_len;
|
|
return result;
|
|
}
|
|
break;
|