[svn-r21658] Purpose:

HDFFV-7770 - h5diff segmentation fault on JPSS files

Description:
    Fixed segfault over non-comparable attribute with different dimention or
    rank, along with '-c' option to display details.

Tested:
 jam (linux32-LE), koala (linux64-LE), heiwa (linuxppc64-BE), tejeda (mac32-LE), linew (solaris-BE), Windows, Cmake
This commit is contained in:
Jonathan Kim 2011-10-24 16:50:13 -05:00
parent 1dcc75407e
commit e54d15a26c
10 changed files with 95 additions and 46 deletions

View File

@ -624,24 +624,27 @@ Bug Fixes since HDF5-1.8.0 release
Tools
-----
- Fixed h5diff to display all the comparable object and attribute
regardless of non-comparables. HDFFV-7693 (JKM 09/16/2011)
- Fixed h5repack to update values of references(object and region) of
attributes in h5repack for 1) references, 2) ARRAY of references,
3) VLEN of references, and 4) COMPOUND of references.
(JIRA HDF5 5932) PC -2011/09/14
- h5diff: fixed segfault over non-comparable attribute with different
dimention or rank, along with '-c' option to display details.
HDFFV-7770 (JKM 2011/10/24)
- Fixed h5diff to display all the comparable object and attribute
regardless of non-comparables. HDFFV-7693 (JKM 2011/09/16)
- Fixed h5repack to update values of references(object and region) of
attributes in h5repack for 1) references, 2) ARRAY of references,
3) VLEN of references, and 4) COMPOUND of references.
(JIRA HDF5 5932) PC -2011/09/14
- h5diff: fixed segfault over dataset with container types
(array,lven) with multiple nested compound types.
(ex: compound->array->compound, compound->vlen->compound)
HDFFV-7712 JKM (09/01/2011)
HDFFV-7712 JKM (2011/09/01)
- h5repack: added macro to handle failure in H5Dread/write when memory
allocation failed inside the library. (PC -- 2011/08/19)
- Fixed h5jam not to allow specifying an HDF5 formatted file as input
file for -u (user block file) option, because the original HDF5 file
will not be accessible if allows. HDFFV-5941 (JKM 08/15/2011)
will not be accessible if allows. HDFFV-5941 (JKM 2011/08/15)
- Revised command help pages of h5jam and h5unjam. The descriptions
were not up to date and some were missing.
HDFFV-7515 (JKM 08/15/2011)
HDFFV-7515 (JKM 2011/08/15)
- h5repack: h5repack failed to copy dataset if the layout is changed
from chunked with unlimited dims to contiguous. HDFFV-7649
(PC -- 2011/07/15)
@ -650,29 +653,29 @@ Bug Fixes since HDF5-1.8.0 release
Manual. HDFFV-7656 (PC -- 2011/07/15)
- Fixed h5diff to display instructive error message and exit with 1
when mutually exclusive options (-d, -p and --use-system-epsilon)
are used together. HDFFV-7600 (JKM 07/07/2011)
are used together. HDFFV-7600 (JKM 2011/07/07)
- Fixed h5dump to display the first line of each element into correct
position for multiple dimention array type.
Before this fix, the first line of each element in array were
displayed after the last line of previous element without
moving to the next line (+indentation).
Bug #HDFFV-5878 (JKM 06/15/2011)
Bug #HDFFV-5878 (JKM 2011/06/15)
- Fixed h5dump to display correct value for H5T_STD_I8LE dataset
on a system (ppc64, linux, Big-Endian, clustering).
Bug #HDFFV-7594 (ABERT & JKM 05/12/2011)
Bug #HDFFV-7594 (ABERT & JKM 2011/05/12)
- Fixed h5diff to compare file itself correctly. Previously h5diff
reported either different or not compatible in certain cases even
comparing file itself. This fix also improve performance when
comparing same target objects through verifying the obj&file
addresses before comparing the details in the objects (ex: datasets
or attributes) Bug #HDFFV-5928 (XCAO & JKM 05/06/2011)
or attributes) Bug #HDFFV-5928 (XCAO & JKM 2011/05/06)
- Updated h5dump test case script to prevent entire test failure upon
source directory is read-only. Bug# HDFFV-4342 (JKM 2011/4/12)
- Fixed h5dump displaying incorrect values for H5T_STD_I8BE type data in
attribute on Big-Endian machine. H5T_STD_I8BE is unsigned 8bit type,
so h5dump is supposed to display -2 instead of 254. It worked
correctly on Little-Endian system , but not on Big-Endian system.
Bug #HDFFV-4358 (JKM 04/08/2011)
Bug #HDFFV-4358 (JKM 2011/04/08)
- Updated to unify option name to '--enable-error-stack' for printing
HDF5 error stack messages for HDF5 tools. h5ls and h5dump for now.
For h5ls, this replaces "-e/--errors" option, which is deprecated.

View File

