summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScot Breitenfeld <brtnfld@hdfgroup.org>2011-07-31 00:46:37 (GMT)
committerScot Breitenfeld <brtnfld@hdfgroup.org>2011-07-31 00:46:37 (GMT)
commit3dc16eb5bdc50de04974fec8db6ec0fa14b8ae6c (patch)
treeb50cca56bbce38623d35b6e9c0713ac3795dbb7c
parent74cf7b79a5e3950b5aa6c42c6e807760a7e94ac8 (diff)
downloadhdf5-3dc16eb5bdc50de04974fec8db6ec0fa14b8ae6c.zip
hdf5-3dc16eb5bdc50de04974fec8db6ec0fa14b8ae6c.tar.gz
hdf5-3dc16eb5bdc50de04974fec8db6ec0fa14b8ae6c.tar.bz2
[svn-r21157] Description: JIRA HDFFV-7673: fixed segfault when retrieving the length of a
a dimension scale that does not exist. Implemented a test for the situation and added an if condition depending on if the label name exists. Tested: jam (gnu and intel)
-rw-r--r--hl/src/H5DS.c33
-rw-r--r--hl/test/test_ds.c5
2 files changed, 25 insertions, 13 deletions
diff --git a/hl/src/H5DS.c b/hl/src/H5DS.c
index 6a07e7a..e9ea9cf 100644
--- a/hl/src/H5DS.c
+++ b/hl/src/H5DS.c
@@ -1617,6 +1617,8 @@ out:
* Comments:
*
* Modifications:
+* JIRA HDFFV-7673: Added a check to see if the label name exists,
+* if not then returns zero. July 30, 2011. MSB
*
*-------------------------------------------------------------------------
*/
@@ -1629,7 +1631,7 @@ ssize_t H5DSget_label(hid_t did, unsigned int idx, char *label, size_t size)
int rank; /* rank of dataset */
char **buf = NULL; /* buffer to store in the attribute */
H5I_type_t it; /* ID type */
- size_t nbytes;
+ size_t nbytes = 0;
size_t copy_len;
int i;
@@ -1685,6 +1687,7 @@ ssize_t H5DSget_label(hid_t did, unsigned int idx, char *label, size_t size)
if ((aid = H5Aopen(did, DIMENSION_LABELS, H5P_DEFAULT)) < 0)
goto out;
+
if ((tid = H5Aget_type(aid)) < 0)
goto out;
@@ -1698,26 +1701,30 @@ ssize_t H5DSget_label(hid_t did, unsigned int idx, char *label, size_t size)
if (H5Aread(aid, tid, buf) < 0)
goto out;
- /* get the real string length */
- nbytes = strlen(buf[idx]);
+ /* do only if the label name exists for the dimension */
+ if (buf[idx] != NULL)
+ {
+ /* get the real string length */
+ nbytes = strlen(buf[idx]);
- /* compute the string length which will fit into the user's buffer */
- copy_len = MIN(size-1, nbytes);
+ /* compute the string length which will fit into the user's buffer */
+ copy_len = MIN(size-1, nbytes);
- /* copy all/some of the name */
- if (label)
- {
- memcpy(label, buf[idx], copy_len);
+ /* copy all/some of the name */
+ if (label)
+ {
+ memcpy(label, buf[idx], copy_len);
+
+ /* terminate the string */
+ label[copy_len] = '\0';
+ }
- /* terminate the string */
- label[copy_len] = '\0';
}
-
/* free all the ptr's from the H5Aread() */
for (i = 0; i < rank; i++)
{
if (buf[i])
- free(buf[i]);
+ free(buf[i]);
}
/* close */
diff --git a/hl/test/test_ds.c b/hl/test/test_ds.c
index 7937a5e..2be3d60 100644
--- a/hl/test/test_ds.c
+++ b/hl/test/test_ds.c
@@ -3138,6 +3138,11 @@ static int test_simple(void)
if(H5DSset_label(did,DIM0,DIM0_LABEL) < 0)
goto out;
+
+ /* check getting a label which does not exist */
+ if(H5DSget_label(did,DIM1,dim1_label,sizeof(dim1_label)) != 0)
+ goto out;
+
if(H5DSset_label(did,DIM1,DIM1_LABEL) < 0)
goto out;