Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(fix) Segmentation fault when using a compound type. #143

Merged
merged 5 commits into from
Dec 2, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions MANIFEST
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,7 @@
./test/cache_tagging.c
./test/chunk_info.c
./test/cmpd_dset.c
./test/cmpd_dtransform.c
./test/cork.c
./test/corrupt_stab_msg.h5
./test/cross_read.c
Expand Down
25 changes: 14 additions & 11 deletions src/H5T.c
Original file line number Diff line number Diff line change
Expand Up @@ -3405,8 +3405,8 @@ H5T__create(H5T_class_t type, size_t size)
* Note: Common code for both H5T_copy and H5T_copy_reopen, as part of
* the const-correct datatype copying routines.
*
* Programmer: David Young
* January 18, 2020
* Programmer: David Young
* January 18, 2020
*
*-------------------------------------------------------------------------
*/
Expand Down Expand Up @@ -3453,8 +3453,8 @@ H5T__initiate_copy(const H5T_t *old_dt)
* Return: Success: Pointer to a new copy of the OLD_DT argument.
* Failure: NULL
*
* Programmer: David Young
* January 18, 2020
* Programmer: David Young
* January 18, 2020
*
*-------------------------------------------------------------------------
*/
Expand All @@ -3481,8 +3481,8 @@ H5T__copy_transient(H5T_t *old_dt)
* Return: Success: Pointer to a new copy of the OLD_DT argument.
* Failure: NULL
*
* Programmer: David Young
* January 18, 2020
* Programmer: David Young
* January 18, 2020
*
*-------------------------------------------------------------------------
*/
Expand Down Expand Up @@ -3512,8 +3512,8 @@ H5T__copy_all(H5T_t *old_dt)
*
* Note: Common code for both H5T_copy and H5T_copy_reopen.
*
* Programmer: David Young
* January 18, 2020
* Programmer: David Young
* January 18, 2020
*
*-------------------------------------------------------------------------
*/
Expand Down Expand Up @@ -3783,8 +3783,8 @@ H5T_copy(const H5T_t *old_dt, H5T_copy_t method)
* Return: Success: Pointer to a new copy of the OLD_DT argument.
* Failure: NULL
*
* Programmer: David Young
* January 18, 2020
* Programmer: David Young
* January 18, 2020
*
*-------------------------------------------------------------------------
*/
Expand Down Expand Up @@ -5217,7 +5217,10 @@ H5T__path_find_real(const H5T_t *src, const H5T_t *dst, const char *name, H5T_co
} /* end else-if */

/* Set the flag to indicate both source and destination types are compound types
* for the optimization of data reading (in H5Dio.c). */
* for the optimization of data reading (in H5Dio.c).
* Make sure that path->are_compounds is only TRUE for compound types.
*/
path->are_compounds = FALSE;
if (H5T_COMPOUND == H5T_get_class(src, TRUE) && H5T_COMPOUND == H5T_get_class(dst, TRUE))
path->are_compounds = TRUE;

Expand Down
1 change: 1 addition & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,7 @@ set (H5_TESTS
thread_id # special link
vol
timer
cmpd_dtransform
)

macro (ADD_H5_EXE file)
Expand Down
2 changes: 1 addition & 1 deletion test/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ TEST_PROG= testhdf5 \
cache cache_api cache_image cache_tagging lheap ohdr \
stab gheap evict_on_close farray earray btree2 fheap \
pool accum hyperslab istore bittests dt_arith page_buffer \
dtypes dsets chunk_info cmpd_dset filter_fail extend direct_chunk \
dtypes dsets chunk_info cmpd_dset cmpd_dtransform filter_fail extend direct_chunk \
external efc objcopy objcopy_ref links unlink twriteorder big mtime \
fillval mount \
flush1 flush2 app_ref enum set_extent ttsafe enc_dec_plist \
Expand Down
136 changes: 136 additions & 0 deletions test/cmpd_dtransform.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the COPYING file, which can be found at the root of the source code *
* distribution tree, or in https://www.hdfgroup.org/licenses. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Copy link
Collaborator

