Merging in latest from upstream (HDFFV/hdf5:refs/heads/develop)

* commit '593e4038b3ab474a47e468bb3478d4ae3a6820e6':
  Fix for daily test failure Fix for the compilation error from the PGI compiler.
  Modifications based on comments from pull request review (1) Remove unnecessary asserts (2) Add code to insert bad offset values to the test file in gen_bad_offset.c
  HDFFV-10188 force non-native type description
  HDFFV-10188 emu insists on printing non-native description
  Fix for HDFFV-10216 segfault in H5G_node_cmp3 with corrupt h5 file Fix H5HL_offset_into() to return error when offset exceeds heap data block size. Also fix other places that call this routine to detect error return.
  HDFFV-10188 fix typo
  HDFFV-10188 add missing copy commands
  HDFFV-10188 Add tests and files
  HDFFV-10188 enable null space test
  HDFFV-10188 add release note
  HDFFV-10188 - Check for empty string first
  HDFFV-10188 error on NULL dataspace
This commit is contained in:
Jordan Henderson 2017-08-24 14:37:13 -05:00
commit e04817b5aa
27 changed files with 878 additions and 509 deletions

View File

@ -909,6 +909,7 @@
./test/atomic_reader.c
./test/atomic_writer.c
./test/bad_compound.h5
./test/bad_offset.h5
./test/be_data.h5
./test/be_extlink1.h5
./test/be_extlink2.h5
@ -972,6 +973,7 @@
./test/fsm_aggr_persist.h5
./test/genall5.c
./test/genall5.h
./test/gen_bad_offset.c
./test/gen_bad_ohdr.c
./test/gen_bad_compound.c
./test/gen_bogus.c
@ -1714,6 +1716,9 @@
./tools/testfiles/tgrp_comments.ls
./tools/testfiles/tgrp_comments.ddl
./tools/testfiles/tgrp_comments.h5
./tools/testfiles/tgrpnullspace.h5
./tools/testfiles/tgrpnullspace.ddl
./tools/testfiles/tgrpnullspace.ls
./tools/testfiles/thlink-1.ddl
./tools/testfiles/thlink-2.ddl
./tools/testfiles/thlink-3.ddl
@ -1769,6 +1774,7 @@
./tools/testfiles/tno-subset.h5
./tools/testfiles/tno-subset.ddl
./tools/testfiles/tnullspace.h5
./tools/testfiles/tnullspace.h5.xml
./tools/testfiles/tnullspace.ddl
./tools/testfiles/tobjref.h5
./tools/testfiles/topaque.h5

View File

@ -147,6 +147,16 @@ Bug Fixes since HDF5-1.10.1 release
Tools
-----
- h5ls
h5ls generated error on stack when it encountered a H5S_NULL
dataspace.
Adding checks for H5S_NULL before calling H5Sis_simple (located
in the h5tools_dump_mem function) fixed the issue.
(ADB - 2017/08/17, HDFFV-10188)
- h5dump
h5dump segfaulted on output of XML file.

View File

@ -541,8 +541,8 @@ herr_t
H5G__ent_debug(const H5G_entry_t *ent, FILE *stream, int indent, int fwidth,
const H5HL_t *heap)
{
const char *lval = NULL;
int nested_indent, nested_fwidth;
const char *lval = NULL;
int nested_indent, nested_fwidth;
FUNC_ENTER_PACKAGE_NOERR
@ -551,14 +551,14 @@ H5G__ent_debug(const H5G_entry_t *ent, FILE *stream, int indent, int fwidth,
nested_fwidth = MAX(0, fwidth - 3);
HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
"Name offset into private heap:",
(unsigned long) (ent->name_off));
"Name offset into private heap:",
(unsigned long) (ent->name_off));
HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
"Object header address:", ent->header);
"Object header address:", ent->header);
HDfprintf(stream, "%*s%-*s ", indent, "", fwidth,
"Cache info type:");
"Cache info type:");
switch(ent->type) {
case H5G_NOTHING_CACHED:
HDfprintf(stream, "Nothing Cached\n");
@ -581,13 +581,13 @@ H5G__ent_debug(const H5G_entry_t *ent, FILE *stream, int indent, int fwidth,
HDfprintf(stream, "%*s%-*s\n", indent, "", fwidth,
"Cached information:");
HDfprintf(stream, "%*s%-*s %lu\n", nested_indent, "", nested_fwidth,
"Link value offset:",
(unsigned long)(ent->cache.slink.lval_offset));
"Link value offset:",
(unsigned long)(ent->cache.slink.lval_offset));
if(heap) {
lval = (const char *)H5HL_offset_into(heap, ent->cache.slink.lval_offset);
HDfprintf(stream, "%*s%-*s %s\n", nested_indent, "", nested_fwidth,
"Link value:",
lval);
"Link value:",
(lval == NULL) ? "" : lval);
} /* end if */
else
HDfprintf(stream, "%*s%-*s\n", nested_indent, "", nested_fwidth, "Warning: Invalid heap address given, name not displayed!");

View File

