CVSROOT: /sources/gnash Module name: gnash Branch: release_0_8_1 Changes by: Sandro Santilli <strk> 07/08/18 05:05:17
Modified files: . : ChangeLog libbase : jpeg.cpp server/swf : tag_loaders.cpp Log message: * libbase/jpeg.cpp (jpeg_error_exit): only print SWF errors if configured to do so; (input_impl): throw an exception if jpeg_read_header detected errors. * server/swf/tag_loaders.cpp (jpeg_tables_loader, define_bits_jpeg_loader): early exception checking to avoid parser interruption on malformed embedded jpeg. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&only_with_tag=release_0_8_1&r1=1.3971.2.25&r2=1.3971.2.26 http://cvs.savannah.gnu.org/viewcvs/gnash/libbase/jpeg.cpp?cvsroot=gnash&only_with_tag=release_0_8_1&r1=1.17&r2=1.17.2.1 http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/tag_loaders.cpp?cvsroot=gnash&only_with_tag=release_0_8_1&r1=1.123.2.4&r2=1.123.2.5 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.3971.2.25 retrieving revision 1.3971.2.26 diff -u -b -r1.3971.2.25 -r1.3971.2.26 --- ChangeLog 18 Aug 2007 03:02:29 -0000 1.3971.2.25 +++ ChangeLog 18 Aug 2007 05:05:16 -0000 1.3971.2.26 @@ -1,3 +1,12 @@ +2007-08-18 Sandro Santilli <[EMAIL PROTECTED]> + + * libbase/jpeg.cpp (jpeg_error_exit): only print SWF errors if + configured to do so; (input_impl): throw an exception if + jpeg_read_header detected errors. + * server/swf/tag_loaders.cpp (jpeg_tables_loader, + define_bits_jpeg_loader): early exception checking to avoid + parser interruption on malformed embedded jpeg. + 2007-08-18 Nick Warne <[EMAIL PROTECTED]> * plugin/klash/klash_part.cpp: use the -u switch when invoking Index: libbase/jpeg.cpp =================================================================== RCS file: /sources/gnash/gnash/libbase/jpeg.cpp,v retrieving revision 1.17 retrieving revision 1.17.2.1 diff -u -b -r1.17 -r1.17.2.1 --- libbase/jpeg.cpp 7 Aug 2007 20:53:09 -0000 1.17 +++ libbase/jpeg.cpp 18 Aug 2007 05:05:17 -0000 1.17.2.1 @@ -349,7 +349,28 @@ setup_rw_source(&m_cinfo, in); // Read the encoding tables. - jpeg_read_header(&m_cinfo, FALSE); + int ret = jpeg_read_header(&m_cinfo, FALSE); + switch (ret) + { + case JPEG_SUSPENDED: // suspended due to lack of data + throw gnash::ParserException("lack of data during JPEG header parsing"); + //log_debug("jpeg_read_header returned JPEG_SUSPENDED"); + break; + case JPEG_HEADER_OK: // Found valid image datastream + //gnash::log_debug("unexpected: jpeg_read_header returned JPEG_HEADER_OK [%s:%d]", __FILE__, __LINE__); + break; + case JPEG_HEADER_TABLES_ONLY: // Found valid table-specs-only datastream + //log_debug("jpeg_read_header returned JPEG_HEADER_TABLES_ONLY"); + break; + default: + gnash::log_debug("unexpected: jpeg_read_header returned %d [%s:%d]", ret, __FILE__, __LINE__); + break; + } + + if ( errorOccurred ) + { + throw gnash::ParserException("errors during JPEG header parsing"); + } // Don't start reading any image data! // App does that manually using start_image. @@ -409,10 +430,10 @@ //log_debug("jpeg_read_header returned JPEG_HEADER_OK"); break; case JPEG_HEADER_TABLES_ONLY: // Found valid table-specs-only datastream - //log_debug("jpeg_read_header returned JPEG_HEADER_TABLES_ONLY"); + //gnash::log_debug("unexpected: jpeg_read_header returned JPEG_HEADER_TABLES_ONLY [%s:%d]", __FILE__, __LINE__); break; default: - //log_debug("jpeg_read_header returned %d", ret); + gnash::log_debug("unexpected: jpeg_read_header returned %d [%s:%d]", ret, __FILE__, __LINE__); break; } } @@ -495,7 +516,9 @@ static void jpeg_error_exit(j_common_ptr cinfo) { + IF_VERBOSE_MALFORMED_SWF( gnash::log_swferror("Internal jpeg error: %s", cinfo->err->jpeg_message_table[cinfo->err->msg_code]); + ); // Set a flag to stop parsing input_impl* impl = static_cast<input_impl*>(cinfo->client_data); Index: server/swf/tag_loaders.cpp =================================================================== RCS file: /sources/gnash/gnash/server/swf/tag_loaders.cpp,v retrieving revision 1.123.2.4 retrieving revision 1.123.2.5 diff -u -b -r1.123.2.4 -r1.123.2.5 --- server/swf/tag_loaders.cpp 10 Aug 2007 03:54:11 -0000 1.123.2.4 +++ server/swf/tag_loaders.cpp 18 Aug 2007 05:05:17 -0000 1.123.2.5 @@ -17,7 +17,7 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // -/* $Id: tag_loaders.cpp,v 1.123.2.4 2007/08/10 03:54:11 strk Exp $ */ +/* $Id: tag_loaders.cpp,v 1.123.2.5 2007/08/18 05:05:17 strk Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -476,6 +476,7 @@ void jpeg_tables_loader(stream* in, tag_type tag, movie_definition* m) { + //GNASH_REPORT_FUNCTION; assert(tag == SWF::JPEGTABLES); IF_VERBOSE_PARSE @@ -483,9 +484,21 @@ log_parse(_(" jpeg_tables_loader")); ); - std::auto_ptr<jpeg::input> j_in(jpeg::input::create_swf_jpeg2_header_only(in->get_underlying_stream())); - assert(j_in.get()); + std::auto_ptr<jpeg::input> j_in; + try + { + j_in.reset(jpeg::input::create_swf_jpeg2_header_only(in->get_underlying_stream())); + } + catch (std::exception& e) + { + IF_VERBOSE_MALFORMED_SWF( + log_swferror("Error creating header-only jpeg2 input: %s", e.what()); + ); + return; + } + + log_debug("Setting jpeg loader to %p", j_in.get()); m->set_jpeg_loader(j_in); } @@ -504,18 +517,33 @@ // Read the image data. // - if (m->get_create_bitmaps() == DO_LOAD_BITMAPS) - { - //bitmap_info* bi = NULL; + if (m->get_create_bitmaps() != DO_LOAD_BITMAPS) return; + jpeg::input* j_in = m->get_jpeg_loader(); + if ( ! j_in ) + { + IF_VERBOSE_MALFORMED_SWF( + log_swferror(_("DEFINEBITS: No jpeg loader registered in movie definition - discarding bitmap character %d"), character_id); + ); + return; + } + assert(j_in); j_in->discard_partial_buffer(); - std::auto_ptr<image::rgb> im ( image::read_swf_jpeg2_with_tables(j_in) ); - //bi = render::create_bitmap_info_rgb(im); - //delete im; + std::auto_ptr<image::rgb> im; + try + { + im.reset ( image::read_swf_jpeg2_with_tables(j_in) ); + } + catch (std::exception& e) + { + IF_VERBOSE_MALFORMED_SWF( + log_swferror("Error reading jpeg2 with headers for character id %d: %s", character_id, e.what()); + ); + return; + } - //assert(im->get_ref_count() == 0); bitmap_character_def* ch = new bitmap_character_def(im); @@ -529,7 +557,6 @@ { m->add_bitmap_character_def(character_id, ch); } - } } _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit