--- utf16.orig.c 2010-03-27 19:27:04.000000000 -1000 +++ utf16.c 2010-03-27 19:29:44.000000000 -1000 @@ -248,6 +248,7 @@ id3_byte_t const *end; id3_utf16_t *utf16ptr, *utf16; id3_ucs4_t *ucs4; + int bom; end = *ptr + (length & ~1); @@ -256,17 +257,25 @@ return 0; if (byteorder == ID3_UTF16_BYTEORDER_ANY && end - *ptr > 0) { - switch (((*ptr)[0] << 8) | - ((*ptr)[1] << 0)) { - case 0xfeff: - byteorder = ID3_UTF16_BYTEORDER_BE; - *ptr += 2; - break; - - case 0xfffe: - byteorder = ID3_UTF16_BYTEORDER_LE; - *ptr += 2; - break; + /* Handle more than 1 byte order mark. Last one counts. */ + bom = 1; + while (bom) { + switch (((*ptr)[0] << 8) | + ((*ptr)[1] << 0)) { + case 0xfeff: + byteorder = ID3_UTF16_BYTEORDER_BE; + *ptr += 2; + break; + + case 0xfffe: + byteorder = ID3_UTF16_BYTEORDER_LE; + *ptr += 2; + break; + + default: + bom = 0; + break; + } } }