@lrknox lrknox Dec 1, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The HDF Group copyright header has changed, and the line "* Copyright by the Board of Trustees of the University of Illinois." applies only to files created before 2007.
The text in the paragraph has changed and the link that is now for the COPYING file also needs updating in all of the HDF5 source files, which will be happening within a few days, so it isn't necessary to make changes for this pull request, especiallly since pasting it here made format changes. Once that update is done, this header will be replaced with the following:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

  • Copyright by The HDF Group. *

  • All rights reserved. *

  • This file is part of HDF5. The full HDF5 copyright notice, including *

  • terms governing use, modification, and redistribution, is contained in *

  • the COPYING file, which can be found at the root of the source code *

  • distribution tree, or in https://www.hdfgroup.org/licenses. *

  • If you do not have access to either file, you may request a copy from *

  • help@hdfgroup.org. *

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have updated the source header to the latest version.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!


/*
* Programmer: Jan-Willem Blokland
* December 1, 2020
*
* Purpose: Test writing compounded attribute followed by
* writing data with a data transform function.
*/

#include "h5test.h"

#define FILENAME "cmpd_dtransform.h5"
#define LENGTH 11

typedef struct {
char name[64];
char unit[64];
} att_t;

int
main(void)
{
hsize_t dima[] = { 1 };
hsize_t dims[] = { LENGTH };
hid_t str_dtyp_id, att_dtyp_id, file_id, fspace_id, dset_id, att_dspc_id, att_attr_id, dxpl_id;

/* Compound datatype */
att_t *atts = HDmalloc(sizeof(att_t));
HDstrcpy(atts[0].name, "Name");
HDstrcpy(atts[0].unit, "Unit");

/* String type */
if ((str_dtyp_id = H5Tcopy(H5T_C_S1)) < 0)
TEST_ERROR;
H5Tset_size(str_dtyp_id, 64);

/* Attribute type */
if ((att_dtyp_id = H5Tcreate(H5T_COMPOUND, sizeof(att_t))) < 0)
TEST_ERROR;
H5Tinsert(att_dtyp_id, "NAME", HOFFSET(att_t, name), str_dtyp_id);
H5Tinsert(att_dtyp_id, "UNIT", HOFFSET(att_t, unit), str_dtyp_id);

/* Create file. */
if ((file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;

/* Create file dataspace. */
if ((fspace_id = H5Screate_simple(1, dims, NULL)) < 0)
TEST_ERROR;

/* Create dataset. */
if ((dset_id = H5Dcreate2(file_id, "test_dset", H5T_NATIVE_INT, fspace_id,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;

/* Write the attribute (compound) to the dataset */
if ((att_dspc_id = H5Screate_simple(1, dima, NULL)) < 0)
TEST_ERROR;
if ((att_attr_id = H5Acreate2(dset_id, "ATTRIBUTES", att_dtyp_id, att_dspc_id,
H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Awrite(att_attr_id, att_dtyp_id, atts) < 0)
TEST_ERROR;

/* Create dataset transfer property list */
const char *expr = "2*x";
if ((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
TEST_ERROR;
if (H5Pset_data_transform(dxpl_id, expr) < 0) {
HDprintf("**** ERROR: H5Pset_data_transform (expression: %s) ****\n", expr);
TEST_ERROR;
}

int *data = HDmalloc(LENGTH * sizeof(int));
int *data_res = HDmalloc(LENGTH * sizeof(int));
for (unsigned i = 0; i < LENGTH; i++) {
data[i] = 10;
data_res[i] = 2 * data[i];
}

/* Write the data */
if (H5Dwrite(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, dxpl_id, data) < 0)
TEST_ERROR;

/* Read attribute */
att_t *atts_res =HDmalloc(sizeof(att_t));
if (H5Aread(att_attr_id, att_dtyp_id, atts_res) < 0)
TEST_ERROR;

/* Verify attribute */
if (HDstrcmp(atts_res[0].name, atts[0].name) != 0)
TEST_ERROR;
if (HDstrcmp(atts_res[0].unit, atts[0].unit) != 0)
TEST_ERROR;

/* Read the data */
if (H5Dread(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
TEST_ERROR;

/* Verify data */
for (unsigned idx = 0; idx < LENGTH; idx++) {
if (data[idx] != data_res[idx])
TEST_ERROR;
}

HDfree(atts);
HDfree(atts_res);
HDfree(data);
HDfree(data_res);

/* Close all identifiers. */
H5Pclose(dxpl_id);
H5Aclose(att_attr_id);
H5Sclose(att_dspc_id);
H5Dclose(dset_id);
H5Sclose(fspace_id);
H5Fclose(file_id);
H5Tclose(att_dtyp_id);
H5Tclose(str_dtyp_id);

return 0;

error:
return 1;
}