Package: xmms-scrobbler Version: 0.3.8.1-4 Severity: important Tags: patch
While reading id3v2 tags there is a situation with BOM parsing where memsize is set negative in function tags/unicode.s:utf16bom_to_utf8 and a trial to call strlen for null pointer in tags/id3v2.c:parseFrame. This patch fixes those problems at least somehow and makes wchar_to_utf8 function more robust. -- System Information: Debian Release: 4.0 APT prefers testing APT policy: (500, 'testing') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/bash Kernel: Linux 2.6.18 Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Versions of packages xmms-scrobbler depends on: ii libc6 2.3.6.ds1-8 GNU C Library: Shared libraries ii libcomer 1.39+1.40-WIP-2006.11.14+dfsg-1 common error description library ii libcurl3 7.15.5-1 Multi-protocol file transfer libra ii libidn11 0.6.5-1 GNU libidn library, implementation ii libkrb53 1.4.4-5 MIT Kerberos runtime libraries ii libmusic 2.1.4-1 Second generation incarnation of t ii libssl0. 0.9.8c-4 SSL shared libraries ii libstdc+ 4.1.1-19 The GNU Standard C++ Library v3 ii xmms 1:1.2.10+20061101-1 Versatile X audio player ii zlib1g 1:1.2.3-13 compression library - runtime xmms-scrobbler recommends no packages. -- no debconf information
diff -Naur xmms-scrobbler-0.3.8.1/tags/id3v2.c xmms-scrobbler-0.3.8.1-patched/tags/id3v2.c --- xmms-scrobbler-0.3.8.1/tags/id3v2.c 2005-02-20 21:11:22.000000000 +0200 +++ xmms-scrobbler-0.3.8.1-patched/tags/id3v2.c 2007-01-13 02:23:42.667399062 +0200 @@ -433,11 +433,20 @@ utf = realloc(utf, framedata->len); strcpy(utf, data); } - framedata->len = strlen(utf) + 1; - framedata->data = realloc(framedata->data, framedata->len); - strcpy(framedata->data, utf); + + if (utf != NULL) + { + framedata->len = strlen(utf) + 1; + framedata->data = realloc(framedata->data, framedata->len); + strcpy(framedata->data, utf); + free(utf); + } + else + { + framedata->len = 1; + framedata->data = realloc(framedata->data, framedata->len); + } framedata->data[framedata->len - 1] = '\0'; - free(utf); free(data); } /* Or unsync. */ diff -Naur xmms-scrobbler-0.3.8.1/tags/unicode.c xmms-scrobbler-0.3.8.1-patched/tags/unicode.c --- xmms-scrobbler-0.3.8.1/tags/unicode.c 2004-03-28 21:15:37.000000000 +0300 +++ xmms-scrobbler-0.3.8.1-patched/tags/unicode.c 2007-01-13 02:27:43.034319439 +0200 @@ -86,6 +86,11 @@ { int i; unsigned char *mem, *ptr; + + if (memsize < 0) + { + return 0; + } mem = calloc(memsize * 6 + 1, 1); ptr = mem; @@ -157,6 +162,11 @@ unsigned char utf16char[2]; int endian = 0, i; + if (memsize < 2) + { + return; + } + wchar = calloc(sizeof(wchar_t) * memsize / 2 - 1, 1); for(i = 0; i < memsize; i += 2) {