libid3tag是MPEG音频解码器MAD中所捆绑的ID3标签操控库。 libid3tag库在解析ID3_FIELD_TYPE_STRINGLIST字段时如果所要解析的数据以\0结尾的话,**ptr == 0,但end - *ptr条件为1,所以循环会无限继续。 以下是有漏洞的代码段: *** field.c 2003-04-19 09:14:33.000000000 +0900 --- field-patched.c 2008-01-13 16:08:22.000000000 +0900 *************** *** 291,297 **** end = *ptr + length; ! while (end - *ptr > 0) { ucs4 = id3_parse_string(ptr, end - *ptr, *encoding, 0); if (ucs4 == 0) goto fail; --- 291,297 ---- end = *ptr + length; ! while (end - *ptr > 0 && **ptr != \'\'\0\'\') { ucs4 = id3_parse_string(ptr, end - *ptr, *encoding, 0); if (ucs4 == 0) goto fail;
libid3tag是MPEG音频解码器MAD中所捆绑的ID3标签操控库。 libid3tag库在解析ID3_FIELD_TYPE_STRINGLIST字段时如果所要解析的数据以\0结尾的话,**ptr == 0,但end - *ptr条件为1,所以循环会无限继续。 以下是有漏洞的代码段: *** field.c 2003-04-19 09:14:33.000000000 +0900 --- field-patched.c 2008-01-13 16:08:22.000000000 +0900 *************** *** 291,297 **** end = *ptr + length; ! while (end - *ptr > 0) { ucs4 = id3_parse_string(ptr, end - *ptr, *encoding, 0); if (ucs4 == 0) goto fail; --- 291,297 ---- end = *ptr + length; ! while (end - *ptr > 0 && **ptr != \'\'\0\'\') { ucs4 = id3_parse_string(ptr, end - *ptr, *encoding, 0); if (ucs4 == 0) goto fail;