From 7e7dd03a329f692507203f6cda87fe6f67b86ac7 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Tue, 14 Jun 2005 16:18:32 -0500 Subject: [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 --- release_docs/RELEASE.txt | 2 ++ src/H5Odtype.c | 6 +++--- src/H5Topaque.c | 2 ++ src/H5Tpublic.h | 4 ++++ test/dtypes.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 3 deletions(-) diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index c7f87a0..d99eadf 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -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 diff --git a/src/H5Odtype.c b/src/H5Odtype.c index fe74959..02dac26 100644 --- a/src/H5Odtype.c +++ b/src/H5Odtype.c @@ -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); nshared->u.opaque.tag)+7) & 0xf8; + ret_value += (HDstrlen(dt->shared->u.opaque.tag)+7) & (H5T_OPAQUE_TAG_MAX - 8); break; case H5T_FLOAT: diff --git a/src/H5Topaque.c b/src/H5Topaque.c index 58535a2..0121957 100644 --- a/src/H5Topaque.c +++ b/src/H5Topaque.c @@ -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); diff --git a/src/H5Tpublic.h b/src/H5Tpublic.h index 8fe400a..a6feb73 100644 --- a/src/H5Tpublic.h +++ b/src/H5Tpublic.h @@ -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 diff --git a/test/dtypes.c b/test/dtypes.c index ba18b91..8872727 100644 --- a/test/dtypes.c +++ b/test/dtypes.c @@ -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; @@ -3358,6 +3361,59 @@ opaque_check(int tag_it) /*------------------------------------------------------------------------- + * 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 * * Purpose: Tests functions of encoding and decoding data type. -- cgit v0.12