@ -224,7 +224,10 @@ herr_t
H5G__ent_to_link(H5O_link_t *lnk, const H5HL_t *heap,
const H5G_entry_t *ent, const char *name)
{
FUNC_ENTER_PACKAGE_NOERR
hbool_t dup_soft = FALSE; /* xstrdup the symbolic link name or not */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
/* check arguments */
HDassert(lnk);
@ -236,18 +239,21 @@ H5G__ent_to_link(H5O_link_t *lnk, const H5HL_t *heap,
lnk->cset = H5F_DEFAULT_CSET;
lnk->corder = 0;
lnk->corder_valid = FALSE; /* Creation order not valid for this link */
lnk->name = H5MM_xstrdup(name);
HDassert(lnk->name);
if((lnk->name = H5MM_xstrdup(name)) == NULL)
HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to duplicate link name")
/* Object is a symbolic or hard link */
if(ent->type == H5G_CACHED_SLINK) {
const char *s; /* Pointer to link value */
s = (const char *)H5HL_offset_into(heap, ent->cache.slink.lval_offset);
HDassert(s);
if((s = (const char *)H5HL_offset_into(heap, ent->cache.slink.lval_offset)) == NULL)
HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to get symbolic link name")
/* Copy the link value */
lnk->u.soft.name = H5MM_xstrdup(s);
if((lnk->u.soft.name = H5MM_xstrdup(s)) == NULL)
HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to duplicate symbolic link name")
dup_soft = TRUE;
/* Set link type */
lnk->type = H5L_TYPE_SOFT;
@ -260,7 +266,14 @@ H5G__ent_to_link(H5O_link_t *lnk, const H5HL_t *heap,
lnk->type = H5L_TYPE_HARD;
} /* end else */
FUNC_LEAVE_NOAPI(SUCCEED)
done:
if(ret_value < 0) {
if(lnk->name)
H5MM_xfree(lnk->name);
if(ent->type == H5G_CACHED_SLINK && dup_soft)
H5MM_xfree(lnk->u.soft.name);
}
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5G__ent_to_link() */

File diff suppressed because it is too large Load Diff

View File

@ -707,11 +707,12 @@ done:
static herr_t
H5G_stab_get_name_by_idx_cb(const H5G_entry_t *ent, void *_udata)
{
H5G_bt_it_gnbi_t *udata = (H5G_bt_it_gnbi_t *)_udata;
H5G_bt_it_gnbi_t *udata = (H5G_bt_it_gnbi_t *)_udata;
size_t name_off; /* Offset of name in heap */
const char *name; /* Pointer to name string in heap */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
FUNC_ENTER_NOAPI_NOINIT
/* Sanity check */
HDassert(ent);
@ -719,12 +720,15 @@ H5G_stab_get_name_by_idx_cb(const H5G_entry_t *ent, void *_udata)
/* Get name offset in heap */
name_off = ent->name_off;
name = (const char *)H5HL_offset_into(udata->heap, name_off);
HDassert(name);
udata->name = H5MM_strdup(name);
HDassert(udata->name);
FUNC_LEAVE_NOAPI(SUCCEED)
if((name = (const char *)H5HL_offset_into(udata->heap, name_off)) == NULL)
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get symbol table link name")
if((udata->name = H5MM_strdup(name)) == NULL)
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to duplicate symbol table link name")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5G_stab_get_name_by_idx_cb */
@ -941,8 +945,8 @@ H5G_stab_lookup_by_idx_cb(const H5G_entry_t *ent, void *_udata)
HDassert(udata && udata->heap);
/* Get a pointer to the link name */
name = (const char *)H5HL_offset_into(udata->heap, ent->name_off);
HDassert(name);
if((name = (const char *)H5HL_offset_into(udata->heap, ent->name_off)) == NULL)
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get symbol table link name")
/* Convert the entry to a link */
if(H5G__ent_to_link(udata->lnk, udata->heap, ent, name) < 0)

View File

@ -400,18 +400,20 @@ END_FUNC(PRIV) /* end H5HL_protect() */
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PRIV, NOERR,
void *, NULL, -,
BEGIN_FUNC(PRIV, ERR,
void *, NULL, NULL,
H5HL_offset_into(const H5HL_t *heap, size_t offset))
/* Sanity check */
HDassert(heap);
HDassert(offset < heap->dblk_size);
if(offset >= heap->dblk_size)
H5E_THROW(H5E_CANTGET, "unable to offset into local heap data block");
ret_value = heap->dblk_image + offset;
CATCH
/* No special processing on errors */
END_FUNC(PRIV) /* end H5HL_offset_into() */
/*-------------------------------------------------------------------------
* Function: H5HL_unprotect

View File

@ -67,17 +67,17 @@ const H5O_msg_class_t H5O_MSG_EFL[1] = {{
/*-------------------------------------------------------------------------
* Function: H5O_efl_decode
* Function: H5O_efl_decode
*
* Purpose: Decode an external file list message and return a pointer to
* the message (and some other data).
* the message (and some other data).
*
* Return: Success: Ptr to a new message struct.
* Return: Success: Ptr to a new message struct.
*
* Failure: NULL
* Failure: NULL
*
* Programmer: Robb Matzke
* Tuesday, November 25, 1997
* Tuesday, November 25, 1997
*
* Modification:
* Raymond Lu
@ -90,12 +90,12 @@ static void *
H5O_efl_decode(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
{
H5O_efl_t *mesg = NULL;
int version;
const char *s = NULL;
H5HL_t *heap;
size_t u; /* Local index variable */
void *ret_value = NULL; /* Return value */
H5O_efl_t *mesg = NULL;
int version;
const char *s = NULL;
H5HL_t *heap;
size_t u; /* Local index variable */
void *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT
@ -104,12 +104,12 @@ H5O_efl_decode(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
HDassert(p);
if(NULL == (mesg = (H5O_efl_t *)H5MM_calloc(sizeof(H5O_efl_t))))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
/* Version */
version = *p++;
if(version != H5O_EFL_VERSION)
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for external file list message")
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for external file list message")
/* Reserved */
p += 3;
@ -141,24 +141,26 @@ H5O_efl_decode(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
/* Decode the file list */
mesg->slot = (H5O_efl_entry_t *)H5MM_calloc(mesg->nalloc * sizeof(H5O_efl_entry_t));
if(NULL == mesg->slot)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
if(NULL == (heap = H5HL_protect(f, dxpl_id, mesg->heap_addr, H5AC__READ_ONLY_FLAG)))
HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "unable to read protect link value")
for(u = 0; u < mesg->nused; u++) {
/* Name */
H5F_DECODE_LENGTH (f, p, mesg->slot[u].name_offset);
/* Name */
H5F_DECODE_LENGTH (f, p, mesg->slot[u].name_offset);
s = (const char *)H5HL_offset_into(heap, mesg->slot[u].name_offset);
HDassert(s && *s);
mesg->slot[u].name = H5MM_xstrdup (s);
if((s = (const char *)H5HL_offset_into(heap, mesg->slot[u].name_offset)) == NULL)
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, NULL, "unable to get external file name")
if(*s == (char)NULL)
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, NULL, "invalid external file name")
mesg->slot[u].name = H5MM_xstrdup (s);
HDassert(mesg->slot[u].name);
/* File offset */
H5F_DECODE_LENGTH (f, p, mesg->slot[u].offset);
/* File offset */
H5F_DECODE_LENGTH (f, p, mesg->slot[u].offset);
/* Size */
H5F_DECODE_LENGTH (f, p, mesg->slot[u].size);
/* Size */
H5F_DECODE_LENGTH (f, p, mesg->slot[u].size);
} /* end for */
if(H5HL_unprotect(heap) < 0)

View File

@ -183,6 +183,7 @@ endforeach ()
set (HDF5_REFERENCE_TEST_FILES
aggr.h5
bad_compound.h5
bad_offset.h5
be_data.h5
be_extlink1.h5
be_extlink2.h5
@ -1336,6 +1337,7 @@ if (HDF5_BUILD_GENERATORS)
# generator executables
set (H5_GENERATORS
gen_bad_offset
gen_bad_ohdr
gen_bogus
gen_cross

View File

@ -94,7 +94,7 @@ endif
BUILD_ALL_PROGS=gen_bad_ohdr gen_bogus gen_cross gen_deflate gen_filters gen_new_array \
gen_new_fill gen_new_group gen_new_mtime gen_new_super gen_noencoder \
gen_nullspace gen_udlinks space_overflow gen_filespace gen_specmetaread \
gen_sizes_lheap gen_file_image gen_plist
gen_sizes_lheap gen_file_image gen_plist gen_bad_offset
if BUILD_ALL_CONDITIONAL
noinst_PROGRAMS=$(BUILD_ALL_PROGS)

BIN
test/bad_offset.h5 Normal file

Binary file not shown.

147
test/gen_bad_offset.c Normal file
View File

@ -0,0 +1,147 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* 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://support.hdfgroup.org/ftp/HDF5/releases. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* Purpose: Generate an HDF5 file for testing H5FFV-10216
*/
#include "h5test.h"
#define TESTFILE "bad_offset.h5"
#define GRP1 "group1"
#define GRP2 "group2"
#define DSET "dsetA"
#define SOFT1 "soft_one"
#define SOFT2 "soft_two"
/*-------------------------------------------------------------------------
* Function: main
*
* Generate an HDF5 file with groups, datasets and symbolic links.
* After the file is generated, write bad offset values to
* the heap at 3 locations in the file:
* (A) Open the file:
* fd = HDopen(TESTFILE, O_RDWR, 0663);
* (B) Position the file at:
* (1) HDlseek(fd, (HDoff_t)880, SEEK_SET);
* "/group1/group2": replace heap offset "8" by bad offset
* (2) HDlseek(fd, (HDoff_t)1512, SEEK_SET);
* "/dsetA": replace name offset into private heap "72" by bad offset
* (3) HDlseek(fd, (HDoff_t)1616, SEEK_SET);
* /soft_one: replace link value offset in the scratch pad "32" by bad offset
* (C) Write the bad offset value to the file for (1), (2) and (3):
* write(fd, &val, sizeof(val));
*
* Note: if the groups/datasets/symbolic links are changed in the file,
* the above locations need to be adjusted accordingly.
*
* Return: EXIT_SUCCESS/EXIT_FAILURE
*
*-------------------------------------------------------------------------
*/
int
main(void)
{
hid_t fid = -1, gid1 = -1, gid2 = -1; /* File and group IDs */
hid_t did = -1, sid = -1; /* Dataset and dataspace IDs */
int fd = -1; /* File descriptor */
int64_t val = 999; /* Bad offset value */
/* Create the test file */
if((fid = H5Fcreate(TESTFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
FAIL_STACK_ERROR
/* Create two groups */
if((gid1 = H5Gcreate2(fid, GRP1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
FAIL_STACK_ERROR
if((gid2 = H5Gcreate2(gid1, GRP2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
FAIL_STACK_ERROR
/* Close the groups */
if(H5Gclose(gid1) < 0)
FAIL_STACK_ERROR
if(H5Gclose(gid2) < 0)
FAIL_STACK_ERROR
/* Create soft links to the groups */
if(H5Lcreate_soft("/group1", fid, SOFT1, H5P_DEFAULT, H5P_DEFAULT) < 0)
FAIL_STACK_ERROR
if(H5Lcreate_soft("/group1/group2", fid, SOFT2, H5P_DEFAULT, H5P_DEFAULT) < 0)
FAIL_STACK_ERROR
/* Create a dataset */
if((sid = H5Screate(H5S_SCALAR)) < 0)
FAIL_STACK_ERROR
if((did = H5Dcreate2(fid, DSET, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
FAIL_STACK_ERROR
/* Close the dataset */
if(H5Dclose(did) < 0)
FAIL_STACK_ERROR
/* Close the dataspace */
if(H5Sclose(sid) < 0)
FAIL_STACK_ERROR
/* Close the file */
if(H5Fclose(fid) < 0)
FAIL_STACK_ERROR
/*
* Write bad offset values at 3 locations in the file
*/
/* Open the file */
if((fd = HDopen(TESTFILE, O_RDWR, 0663)) < 0)
FAIL_STACK_ERROR
/* Position the file for /group1/group2: replace heap offset "8" by bad offset */
if(HDlseek(fd, (HDoff_t)880, SEEK_SET) < 0)
FAIL_STACK_ERROR
/* Write the bad offset value to the file */
if(HDwrite(fd, &val, sizeof(val)) < 0)
FAIL_STACK_ERROR
/* Position the file for /dsetA: replace name offset into private heap "72" by bad offset */
if(HDlseek(fd, (HDoff_t)1512, SEEK_SET) < 0)
FAIL_STACK_ERROR
/* Write the bad offset value to the file */
if(HDwrite(fd, &val, sizeof(val)) < 0)
FAIL_STACK_ERROR
/* Position the file for /soft_one: replace link value offset in the scratch pad "32" by bad offset */
if(HDlseek(fd, (HDoff_t)1616, SEEK_SET) < 0)
FAIL_STACK_ERROR
/* Write the bad offset value to the file */
if(HDwrite(fd, &val, sizeof(val)) < 0)
FAIL_STACK_ERROR
/* Close the file */
if(HDclose(fd) < 0)
FAIL_STACK_ERROR
return EXIT_SUCCESS;
error:
H5E_BEGIN_TRY {
H5Gclose(gid1);
H5Gclose(gid2);
H5Dclose(did);
H5Sclose(sid);
H5Fclose(fid);
} H5E_END_TRY;
return EXIT_FAILURE;
} /* end main() */

View File

@ -318,6 +318,11 @@ typedef struct
#define MISC31_PROPNAME "misc31_prop"
#define MISC31_DTYPENAME "dtype"
/* Definitions for misc. test #33 */
/* Note that this test file is generated by "gen_bad_offset.c" */
/* and bad offset values are written to that file for testing */
#define MISC33_FILE "bad_offset.h5"
/****************************************************************
**
** test_misc1(): test unlinking a dataset from a group and immediately
@ -5472,6 +5477,55 @@ test_misc32(void)
} /* end test_misc32() */
/****************************************************************
**
** test_misc33(): Test for H5FFV-10216
** --verify that H5HL_offset_into() returns error if the
** input parameter "offset" exceeds heap data block size.
** --case (1), (2), (3) are scenarios that will traverse to the
** the 3 locations in the file having bad offset values to
** the heap. (See description in gen_bad_offset.c)
**
****************************************************************/
static void
test_misc33(void)
{
hid_t fid = -1; /* File ID */
const char *testfile = H5_get_srcdir_filename(MISC33_FILE); /* Corrected test file name */
H5O_info_t oinfo; /* Structure for object metadata information */
herr_t ret; /* Generic return value */
/* Output message about test being performed */
MESSAGE(5, ("Testing that bad offset into the heap returns error"));
/* Open the test file */
fid = H5Fopen(testfile, H5F_ACC_RDWR, H5P_DEFAULT);
CHECK(fid, FAIL, "H5Fopen");
/* Case (1) */
H5E_BEGIN_TRY {
ret = H5Oget_info_by_name(fid, "/soft_two", &oinfo, H5P_DEFAULT);
} H5E_END_TRY;
VERIFY(ret, FAIL, "H5Oget_info_by_name");
/* Case (2) */
H5E_BEGIN_TRY {
ret = H5Oget_info_by_name(fid, "/dsetA", &oinfo, H5P_DEFAULT);
} H5E_END_TRY;
VERIFY(ret, FAIL, "H5Oget_info_by_name");
/* Case (3) */
H5E_BEGIN_TRY {
ret = H5Oget_info_by_name(fid, "/soft_one", &oinfo, H5P_DEFAULT);
} H5E_END_TRY;
VERIFY(ret, FAIL, "H5Oget_info_by_name");
/* Close the file */
ret = H5Fclose(fid);
CHECK(fid, FAIL, "H5Fclose");
} /* end test_misc33() */
/****************************************************************
**
@ -5520,6 +5574,7 @@ test_misc(void)
test_misc30(); /* Exercise local heap loading bug where free lists were getting dropped */
test_misc31(); /* Test Reentering library through deprecated routines after H5close() */
test_misc32(); /* Test filter memory allocation functions */
test_misc33(); /* Test to verify that H5HL_offset_into() returns error if offset exceeds heap block */
} /* test_misc() */

View File

@ -164,7 +164,8 @@ haddr_t
ref_path_table_lookup(const char *thepath)
{
H5O_info_t oi;
if((HDstrlen(thepath) == 0) || (thepath == NULL))
return HADDR_UNDEF;
/* Allow lookups on the root group, even though it doesn't have any link info */
if(HDstrcmp(thepath, "/")) {
H5L_info_t li;

View File

@ -1959,28 +1959,32 @@ xml_dump_data(hid_t obj_id, int obj_data, struct subset_t H5_ATTR_UNUSED * sset,
H5Tclose(type);
space = H5Aget_space(obj_id);
ndims = H5Sget_simple_extent_dims(space, size, NULL);
for (i = 0; i < ndims; i++)
nelmts *= size[i];
buf = HDmalloc((size_t)(nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type))));
HDassert(buf);
if (H5Aread(obj_id, p_type, buf) >= 0) {
h5tools_context_t datactx;
HDmemset(&datactx, 0, sizeof(datactx));
datactx.need_prefix = TRUE;
datactx.indent_level = ctx.indent_level;
datactx.cur_column = ctx.cur_column;
status = h5tools_dump_mem(rawoutstream, outputformat, &datactx, obj_id, p_type, space, buf);
if(space == H5S_NULL || space == H5S_NO_CLASS) {
status = SUCCEED;
}
/* Reclaim any VL memory, if necessary */
if (vl_data)
H5Dvlen_reclaim(p_type, space, H5P_DEFAULT, buf);
else {
ndims = H5Sget_simple_extent_dims(space, size, NULL);
HDfree(buf);
for (i = 0; i < ndims; i++)
nelmts *= size[i];
buf = HDmalloc((size_t)(nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type))));
HDassert(buf);
if (H5Aread(obj_id, p_type, buf) >= 0) {
h5tools_context_t datactx;
HDmemset(&datactx, 0, sizeof(datactx));
datactx.need_prefix = TRUE;
datactx.indent_level = ctx.indent_level;
datactx.cur_column = ctx.cur_column;
status = h5tools_dump_mem(rawoutstream, outputformat, &datactx, obj_id, p_type, space, buf);
}
/* Reclaim any VL memory, if necessary */
if (vl_data)
H5Dvlen_reclaim(p_type, space, H5P_DEFAULT, buf);
HDfree(buf);
}
H5Tclose(p_type);
H5Sclose(space);
H5Tclose(type);

View File

@ -1617,38 +1617,40 @@ list_attr(hid_t obj, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *ain
info = &outputformat;
if(hexdump_g)
p_type = H5Tcopy(type);
else
p_type = H5Tget_native_type(type, H5T_DIR_DEFAULT);
if(space_type != H5S_NULL && space_type != H5S_NO_CLASS) {
if(hexdump_g)
p_type = H5Tcopy(type);
else
p_type = H5Tget_native_type(type, H5T_DIR_DEFAULT);
if(p_type >= 0) {
/* VL data special information */
unsigned int vl_data = 0; /* contains VL datatypes */
if(p_type >= 0) {
/* VL data special information */
unsigned int vl_data = 0; /* contains VL datatypes */
/* Check if we have VL data in the dataset's datatype */
if (h5tools_detect_vlen(p_type) == TRUE)
vl_data = TRUE;
/* Check if we have VL data in the dataset's datatype */
if (h5tools_detect_vlen(p_type) == TRUE)
vl_data = TRUE;
temp_need= nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type));
HDassert(temp_need == (hsize_t)((size_t)temp_need));
need = (size_t)temp_need;
buf = HDmalloc(need);
HDassert(buf);
if(H5Aread(attr, p_type, buf) >= 0) {
ctx.need_prefix = TRUE;
ctx.indent_level = 2;
ctx.cur_column = (size_t)curr_pos;
h5tools_dump_mem(rawoutstream, info, &ctx, attr, p_type, space, buf);
}
temp_need= nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type));
HDassert(temp_need == (hsize_t)((size_t)temp_need));
need = (size_t)temp_need;
buf = HDmalloc(need);
HDassert(buf);
if(H5Aread(attr, p_type, buf) >= 0) {
ctx.need_prefix = TRUE;
ctx.indent_level = 2;
ctx.cur_column = (size_t)curr_pos;
h5tools_dump_mem(rawoutstream, info, &ctx, attr, p_type, space, buf);
}
/* Reclaim any VL memory, if necessary */
if (vl_data)
H5Dvlen_reclaim(p_type, space, H5P_DEFAULT, buf);
/* Reclaim any VL memory, if necessary */
if (vl_data)
H5Dvlen_reclaim(p_type, space, H5P_DEFAULT, buf);
HDfree(buf);
H5Tclose(p_type);
} /* end if */
HDfree(buf);
H5Tclose(p_type);
} /* end if */
}
H5Sclose(space);
H5Tclose(type);

View File

@ -104,6 +104,7 @@
${HDF5_TOOLS_DIR}/testfiles/tgroup-1.ddl
${HDF5_TOOLS_DIR}/testfiles/tgroup-2.ddl
${HDF5_TOOLS_DIR}/testfiles/tgrp_comments.ddl
${HDF5_TOOLS_DIR}/testfiles/tgrpnullspace.ddl
${HDF5_TOOLS_DIR}/testfiles/thlink-1.ddl
${HDF5_TOOLS_DIR}/testfiles/thlink-2.ddl
${HDF5_TOOLS_DIR}/testfiles/thlink-3.ddl
@ -272,6 +273,7 @@
${HDF5_TOOLS_DIR}/testfiles/tfvalues.h5
${HDF5_TOOLS_DIR}/testfiles/tgroup.h5
${HDF5_TOOLS_DIR}/testfiles/tgrp_comments.h5
${HDF5_TOOLS_DIR}/testfiles/tgrpnullspace.h5
${HDF5_TOOLS_DIR}/testfiles/thlink.h5
${HDF5_TOOLS_DIR}/testfiles/thyperslab.h5
${HDF5_TOOLS_DIR}/testfiles/tints4dims.h5
@ -887,6 +889,8 @@
tgroup-2.out.err
tgrp_comments.out
tgrp_comments.out.err
tgrpnullspace.out
tgrpnullspace.out.err
thlink-1.out
thlink-1.out.err
thlink-2.out
@ -1394,6 +1398,7 @@
# test for displaying dataset and attribute of null space
ADD_H5_TEST (tnullspace 0 --enable-error-stack tnullspace.h5)
ADD_H5_TEST (tgrpnullspace 0 -p --enable-error-stack tgrpnullspace.h5)
# test for displaying dataset and attribute of space with 0 dimension size
ADD_H5_TEST (zerodim 0 --enable-error-stack zerodim.h5)

View File

@ -53,6 +53,7 @@
${HDF5_TOOLS_DIR}/testfiles/test35.nc
${HDF5_TOOLS_DIR}/testfiles/tnestedcomp.h5
${HDF5_TOOLS_DIR}/testfiles/tnodata.h5
${HDF5_TOOLS_DIR}/testfiles/tnullspace.h5
${HDF5_TOOLS_DIR}/testfiles/tobjref.h5
${HDF5_TOOLS_DIR}/testfiles/topaque.h5
${HDF5_TOOLS_DIR}/testfiles/torderattr.h5
@ -117,6 +118,7 @@
${HDF5_TOOLS_DIR}/testfiles/tname-sp.h5.xml
${HDF5_TOOLS_DIR}/testfiles/tnestedcomp.h5.xml
${HDF5_TOOLS_DIR}/testfiles/tnodata.h5.xml
${HDF5_TOOLS_DIR}/testfiles/tnullspace.h5.xml
${HDF5_TOOLS_DIR}/testfiles/tobjref.h5.xml
${HDF5_TOOLS_DIR}/testfiles/topaque.h5.xml
${HDF5_TOOLS_DIR}/testfiles/torderattr1.h5.xml
@ -296,6 +298,8 @@
tnodata.h5.out.err
tnoname.h5.out
tnoname.h5.out.err
tnullspace.h5.out
tnullspace.h5.out.err
tobjref.h5.out
tobjref.h5.out.err
topaque.h5.out
@ -402,9 +406,7 @@
ADD_XML_H5_TEST (tsaf.h5 0 tsaf.h5)
ADD_XML_H5_TEST (tempty.h5 0 tempty.h5)
ADD_XML_H5_TEST (tnamed_dtype_attr.h5 0 tnamed_dtype_attr.h5)
##Test dataset and attribute of null space. Commented out:
## wait until the XML schema is updated for null space.
## ADD_XML_H5_TEST (tnullspace.h5 0 tnulspace.h5)
ADD_XML_H5_TEST (tnullspace.h5 0 tnullspace.h5)
## So is dataspace with 0 dimension size.
## ADD_XML_H5_TEST (zerodim.h5 0 zerodim.h5)

View File

@ -112,6 +112,7 @@
#define FILE82 "tcompound_complex2.h5"
#define FILE83 "tvlenstr_array.h5"
#define FILE84 "tudfilter.h5"
#define FILE85 "tgrpnullspace.h5"
/*-------------------------------------------------------------------------
* prototypes
@ -286,9 +287,9 @@ typedef struct s1_t {
#define F64_DIM1 (F64_ARRAY_BUF_LEN / sizeof(int) + 1)
/* File 65 macros */
#define STRATEGY H5F_FSPACE_STRATEGY_NONE /* File space handling strategy */
#define THRESHOLD10 10 /* Free-space section threshold */
#define FSPACE_PAGE_SIZE 8192 /* File space page size */
#define STRATEGY H5F_FSPACE_STRATEGY_NONE /* File space handling strategy */
#define THRESHOLD10 10 /* Free-space section threshold */
#define FSPACE_PAGE_SIZE 8192 /* File space page size */
/* "FILE66" macros and for FILE69 */
#define F66_XDIM 8
@ -7041,8 +7042,8 @@ gent_extlinks(void)
* Function: gent_fs_strategy_threshold
*
* Purpose: Generate a file with non-default file space strategy,
* non-default free-space section threshold,
* non-default file space page size.
* non-default free-space section threshold,
* non-default file space page size.
*-------------------------------------------------------------------------
*/
static void
@ -9721,7 +9722,7 @@ static void gent_bitnopaquefields(void)
uint32_t c;
uint64_t d;
} s_t;
hid_t file, grp=-1, type=-1, space=-1, dset=-1;
size_t i;
hsize_t nelmts = F80_DIM32;
@ -10437,6 +10438,43 @@ H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts,
*-------------------------------------------------------------------------
*/
/*-------------------------------------------------------------------------
* Function: gent_null_space_group
*
* Purpose: generates dataset and attribute of null dataspace in a group
*-------------------------------------------------------------------------
*/
static void gent_null_space_group(void)
{
hid_t fid, root, group, dataset, space, attr;
int dset_buf = 10;
int point = 4;
fid = H5Fcreate(FILE85, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
root = H5Gopen2(fid, "/", H5P_DEFAULT);
group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
/* null space */
space = H5Screate(H5S_NULL);
/* dataset */
dataset = H5Dcreate2(group, "dset", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
/* nothing should be written */
H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &dset_buf);
/* attribute */
attr = H5Acreate2(group, "attr", H5T_NATIVE_UINT, space, H5P_DEFAULT, H5P_DEFAULT);
H5Awrite(attr, H5T_NATIVE_INT, &point); /* Nothing can be written */
H5Dclose(dataset);
H5Aclose(attr);
H5Gclose(group);
H5Gclose(root);
H5Sclose(space);
H5Fclose(fid);
}
int main(void)
{
gent_group();
@ -10526,6 +10564,7 @@ int main(void)
gent_bitnopaquefields();
gent_intsfourdims();
gent_null_space_group();
gent_udfilter();

View File

@ -132,6 +132,7 @@ $SRC_H5DUMP_TESTFILES/tfpformat.h5
$SRC_H5DUMP_TESTFILES/tfvalues.h5
$SRC_H5DUMP_TESTFILES/tgroup.h5
$SRC_H5DUMP_TESTFILES/tgrp_comments.h5
$SRC_H5DUMP_TESTFILES/tgrpnullspace.h5
$SRC_H5DUMP_TESTFILES/thlink.h5
$SRC_H5DUMP_TESTFILES/thyperslab.h5
$SRC_H5DUMP_TESTFILES/tintsattrs.h5
@ -260,6 +261,7 @@ $SRC_H5DUMP_TESTFILES/tfpformat.ddl
$SRC_H5DUMP_TESTFILES/tgroup-1.ddl
$SRC_H5DUMP_TESTFILES/tgroup-2.ddl
$SRC_H5DUMP_TESTFILES/tgrp_comments.ddl
$SRC_H5DUMP_TESTFILES/tgrpnullspace.ddl
$SRC_H5DUMP_TESTFILES/thlink-1.ddl
$SRC_H5DUMP_TESTFILES/thlink-2.ddl
$SRC_H5DUMP_TESTFILES/thlink-3.ddl
@ -1268,6 +1270,7 @@ TOOLTEST thyperslab.ddl --enable-error-stack thyperslab.h5
# test for displaying dataset and attribute of null space
TOOLTEST tnullspace.ddl --enable-error-stack tnullspace.h5
TOOLTEST tgrpnullspace.ddl -p --enable-error-stack tgrpnullspace.h5
# test for displaying dataset and attribute of space with 0 dimension size
TOOLTEST zerodim.ddl --enable-error-stack zerodim.h5

View File

@ -97,6 +97,7 @@ $SRC_H5DUMP_TESTFILES/tname-sp.h5
$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.h5
$SRC_H5DUMP_TESTFILES/tnestedcomp.h5
$SRC_H5DUMP_TESTFILES/tnodata.h5
$SRC_H5DUMP_TESTFILES/tnullspace.h5
$SRC_H5DUMP_TESTFILES/tobjref.h5
$SRC_H5DUMP_TESTFILES/topaque.h5
$SRC_H5DUMP_TESTFILES/torderattr.h5
@ -162,6 +163,7 @@ $SRC_H5DUMP_TESTFILES/tname-quot.h5.xml
$SRC_H5DUMP_TESTFILES/tname-sp.h5.xml
$SRC_H5DUMP_TESTFILES/tnestedcomp.h5.xml
$SRC_H5DUMP_TESTFILES/tnodata.h5.xml
$SRC_H5DUMP_TESTFILES/tnullspace.h5.xml
$SRC_H5DUMP_TESTFILES/tobjref.h5.xml
$SRC_H5DUMP_TESTFILES/topaque.h5.xml
$SRC_H5DUMP_TESTFILES/torderattr1.h5.xml
@ -355,9 +357,7 @@ TOOLTEST tvlstr.h5.xml --xml tvlstr.h5
TOOLTEST tsaf.h5.xml --xml tsaf.h5
TOOLTEST tempty.h5.xml --xml tempty.h5
TOOLTEST tnamed_dtype_attr.h5.xml --xml tnamed_dtype_attr.h5
##Test dataset and attribute of null space. Commented out:
## wait until the XML schema is updated for null space.
##TOOLTEST tnullspace.h5.xml --xml tnulspace.h5
TOOLTEST tnullspace.h5.xml --xml tnullspace.h5
# other options for xml

View File

@ -33,6 +33,7 @@
${HDF5_TOOLS_DIR}/testfiles/textlinktar.h5
${HDF5_TOOLS_DIR}/testfiles/tgroup.h5
${HDF5_TOOLS_DIR}/testfiles/tgrp_comments.h5
${HDF5_TOOLS_DIR}/testfiles/tgrpnullspace.h5
${HDF5_TOOLS_DIR}/testfiles/thlink.h5
${HDF5_TOOLS_DIR}/testfiles/tloop.h5
${HDF5_TOOLS_DIR}/testfiles/tnestedcomp.h5
@ -89,6 +90,7 @@
${HDF5_TOOLS_DIR}/testfiles/tgroup-1.ls
${HDF5_TOOLS_DIR}/testfiles/tgroup-2.ls
${HDF5_TOOLS_DIR}/testfiles/tgroup-3.ls
${HDF5_TOOLS_DIR}/testfiles/tgrpnullspace.ls
${HDF5_TOOLS_DIR}/testfiles/thlink-1.ls
${HDF5_TOOLS_DIR}/testfiles/tloop-1.ls
${HDF5_TOOLS_DIR}/testfiles/tmultifile.ls
@ -241,6 +243,8 @@
textlinksrc-7-old.out.err
tgrp_comments.out
tgrp_comments.out.err
tgrpnullspace.out
tgrpnullspace.out.err
tsoftlinks-1.out
tsoftlinks-1.out.err
tsoftlinks-2.out
@ -415,6 +419,9 @@
# test for empty data
ADD_H5_TEST (tempty 0 -w80 -d tempty.h5)
# test for displaying dataset and attribute of null space
ADD_H5_TEST (tgrpnullspace 0 -w80 -v -S tgrpnullspace.h5)
# test for all dataset types written to attributes
# enable -S for avoiding printing NATIVE types
ADD_H5_TEST (tattr2 0 -w80 -v -S tattr2.h5)

View File

@ -80,6 +80,7 @@ $SRC_H5LS_TESTFILES/textlinksrc.h5
$SRC_H5LS_TESTFILES/textlinktar.h5
$SRC_H5LS_TESTFILES/tgroup.h5
$SRC_H5LS_TESTFILES/tgrp_comments.h5
$SRC_H5LS_TESTFILES/tgrpnullspace.h5
$SRC_H5LS_TESTFILES/thlink.h5
$SRC_H5LS_TESTFILES/tloop.h5
$SRC_H5LS_TESTFILES/tnestedcomp.h5
@ -135,6 +136,7 @@ $SRC_H5LS_TESTFILES/tgroup.ls
$SRC_H5LS_TESTFILES/tgroup-1.ls
$SRC_H5LS_TESTFILES/tgroup-2.ls
$SRC_H5LS_TESTFILES/tgroup-3.ls
$SRC_H5LS_TESTFILES/tgrpnullspace.ls
$SRC_H5LS_TESTFILES/thlink-1.ls
$SRC_H5LS_TESTFILES/tloop-1.ls
$SRC_H5LS_TESTFILES/tmultifile.ls
@ -392,6 +394,9 @@ TOOLTEST tarray1.ls 0 -w80 -r -d tarray1.h5
# test for empty data
TOOLTEST tempty.ls 0 -w80 -d tempty.h5
# test for displaying dataset and attribute of null space
TOOLTEST tgrpnullspace.ls 0 -w80 -v -S tgrpnullspace.h5
# test for all dataset types written to attributes
# enable -S for avoiding printing NATIVE types
TOOLTEST tattr2.ls 0 -w80 -v -S tattr2.h5

View File

@ -0,0 +1,33 @@
HDF5 "tgrpnullspace.h5" {
GROUP "/" {
GROUP "g1" {
ATTRIBUTE "attr" {
DATATYPE H5T_STD_U32LE
DATASPACE NULL
DATA {
}
}
DATASET "dset" {
DATATYPE H5T_STD_I32BE
DATASPACE NULL
STORAGE_LAYOUT {
CONTIGUOUS
SIZE 0
OFFSET 18446744073709551615
}
FILTERS {
NONE
}
FILLVALUE {
FILL_TIME H5D_FILL_TIME_IFSET
VALUE H5D_FILL_VALUE_DEFAULT
}
ALLOCATION_TIME {
H5D_ALLOC_TIME_LATE
}
DATA {
}
}
}
}
}

Binary file not shown.

View File

@ -0,0 +1,7 @@
Opened "tgrpnullspace.h5" with sec2 driver.
g1 Group
Attribute: attr null
Type: 32-bit little-endian unsigned integer
Location: 1:800
Links: 1

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<hdf5:HDF5-File xmlns:hdf5="http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://hdfgroup.org/HDF5/XML/schema/HDF5-File http://www.hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd">
<hdf5:RootGroup OBJ-XID="xid_928" H5Path="/">
<hdf5:Attribute Name="attr">
<hdf5:Dataspace>
<!-- unknown dataspace -->
</hdf5:Dataspace>
<hdf5:DataType>
<hdf5:AtomicType>
<hdf5:IntegerType ByteOrder="LE" Sign="false" Size="4" />
</hdf5:AtomicType>
</hdf5:DataType>
<hdf5:Data>
<hdf5:NoData/>
</hdf5:Data>
</hdf5:Attribute>
<hdf5:Dataset Name="dset" OBJ-XID="xid_976" H5Path= "/dset" Parents="xid_928" H5ParentPaths="/">
<hdf5:StorageLayout>
<hdf5:ContiguousLayout/>
</hdf5:StorageLayout>
<hdf5:FillValueInfo FillTime="FillIfSet" AllocationTime="Late">
<hdf5:FillValue>
<hdf5:NoFill/>
</hdf5:FillValue>
</hdf5:FillValueInfo>
<hdf5:Dataspace>
<!-- unknown dataspace -->
</hdf5:Dataspace>
<hdf5:DataType>
<hdf5:AtomicType>
<hdf5:IntegerType ByteOrder="BE" Sign="true" Size="4" />
</hdf5:AtomicType>
</hdf5:DataType>
<hdf5:Data>
<hdf5:NoData/>
</hdf5:Data>
</hdf5:Dataset>
</hdf5:RootGroup>
</hdf5:HDF5-File>