diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/id3.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/firmware/id3.c b/firmware/id3.c index 8051e461f1..2a894aab10 100644 --- a/firmware/id3.c +++ b/firmware/id3.c | |||
@@ -512,16 +512,19 @@ static int unicode_len(char encoding, const void* string) | |||
512 | int len = 0; | 512 | int len = 0; |
513 | 513 | ||
514 | if (encoding == 0x01 || encoding == 0x02) { | 514 | if (encoding == 0x01 || encoding == 0x02) { |
515 | short* s = (short*) string; | 515 | bool iswchar; |
516 | 516 | const char *s = string; | |
517 | while (*s++) { | 517 | /* string might be unaligned, so using short* can crash on ARM and SH1 */ |
518 | } | 518 | do { |
519 | 519 | iswchar = (*s++ != 0); | |
520 | len = (void*) s - string; | 520 | iswchar |= (*s++ != 0); |
521 | } while (iswchar); | ||
522 | |||
523 | len = s - (const char*) string; | ||
521 | } else { | 524 | } else { |
522 | len = strlen((char*) string) + 1; | 525 | len = strlen((char*) string) + 1; |
523 | } | 526 | } |
524 | 527 | ||
525 | return len; | 528 | return len; |
526 | } | 529 | } |
527 | 530 | ||