[pkg-mad-maintainers] Bug#405801: [Fwd: Re: Regarding debian bug #405801.]

Kurt Roeckx kurt at roeckx.be
Sat Jan 13 20:37:33 CET 2007


On Sat, Jan 13, 2007 at 06:45:36PM +0100, Andreas Henriksson wrote:
> libid3tag doesn't gracefully handle unexpected values in the
> files id3 encoding. Below is one such occation when id3_parse_uint
> apparently returns 50 (which I have no idea how it can be stored in an
> enum which doesn't contain a definition for 50).

Looking at the latest standard, the only valid encodings are 0 to 3.
50 is clearly wrong.

The field in question is TYER, which is the year, which is a "numeric
string", which should be encoded using latin1, so the encoding should
be set to 0.  It should also be 4 chars long, but it's only 3.  It
says "F+5".  This looks like a really broken tag.

Looking at the other tags, most of them don't seem to be making much
sense, some do.

> The "id3_parse_string" function doesn't have a default case in it's
> switch to catch this but (by accident?) happens to return NULL for this
> case. No error checking seems to be done in this particular caller to
> see if id3_parse_string returns NULL.

It does initialise ucs4 to NULL (0) in id3_parse_string(), and the code
there checks for it, the function that calls id3_parse_string() doesn't.

> Please verify for correctness! (The problem might be deeper, are we
> looking at the wrong byte in the file for the encoding? Am I just
> papering over a symptom of another bug?)

> diff -urip libid3tag-0.15.1b/compat.c libid3tag-0.15.1b.fixed/compat.c
> --- libid3tag-0.15.1b/compat.c	2004-02-17 03:34:39.000000000 +0100
> +++ libid3tag-0.15.1b.fixed/compat.c	2007-01-13 18:32:52.000000000 +0100
> @@ -442,6 +442,8 @@ int id3_compat_fixup(struct id3_tag *tag
>  
>      encoding = id3_parse_uint(&data, 1);
>      string   = id3_parse_string(&data, end - data, encoding, 0);
> +    if (string == NULL)
> +      goto fail;
>  
>      if (id3_ucs4_length(string) < 4) {
>        free(string);
> diff -urip libid3tag-0.15.1b/compat.gperf libid3tag-0.15.1b.fixed/compat.gperf
> --- libid3tag-0.15.1b/compat.gperf	2004-01-23 10:41:32.000000000 +0100
> +++ libid3tag-0.15.1b.fixed/compat.gperf	2007-01-13 18:33:20.000000000 +0100
> @@ -236,6 +236,8 @@ int id3_compat_fixup(struct id3_tag *tag
>  
>      encoding = id3_parse_uint(&data, 1);
>      string   = id3_parse_string(&data, end - data, encoding, 0);
> +    if (string == NULL)
> +      goto fail;
>  
>      if (id3_ucs4_length(string) < 4) {
>        free(string);

This part looks good.

> diff -urip libid3tag-0.15.1b/parse.c libid3tag-0.15.1b.fixed/parse.c
> --- libid3tag-0.15.1b/parse.c	2004-01-23 10:41:32.000000000 +0100
> +++ libid3tag-0.15.1b.fixed/parse.c	2007-01-13 18:35:42.000000000 +0100
> @@ -165,6 +165,9 @@ id3_ucs4_t *id3_parse_string(id3_byte_t 
>    case ID3_FIELD_TEXTENCODING_UTF_8:
>      ucs4 = id3_utf8_deserialize(ptr, length);
>      break;
> +  default:
> +    /* FIXME: Unknown encoding! Print warning? */
> +    return NULL;
>    }
>  
>    if (ucs4 && !full) {

This return NULL is useless, since it will already do that.


Kurt





More information about the pkg-mad-maintainers mailing list