diff options
author | Albert Cheng <acheng@hdfgroup.org> | 2015-03-30 05:28:13 (GMT) |
---|---|---|
committer | Albert Cheng <acheng@hdfgroup.org> | 2015-03-30 05:28:13 (GMT) |
commit | 56fe37c8e67b9a3331564f35f5ebe008b6fb8a0d (patch) | |
tree | b1e0831879ffd166df40d698f5641268efc44d84 | |
parent | f617eeb78fbc2df5baacc9b0af9a08920a3538d8 (diff) | |
download | hdf5-56fe37c8e67b9a3331564f35f5ebe008b6fb8a0d.zip hdf5-56fe37c8e67b9a3331564f35f5ebe008b6fb8a0d.tar.gz hdf5-56fe37c8e67b9a3331564f35f5ebe008b6fb8a0d.tar.bz2 |
[svn-r26646] Bug fix: HDFFV-8957 h52gif crashes when run against one of our own examples.
Description: h52gif crashed when it was asked to convert a 24bitimage.
Upon viewing the code, it did not prepare to handle images other than 2 dimensions.
It has no concept of multiple planes images. Further examinations showed past attempts
to fix it ended up removed some abilities (-p or multiple planes, animation, ...) have
been removed but documentation was not updated. Even its online help message still
shows -p is an option.
Solution: added protection code to flag errors if input request is not an
8bit image within size limits. (I don't have enough knowledge of the GIF
format to fix this tool. All I did was plugging known bug from crashing the
program.)
Tested: h5committest.
-rw-r--r-- | MANIFEST | 2 | ||||
-rw-r--r-- | hl/tools/gif2h5/h52giftest.sh.in | 75 | ||||
-rw-r--r-- | hl/tools/gif2h5/hdf2gif.c | 13 | ||||
-rw-r--r-- | hl/tools/gif2h5/testfiles/REAMDE | 6 | ||||
-rw-r--r-- | hl/tools/gif2h5/testfiles/ex_image2.h5 | bin | 0 -> 224533 bytes |
5 files changed, 71 insertions, 25 deletions
@@ -2333,6 +2333,8 @@ ./hl/tools/gif2h5/writehdf.c ./hl/tools/gif2h5/h52gifgentst.c ./hl/tools/gif2h5/h52giftest.sh.in +./hl/tools/gif2h5/testfiles/REAMDE +./hl/tools/gif2h5/testfiles/ex_image2.h5 ./hl/tools/gif2h5/testfiles/image1.gif ./hl/tools/gif2h5/testfiles/h52giftst.h5 diff --git a/hl/tools/gif2h5/h52giftest.sh.in b/hl/tools/gif2h5/h52giftest.sh.in index 186b369..7aec219 100644 --- a/hl/tools/gif2h5/h52giftest.sh.in +++ b/hl/tools/gif2h5/h52giftest.sh.in @@ -18,6 +18,7 @@ TESTFILE1="$srcdir/testfiles/h52giftst.h5" TESTFILE2="$srcdir/testfiles/image1.gif" +TESTFILE3="$srcdir/testfiles/ex_image2.h5" # initialize errors variable errors=0 @@ -29,45 +30,69 @@ TESTING() { -TOOLTEST1() +# Verify the test runs with success (return code is 0) +TOOLTEST() { - $RUNSERIAL ./h52gif $* - - RET=$? - if [ $RET != 0 ] ; then - echo "*FAILED*" - errors="` expr $errors + 1 `"; - else - echo " PASSED" - fi + # for now, discard any error messages generated. + $RUNSERIAL $* > /dev/null 2>&1 + + RET=$? + if [ $RET = 0 ] ; then + echo " PASSED" + else + echo "*FAILED*" + errors="` expr $errors + 1 `"; + fi } -TOOLTEST2() +# Verify the test runs with failure (return code is not 0) +# Use for testing if tool can handle error conditions like +# illegal input, bad arguments, exeeding limits, ... +TOOLTESTFAIL() { - $RUNSERIAL ./gif2h5 $* - - RET=$? - if [ $RET != 0 ] ; then - echo "*FAILED*" - errors="` expr $errors + 1 `"; - else - echo " PASSED" - fi + # for now, discard any error messages generated. + $RUNSERIAL $* > /dev/null 2>&1 + + RET=$? + if [ $RET != 0 ] ; then + echo " PASSED" + else + echo "*FAILED*" + errors="` expr $errors + 1 `"; + fi } +# Positive tests for gif2h5 +echo "**validate the gif2h5 tool processes input correctly..." +TESTING "./gif2h5 image1.gif image1.h5" +TOOLTEST ./gif2h5 $TESTFILE2 image1.h5 +echo "" +# Positive tests for h52gif +echo "**validate the h52gif tool processes input correctly..." TESTING "./h52gif h52giftst.h5 image1.gif -i image" -TOOLTEST1 $TESTFILE1 image1.gif -i image -TESTING "./gif2h5 image1.gif image1.h5" -TOOLTEST2 $TESTFILE2 image1.h5 +TOOLTEST ./h52gif $TESTFILE1 image1.gif -i image +echo "" +# Negative tests. +echo "**verify the the h52gif tool handle error conditions correctly..." +# nonexisting dataset name +TESTING "./h52gif h52giftst.h5 image.gif -i nosuch_image" +TOOLTESTFAIL "./h52gif $TESTFILE1 image.gif -i nosuch_image" +# this test should have failed but it did not. Comment it out for now. +#TESTING "./h52gif h52giftst.h5 image.gif -i palette" +#TOOLTESTFAIL "./h52gif $TESTFILE1 image.gif -i palette" +TESTING "./h52gif h52giftst.h5 image24.gif -i image24bitpixel" +TOOLTESTFAIL "./h52gif $TESTFILE3 image24.gif -i image24bitpixel" +echo "" +# all done. summarize results. if test $errors -eq 0 ; then - echo "All h52gif tests passed." + echo "All gif2h5 and h52gif tests passed." exit 0 else - echo "h52gif tests failed with $errors errors." + echo "Some gif2h5 or h52gif tests failed with $errors errors." exit 1 fi diff --git a/hl/tools/gif2h5/hdf2gif.c b/hl/tools/gif2h5/hdf2gif.c index fe79975..5c342ba 100644 --- a/hl/tools/gif2h5/hdf2gif.c +++ b/hl/tools/gif2h5/hdf2gif.c @@ -20,6 +20,8 @@ #include "h5tools.h" #include "h5tools_utils.h" +#define IMAGE_WIDTH_MAX 65535 /* unsigned 16bits integer */ +#define IMAGE_HEIGHT_MAX 65535 /* unsigned 16bits integer */ int EndianOrder; @@ -147,6 +149,17 @@ int main(int argc , char **argv) if ( H5IMget_image_info( fid, image_name, &width, &height, &planes, interlace, &npals ) < 0 ) goto out; + if (width > IMAGE_WIDTH_MAX || height > IMAGE_HEIGHT_MAX){ + fprintf(stderr, "HDF5 image is too large. Limit is %d by %d.\n", IMAGE_WIDTH_MAX, IMAGE_HEIGHT_MAX); + goto out; + } + + /* tool can handle single plane images only. */ + if (planes > 1){ + fprintf(stderr, "Cannot handle multiple planes image\n"); + goto out; + } + Image = (BYTE*) malloc( (size_t) width * (size_t) height ); if ( H5IMread_image( fid, image_name, Image ) < 0 ) diff --git a/hl/tools/gif2h5/testfiles/REAMDE b/hl/tools/gif2h5/testfiles/REAMDE new file mode 100644 index 0000000..a428d47 --- /dev/null +++ b/hl/tools/gif2h5/testfiles/REAMDE @@ -0,0 +1,6 @@ +ex_image2.h5 + Generated by hl/examples/ex_image2.c +5giftst.h5: + Generated by ../h52gifgentst.c +image1.gif: + To be determined. diff --git a/hl/tools/gif2h5/testfiles/ex_image2.h5 b/hl/tools/gif2h5/testfiles/ex_image2.h5 Binary files differnew file mode 100644 index 0000000..a36df1b --- /dev/null +++ b/hl/tools/gif2h5/testfiles/ex_image2.h5 |