X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=libavformat%2Fmms.c;h=192e7039affec8fd45e68c5e9b5594dcb8c3a36e;hb=76e25dbca6eb6ea899baa042902bd038bd2e3056;hp=d995a43a0e8b765308fbb940d993fdd7725a4b6e;hpb=0f02a7e2d25d3324e10d3e14b02b70ef9285b9bb;p=coroid%2Flibav_saccubus.git diff --git a/libavformat/mms.c b/libavformat/mms.c index d995a43a0..192e7039a 100644 --- a/libavformat/mms.c +++ b/libavformat/mms.c @@ -4,31 +4,27 @@ * Copyright (c) 2007 Björn Axelsson * Copyright (c) 2010 Zhentan Feng * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "mms.h" #include "asf.h" #include "libavutil/intreadwrite.h" -#if FF_API_MAX_STREAMS -#define MMS_MAX_STREAMS MAX_STREAMS -#else #define MMS_MAX_STREAMS 256 /**< arbitrary sanity check value */ -#endif int ff_mms_read_header(MMSContext *mms, uint8_t *buf, const int size) { @@ -115,6 +111,34 @@ int ff_mms_asf_header_parser(MMSContext *mms) "Corrupt stream (too many A/V streams)\n"); return AVERROR_INVALIDDATA; } + } else if (!memcmp(p, ff_asf_ext_stream_header, sizeof(ff_asf_guid))) { + if (end - p >= 88) { + int stream_count = AV_RL16(p + 84), ext_len_count = AV_RL16(p + 86); + uint64_t skip_bytes = 88; + while (stream_count--) { + if (end - p < skip_bytes + 4) { + av_log(NULL, AV_LOG_ERROR, + "Corrupt stream (next stream name length is not in the buffer)\n"); + return AVERROR_INVALIDDATA; + } + skip_bytes += 4 + AV_RL16(p + skip_bytes + 2); + } + while (ext_len_count--) { + if (end - p < skip_bytes + 22) { + av_log(NULL, AV_LOG_ERROR, + "Corrupt stream (next extension system info length is not in the buffer)\n"); + return AVERROR_INVALIDDATA; + } + skip_bytes += 22 + AV_RL32(p + skip_bytes + 18); + } + if (end - p < skip_bytes) { + av_log(NULL, AV_LOG_ERROR, + "Corrupt stream (the last extension system info length is invalid)\n"); + return AVERROR_INVALIDDATA; + } + if (chunksize - skip_bytes > 24) + chunksize = skip_bytes; + } } else if (!memcmp(p, ff_asf_head1_guid, sizeof(ff_asf_guid))) { chunksize = 46; // see references [2] section 3.4. This should be set 46. }