X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=wma_common.c;h=5ea92c73948f70a66ff80aa830adba857f582a4f;hp=cab89d3e7c8589dec7dc6ef71f709142be138e55;hb=03900fe178fa1dc6b371424c8a96f91be52877e2;hpb=f481eaddec671c3783cc098d65be29ea16ee81b1 diff --git a/wma_common.c b/wma_common.c index cab89d3e..5ea92c73 100644 --- a/wma_common.c +++ b/wma_common.c @@ -56,23 +56,27 @@ static int read_header_len(char *buf, int len) { uint16_t header_len; + if (len < 18) + return 0; header_len = read_u16(buf + 16) + 46; - if (header_len > len) - return -E_WMA_BAD_ASF_HEADER; PARA_DEBUG_LOG("header_len: %d\n", header_len); return header_len; } +/** + * \return Negative on errors, zero if more data is needed in order to read the + * full header. Positive header length on success. + */ int read_asf_header(char *buf, int loaded, struct asf_header_info *ahi) { int ret; char *start; - ret = read_header_len(buf, loaded); - if (ret < 0) - return ret; - ahi->header_len = ret; - + ahi->header_len = read_header_len(buf, loaded); + if (ahi->header_len == 0) /* too short to read header len */ + return 0; + if (ahi->header_len > loaded) /* too short to read header */ + return 0; ret = find_audio_stream_info(buf, ahi->header_len); if (ret < 0) return ret; @@ -94,7 +98,7 @@ int read_asf_header(char *buf, int loaded, struct asf_header_info *ahi) ahi->flags2 = read_u16(start + 60); PARA_INFO_LOG("read_asf_header: flags1: %d, flag2: %d\n", ahi->flags1, ahi->flags2); - return 42; + return 1; } const uint8_t log2_tab[256] = {