summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5S.c28
-rw-r--r--src/H5T.c21
-rw-r--r--test/dtypes.c11
-rw-r--r--test/th5s.c6
4 files changed, 60 insertions, 6 deletions
diff --git a/src/H5S.c b/src/H5S.c
index 1993966..c7816d8 100644
--- a/src/H5S.c
+++ b/src/H5S.c
@@ -32,6 +32,9 @@
#include "H5Oprivate.h" /* object headers */
#include "H5Spkg.h" /* Dataspace functions */
+/* Local macro definitions */
+#define H5S_ENCODE_VERSION 0
+
/* Local static function prototypes */
static H5S_t * H5S_create(H5S_class_t type);
static herr_t H5S_set_extent_simple (H5S_t *space, unsigned rank,
@@ -1828,16 +1831,22 @@ H5S_encode(H5S_t *obj, unsigned char *buf, size_t *nalloc)
/* Verify the size of buffer. If it's not big enough, simply return the
* right size without filling the buffer. */
- if(!buf || *nalloc<(extent_size+select_size+3)) {
- *nalloc = extent_size+select_size+3;
+ if(!buf || *nalloc<(extent_size+select_size+1+1+1+4)) {
+ *nalloc = extent_size+select_size+1+1+1+4;
HGOTO_DONE(ret_value);
}
+ /* Encode the type of the information */
+ *buf++ = H5O_SDSPACE_ID;
+
+ /* Encode the version of the dataspace information */
+ *buf++ = H5S_ENCODE_VERSION;
+
/* Encode the "size of size" information */
*buf++ = f.shared->sizeof_size;
/* Encode size of extent information. Pointer is actually moved in this macro. */
- UINT16ENCODE(buf, extent_size);
+ UINT32ENCODE(buf, extent_size);
/* Encode the extent part of dataspace */
if(H5O_encode(&f, buf, obj, H5O_SDSPACE_ID)<0)
@@ -1926,6 +1935,17 @@ H5S_decode(unsigned char *buf)
FUNC_ENTER_NOAPI(H5S_decode, NULL);
+ /* Initialize this before anything goes bad... */
+ f.shared=NULL;
+
+ /* Decode the type of the information */
+ if(*buf++ != H5O_SDSPACE_ID)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADMESG, NULL, "not an encoded dataspace");
+
+ /* Decode the version of the dataspace information */
+ if(*buf++ != H5S_ENCODE_VERSION)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_VERSION, NULL, "unknown version of encoded dataspace");
+
/* Fake file structure, used only for header message operation */
f.shared = (H5F_file_t*)H5MM_calloc(sizeof(H5F_file_t));
@@ -1933,7 +1953,7 @@ H5S_decode(unsigned char *buf)
f.shared->sizeof_size = *buf++;
/* Decode size of extent information */
- UINT16DECODE(buf, extent_size);
+ UINT32DECODE(buf, extent_size);
/* Decode the extent part of dataspace */
if((extent = H5O_decode(&f, buf, H5O_SDSPACE_ID))==NULL)
diff --git a/src/H5T.c b/src/H5T.c
index acd4649..8863ceb 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -259,6 +259,9 @@ static herr_t H5T_unregister(H5T_pers_t pers, const char *name, H5T_t *src,
static herr_t H5T_register(H5T_pers_t pers, const char *name, H5T_t *src,
H5T_t *dst, H5T_conv_t func, hid_t dxpl_id);
+/* Local macro definitions */
+#define H5T_ENCODE_VERSION 0
+
/*
* Type initialization macros
*
@@ -2671,11 +2674,17 @@ H5T_encode(H5T_t *obj, unsigned char *buf, size_t *nalloc)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADSIZE, FAIL, "can't find datatype size");
/* Don't encode if buffer size isn't big enough or buffer is empty */
- if(!buf || *nalloc<buf_size) {
- *nalloc = buf_size;
+ if(!buf || *nalloc<(buf_size+1+1)) {
+ *nalloc = buf_size+1+1;
HGOTO_DONE(ret_value);
}
+ /* Encode the type of the information */
+ *buf++ = H5O_DTYPE_ID;
+
+ /* Encode the version of the dataspace information */
+ *buf++ = H5T_ENCODE_VERSION;
+
if(H5O_encode(&f, buf, obj, H5O_DTYPE_ID)<0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode object");
@@ -2709,6 +2718,14 @@ H5T_decode(unsigned char *buf)
FUNC_ENTER_NOAPI(H5T_decode, NULL);
+ /* Decode the type of the information */
+ if(*buf++ != H5O_DTYPE_ID)
+ HGOTO_ERROR(H5E_DATATYPE, H5E_BADMESG, NULL, "not an encoded datatype");
+
+ /* Decode the version of the datatype information */
+ if(*buf++ != H5T_ENCODE_VERSION)
+ HGOTO_ERROR(H5E_DATATYPE, H5E_VERSION, NULL, "unknown version of encoded datatype");
+
if((ret_value = H5O_decode(NULL, buf, H5O_DTYPE_ID))==NULL)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, NULL, "can't decode object");
diff --git a/test/dtypes.c b/test/dtypes.c
index e0fc7be..607b65a 100644
--- a/test/dtypes.c
+++ b/test/dtypes.c
@@ -1892,6 +1892,7 @@ test_encode(void)
size_t cmpd_buf_size = 0;
size_t enum_buf_size = 0;
unsigned char *cmpd_buf=NULL, *enum_buf=NULL;
+ herr_t ret;
TESTING("functions of encoding and decoding data types");
@@ -1977,6 +1978,16 @@ test_encode(void)
if(cmpd_buf_size>0)
cmpd_buf = (unsigned char*)calloc(1, cmpd_buf_size);
+ /* Try decoding bogus buffer */
+ H5E_BEGIN_TRY {
+ ret = H5Tdecode(cmpd_buf);
+ } H5E_END_TRY;
+ if(ret!=FAIL) {
+ H5_FAILED();
+ printf("Decoded bogus buffer!\n");
+ goto error;
+ }
+
if(H5Tencode(tid1, cmpd_buf, &cmpd_buf_size)<0) {
H5_FAILED();
printf("Can't encode compound type\n");
diff --git a/test/th5s.c b/test/th5s.c
index c3724e2..9379413 100644
--- a/test/th5s.c
+++ b/test/th5s.c
@@ -563,6 +563,12 @@ test_h5s_encode(void)
if(sbuf_size>0)
sbuf = (unsigned char*)calloc(1, sbuf_size);
+ /* Try decoding bogus buffer */
+ H5E_BEGIN_TRY {
+ ret = H5Sdecode(sbuf);
+ } H5E_END_TRY;
+ VERIFY(ret, FAIL, "H5Sdecode");
+
ret = H5Sencode(sid1, sbuf, &sbuf_size);
CHECK(ret, FAIL, "H5Sencode");