mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-01-18 15:15:56 +08:00
[svn-r10920] Purpose:
Bug fix Description: Add check for opaque tags that are too long for file format to handle currently. Platforms tested: FreeBSD 4.11 (sleipnir) Too minor to require h5commmitest
This commit is contained in:
parent
162b19cd6c
commit
7e7dd03a32
@ -290,6 +290,8 @@ Bug Fixes since HDF5-1.6.0 release
|
||||
|
||||
Library
|
||||
-------
|
||||
- Added check for opaque datatype tags being too long (check against
|
||||
H5T_OPAQUE_TAG_MAX, currently set to 256). QAK - 2005/06/14
|
||||
- Fixed various errors in maintaining names for open objects in the
|
||||
face of unusual mount & unmount operations. QAK - 2005/06/08
|
||||
- "SEMI" and "STRONG" file close degree settings now apply only to the
|
||||
|
@ -136,7 +136,7 @@ H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
/*
|
||||
* Opaque types...
|
||||
*/
|
||||
z = flags & 0xff;
|
||||
z = flags & (H5T_OPAQUE_TAG_MAX - 1);
|
||||
assert(0==(z&0x7)); /*must be aligned*/
|
||||
if (NULL==(dt->shared->u.opaque.tag=H5MM_malloc(z+1)))
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed");
|
||||
@ -585,7 +585,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
* null terminated).
|
||||
*/
|
||||
z = HDstrlen(dt->shared->u.opaque.tag);
|
||||
aligned = (z+7) & 0xf8;
|
||||
aligned = (z+7) & (H5T_OPAQUE_TAG_MAX - 8);
|
||||
flags |= aligned;
|
||||
HDmemcpy(*pp, dt->shared->u.opaque.tag, MIN(z,aligned));
|
||||
for (n=MIN(z,aligned); n<aligned; n++) (*pp)[n] = 0;
|
||||
@ -1004,7 +1004,7 @@ H5O_dtype_size(const H5F_t *f, const void *mesg)
|
||||
break;
|
||||
|
||||
case H5T_OPAQUE:
|
||||
ret_value += (HDstrlen(dt->shared->u.opaque.tag)+7) & 0xf8;
|
||||
ret_value += (HDstrlen(dt->shared->u.opaque.tag)+7) & (H5T_OPAQUE_TAG_MAX - 8);
|
||||
break;
|
||||
|
||||
case H5T_FLOAT:
|
||||
|
@ -86,6 +86,8 @@ H5Tset_tag(hid_t type_id, const char *tag)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an opaque data type")
|
||||
if (!tag)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no tag")
|
||||
if (HDstrlen(tag) >= H5T_OPAQUE_TAG_MAX)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "tag too long")
|
||||
|
||||
/* Commit */
|
||||
H5MM_xfree(dt->shared->u.opaque.tag);
|
||||
|
@ -195,6 +195,10 @@ typedef struct {
|
||||
/* Variable Length String information */
|
||||
#define H5T_VARIABLE ((size_t)(-1)) /* Indicate that a string is variable length (null-terminated in C, instead of fixed length) */
|
||||
|
||||
/* Opaque information */
|
||||
#define H5T_OPAQUE_TAG_MAX 256 /* Maximum length of an opaque tag */
|
||||
/* This could be raised without too much difficulty */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
@ -95,6 +95,7 @@ static herr_t convert_opaque(hid_t UNUSED st, hid_t UNUSED dt,
|
||||
size_t UNUSED nelmts, size_t UNUSED buf_stride,
|
||||
size_t UNUSED bkg_stride, void UNUSED *_buf,
|
||||
void UNUSED *bkg, hid_t UNUSED dset_xfer_plid);
|
||||
static int opaque_long(void);
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -3266,6 +3267,8 @@ test_opaque(void)
|
||||
num_errors += opaque_check(0);
|
||||
/* Test opaque types without tag */
|
||||
num_errors += opaque_check(1);
|
||||
/* Test named opaque types with very long tag */
|
||||
num_errors += opaque_long();
|
||||
|
||||
if(num_errors)
|
||||
goto error;
|
||||
@ -3356,6 +3359,59 @@ opaque_check(int tag_it)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: opaque_long
|
||||
*
|
||||
* Purpose: Test named (committed) opaque datatypes w/very long tags
|
||||
*
|
||||
* Return: Success: 0
|
||||
*
|
||||
* Failure: number of errors
|
||||
*
|
||||
* Programmer: Quincey Koziol
|
||||
* Tuesday, June 14, 2005
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static int
|
||||
opaque_long(void)
|
||||
{
|
||||
char *long_tag = NULL;
|
||||
hid_t dt = -1;
|
||||
herr_t ret;
|
||||
|
||||
/* Build opaque type */
|
||||
if ((dt=H5Tcreate(H5T_OPAQUE, 4))<0) TEST_ERROR
|
||||
|
||||
/* Create long tag */
|
||||
long_tag = HDmalloc(16384+1);
|
||||
HDmemset(long_tag, 'a', 16384);
|
||||
long_tag[16384] = '\0';
|
||||
|
||||
/* Set opaque type's tag */
|
||||
H5E_BEGIN_TRY {
|
||||
ret = H5Tset_tag(dt, long_tag);
|
||||
} H5E_END_TRY;
|
||||
if(ret!=FAIL) TEST_ERROR
|
||||
|
||||
/* Close datatype */
|
||||
if(H5Tclose(dt) < 0) TEST_ERROR
|
||||
|
||||
/* Release memory for tag */
|
||||
HDfree(long_tag);
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
if (dt>0) H5Tclose(dt);
|
||||
if (long_tag != NULL) HDfree(long_tag);
|
||||
H5_FAILED();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: test_encode
|
||||
|
Loading…
Reference in New Issue
Block a user