@ -1131,6 +1131,7 @@ ADD_H5_TEST (h5diff_208 0 -c ${FILE19} ${FILE20})
ADD_H5_TEST (h5diff_220 1 -c non_comparables1.h5 non_comparables2.h5 /g1)
# comparable dataset with non-comparable attribute and other comparable attributes.
# Also test non-compatible attributes with different type, dimention, rank.
# All the rest comparables should display differences.
ADD_H5_TEST (h5diff_221 1 -c non_comparables1.h5 non_comparables2.h5 /g2)

View File

@ -4701,9 +4701,14 @@ static void test_non_comparables (const char * fname, int make_diffs)
hid_t sid1=0;
hid_t tid_dset1=0;
hid_t tid_attr1=0;
hsize_t dims1[1] = {DIM_ARRY};
hsize_t dims1_1[1] = {DIM_ARRY};
hsize_t dims1_2[1] = {DIM_ARRY+1};
hsize_t dims2[2] = {DIM_ARRY, 1};
int data1[DIM_ARRY] = {0,0,0};
int data2[DIM_ARRY] = {1,1,1};
int data3[DIM_ARRY+1] = {1,1,1,1};
int data1_dim2[DIM_ARRY][1] = {0,0,0};
int rank_attr;
char data1_str[DIM_ARRY][STR_SIZE]= {"ab","cd","ef"};
herr_t status = SUCCEED;
int i;
@ -4713,6 +4718,9 @@ static void test_non_comparables (const char * fname, int make_diffs)
void *attr_data_ptr1=NULL;
void *attr_data_ptr2=NULL;
void *attr_data_ptr3=NULL;
void *attr_data_ptr4=NULL;
void *attr2_dim_ptr=NULL;
void *attr3_dim_ptr=NULL;
/* init */
tid_dset1=H5Tcopy(H5T_NATIVE_INT);
@ -4722,6 +4730,10 @@ static void test_non_comparables (const char * fname, int make_diffs)
tid_attr1=H5Tcopy(H5T_NATIVE_INT);
attr_data_ptr1=(int*)&data1;
attr_data_ptr3=(int*)&data1;
attr_data_ptr4=(int*)&data1;
attr2_dim_ptr=(hsize_t*)&dims1_1;
attr3_dim_ptr=(hsize_t*)&dims1_1;
rank_attr=1;
if (make_diffs)
{
@ -4737,12 +4749,22 @@ static void test_non_comparables (const char * fname, int make_diffs)
* group2
*/
dset_data_ptr3=(int*)&data2;
/* attr1 */
/* dset1/attr1 */
tid_attr1=H5Tcopy(H5T_C_S1);
H5Tset_size(tid_attr1, (size_t)STR_SIZE);
attr_data_ptr2=(char*)&data1_str;
/* attr2 */
attr_data_ptr3=(int*)&data2;
/* dset1/attr2 */
attr2_dim_ptr=(hsize_t*)&dims1_2;
/* dset1/attr3 */
attr_data_ptr3=(int*)&data1_dim2;
attr3_dim_ptr=(hsize_t*)&dims2;
rank_attr=2;
/* dset1/attr4 */
attr_data_ptr4=(int*)&data2;
}
@ -4779,7 +4801,7 @@ static void test_non_comparables (const char * fname, int make_diffs)
/*-----------------------------------------------------------------------
* Datasets in /g1
*------------------------------------------------------------------------*/
if((sid1 = H5Screate_simple(1, dims1, NULL)) < 0)
if((sid1 = H5Screate_simple(1, dims1_1, NULL)) < 0)
goto out;
/* dset1 */
@ -4796,10 +4818,10 @@ static void test_non_comparables (const char * fname, int make_diffs)
status = FAIL;
goto out;
}
write_attr(did1,1,dims1,"attr", H5T_NATIVE_INT, attr_data_ptr1);
write_attr(did1,1,dims1_1,"attr", H5T_NATIVE_INT, attr_data_ptr1);
/* dset2 */
status = write_dset(gid1, 1, dims1,"dset2", H5T_NATIVE_INT, dset_data_ptr2);
status = write_dset(gid1, 1, dims1_1,"dset2", H5T_NATIVE_INT, dset_data_ptr2);
if (status == FAIL)
{
fprintf(stderr, "Error: %s> write_dset failed\n", fname);
@ -4809,7 +4831,8 @@ static void test_non_comparables (const char * fname, int make_diffs)
/*-----------------------------------------------------------------------
* Datasets in /g2
*------------------------------------------------------------------------*/
/* dset1 */
/* ---------
* dset1 */
if((did2 = H5Dcreate2(gid2, "dset1", H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
{
fprintf(stderr, "Error: %s> H5Dcreate2 failed.\n", "dset1");
@ -4823,14 +4846,22 @@ static void test_non_comparables (const char * fname, int make_diffs)
status = FAIL;
goto out;
}
/* attr1 */
write_attr(did2,1,dims1,"attr1", tid_attr1, attr_data_ptr2);
/* attr1 - non-compatible : different type */
write_attr(did2,1,dims1_1,"attr1", tid_attr1, attr_data_ptr2);
/* attr2 */
write_attr(did2,1,dims1,"attr2", H5T_NATIVE_INT, attr_data_ptr3);
/* dset2 */
status = write_dset(gid2, 1, dims1,"dset2", H5T_NATIVE_INT, dset_data_ptr3);
/* attr2 - non-compatible : same rank, different dimention */
write_attr(did2,1, attr2_dim_ptr,"attr2", H5T_NATIVE_INT, data3);
/* attr3 - non-compatible : different rank */
write_attr(did2, rank_attr,attr3_dim_ptr,"attr3", H5T_NATIVE_INT, attr_data_ptr3);
/* attr4 - compatible : different data values */
write_attr(did2,1,dims1_1,"attr4", H5T_NATIVE_INT, attr_data_ptr4);
/*----------
* dset2 */
status = write_dset(gid2, 1, dims1_1,"dset2", H5T_NATIVE_INT, dset_data_ptr3);
if (status == FAIL)
{
fprintf(stderr, "Error: %s> write_dset failed\n", fname);

View File

@ -1,5 +1,9 @@
Not comparable: <attr1> is of class H5T_INTEGER and <attr1> is of class H5T_STRING
attribute: <attr2 of </g2/dset1>> and <attr2 of </g2/dset1>>
Not comparable: <attr2> has rank 1, dimensions [3], max dimensions [3]
and <attr2> has rank 1, dimensions [4], max dimensions [4]
Not comparable: <attr3> has rank 1, dimensions [3], max dimensions [3]
and <attr3> has rank 2, dimensions [3x1], max dimensions [3x1]
attribute: <attr4 of </g2/dset1>> and <attr4 of </g2/dset1>>
3 differences found
dataset: </g2/dset1> and </g2/dset1>
6 differences found

View File

@ -6,7 +6,11 @@ dataset: </g1/dset1> and </g1/dset1>
dataset: </g1/dset2> and </g1/dset2>
3 differences found
Not comparable: <attr1> is of class H5T_INTEGER and <attr1> is of class H5T_STRING
attribute: <attr2 of </g2/dset1>> and <attr2 of </g2/dset1>>
Not comparable: <attr2> has rank 1, dimensions [3], max dimensions [3]
and <attr2> has rank 1, dimensions [4], max dimensions [4]
Not comparable: <attr3> has rank 1, dimensions [3], max dimensions [3]
and <attr3> has rank 2, dimensions [3x1], max dimensions [3x1]
attribute: <attr4 of </g2/dset1>> and <attr4 of </g2/dset1>>
3 differences found
dataset: </g2/dset1> and </g2/dset1>
6 differences found

View File

@ -799,7 +799,8 @@ TOOLTEST h5diff_207.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset8 g2/dset9
# not comparable in dataspace of zero dimension size
TOOLTEST h5diff_208.txt -c h5diff_dset_zero_dim_size1.h5 h5diff_dset_zero_dim_size2.h5
# non-comparable dataset with comparable attribute, and other comparable datasets.
# non-comparable dataset with comparable attribute, and other comparable datasets.
# Also test non-compatible attributes with different type, dimention, rank.
# All the comparables should display differences.
TOOLTEST h5diff_220.txt -c non_comparables1.h5 non_comparables2.h5 /g1

View File

@ -380,8 +380,10 @@ hsize_t diff_attr(hid_t loc1_id,
*----------------------------------------------------------------------
*/
/* pass dims1 and dims2 for maxdims as well since attribute's maxdims
* are always same */
if( diff_can_type(ftype1_id, ftype2_id, rank1, rank2, dims1, dims2,
NULL, NULL, name1, name2, options, 0) != 1 )
dims1, dims2, name1, name2, options, 0) != 1 )
{
if(H5Tclose(ftype1_id) < 0)
goto error;

View File

@ -35,24 +35,27 @@ print_dimensions (int rank, hsize_t *dims)
{
int i;
if ( rank > 0 )
{
parallel_print("[" );
for ( i = 0; i < rank-1; i++)
{
parallel_print(HSIZE_T_FORMAT, dims[i]);
parallel_print("x");
}
parallel_print(HSIZE_T_FORMAT, dims[rank-1]);
parallel_print("]" );
}
else
if ( rank <= 0 )
{
parallel_print("H5S_SCALAR" );
}
else
{
if (!dims)
parallel_print("dimension is NULL");
else
{
parallel_print("[");
for ( i = 0; i < rank-1; i++)
{
parallel_print(HSIZE_T_FORMAT, dims[i]);
parallel_print("x");
}
parallel_print(HSIZE_T_FORMAT, dims[rank-1]);
parallel_print("]" );
}
}
}