From 59836fb19f45d123e0f75b47c497b97aaa7bdfbe Mon Sep 17 00:00:00 2001 From: Albrecht Schlosser Date: Sat, 2 Oct 2021 17:01:00 +0200 Subject: [PATCH] Separate Fl_GIF_Image constructors with and w/o length arg Document clearly that reading from memory w/o the length argument (old constructor) is discouraged (deprecated). --- FL/Fl_GIF_Image.H | 5 +++- src/Fl_GIF_Image.cxx | 55 +++++++++++++++++++++++++++++++++----------- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/FL/Fl_GIF_Image.H b/FL/Fl_GIF_Image.H index 274af9a57..4871bf574 100644 --- a/FL/Fl_GIF_Image.H +++ b/FL/Fl_GIF_Image.H @@ -31,7 +31,10 @@ class FL_EXPORT Fl_GIF_Image : public Fl_Pixmap { public: Fl_GIF_Image(const char* filename); - Fl_GIF_Image(const char* imagename, const unsigned char *data, const long length = -1); + // deprecated constructor w/o length (for backwards compatibility) + Fl_GIF_Image(const char* imagename, const unsigned char *data); + // constructor with length (since 1.4.0) + Fl_GIF_Image(const char* imagename, const unsigned char *data, const size_t length); protected: diff --git a/src/Fl_GIF_Image.cxx b/src/Fl_GIF_Image.cxx index 6ae3f6ca1..b006a4340 100644 --- a/src/Fl_GIF_Image.cxx +++ b/src/Fl_GIF_Image.cxx @@ -146,16 +146,8 @@ Fl_GIF_Image::Fl_GIF_Image(const char *filename) : The destructor frees all memory and server resources that are used by the image. - The (new and optional) third parameter \p length \b should be used so buffer - overruns (i.e. truncated images) can be checked. See note below. - - If \p length is not used - - it defaults to -1 (unlimited size) - - buffer overruns will not be checked. - - \note The optional parameter \p length is available since FLTK 1.4.0. - Not using it is deprecated and old code should be modified to use it. - This parameter will likely become mandatory in a future FLTK version. + The third parameter \p length is used to test for buffer overruns, + i.e. truncated images. Use Fl_Image::fail() to check if Fl_GIF_Image failed to load. fail() returns ERR_FILE_ACCESS if the file could not be opened or read, ERR_FORMAT if the @@ -168,8 +160,10 @@ Fl_GIF_Image::Fl_GIF_Image(const char *filename) : \see Fl_GIF_Image::Fl_GIF_Image(const char *filename) \see Fl_Shared_Image + + \since 1.4.0 */ -Fl_GIF_Image::Fl_GIF_Image(const char *imagename, const unsigned char *data, const long length) : +Fl_GIF_Image::Fl_GIF_Image(const char *imagename, const unsigned char *data, const size_t length) : Fl_Pixmap((char *const*)0) { Fl_Image_Reader rdr; @@ -180,10 +174,43 @@ Fl_GIF_Image::Fl_GIF_Image(const char *imagename, const unsigned char *data, con } } +/** + This constructor loads a GIF image from memory (deprecated). + + \deprecated Please use + Fl_GIF_Image(const char *imagename, const unsigned char *data, const size_t length) + instead. + + \note Buffer overruns will not be checked. + + This constructor should not be used because the caller can't supply the + memory size and the image reader can't check for "end of memory" errors. + + \note A new constructor with parameter \p length is available since FLTK 1.4.0. + + \param[in] imagename A name given to this image or NULL + \param[in] data Pointer to the start of the GIF image in memory. + + \see Fl_GIF_Image(const char *filename) + \see Fl_GIF_Image(const char *imagename, const unsigned char *data, const size_t length) +*/ +Fl_GIF_Image::Fl_GIF_Image(const char *imagename, const unsigned char *data) : + Fl_Pixmap((char *const*)0) +{ + Fl_Image_Reader rdr; + if (rdr.open(imagename, data) == -1) { + ld(ERR_FILE_ACCESS); + } else { + load_gif_(rdr); + } +} + /* - This method reads GIF image data and creates an RGB or RGBA image. The GIF - format supports only 1 bit for alpha. To avoid code duplication, we use - an Fl_Image_Reader that reads data from either a file or from memory. + This method reads GIF image data and creates an RGB or RGBA image. The GIF + format supports only 1 bit for alpha. The final image data is stored in + a modified XPM format (Fl_GIF_Image is a subclass of Fl_Pixmap). + To avoid code duplication, we use an Fl_Image_Reader that reads data from + either a file or from memory. */ void Fl_GIF_Image::load_gif_(Fl_Image_Reader &rdr) {