From a6d5fa2c7db165fa2cecee86bdbd201339349968 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Mon, 7 Feb 2011 19:53:45 -0500 Subject: [svn-r20061] Description: Bring changes from Coverity branch to trunk: r19930: Fix memory leaks involving VL attributes in h5repack and h5diff. The buffers in copy_attr and diff_attr were not checked for the presence of a vlen before being freed, and vlen storage was never reclaimed. Added checks and calls to H5D_vlen_reclaim(). r19933: Purpose: Fix memory leak in H5L_move_cb() Description: H5L_move_cb copied the source link using H5O_msg_copy() but freed it manually using H5MM_xfree(). Since H5O_link_copy allocates the link using H5FL_MALLOC, this causes the link to be allocated from the free list but is never put back on the free list when it is freed. This prevents the link free list from shutting down properly. Modified H5L_move_cb() and H5L_move_dest_cb() to free the link properly using H5O_msg_free(). r19973: Fix resource leaks by freeing string created by HD5f2string r19974: Issue #345: Inialize buf variable to null Tested on: Mac OS X/32 10.6.6 (amazon) w/debug & production (h5committested on Coverity branch) --- fortran/src/H5Ff.c | 33 +++--- fortran/src/H5Lf.c | 13 ++- hl/src/H5DS.c | 266 ++++++++++++++++++---------------------------- src/H5Groot.c | 2 +- src/H5L.c | 23 ++-- test/bittests.c | 39 +++---- tools/h5repack/h5repack.c | 86 ++++++++------- tools/lib/h5diff_attr.c | 216 +++++++++++++++---------------------- 8 files changed, 288 insertions(+), 390 deletions(-) diff --git a/fortran/src/H5Ff.c b/fortran/src/H5Ff.c index 1570bb3..3cfc9e3 100644 --- a/fortran/src/H5Ff.c +++ b/fortran/src/H5Ff.c @@ -47,37 +47,36 @@ nh5fcreate_c(_fcd name, int_f *namelen, int_f *access_flags, hid_t_f* crt_prp, h * Define access flags */ c_access_flags = (unsigned) *access_flags; + /* * Define creation property */ c_crt_prp = *crt_prp; -/* - if ( H5P_DEFAULT_F == c_crt_prp ) c_crt_prp = H5P_DEFAULT; -*/ + /* * Define access property */ c_acc_prp = *acc_prp; -/* - if ( H5P_DEFAULT_F == c_acc_prp ) c_acc_prp = H5P_DEFAULT; -*/ /* * Convert FORTRAN name to C name */ c_namelen = *namelen; c_name = (char *)HD5f2cstring(name, (size_t)c_namelen); - if (c_name == NULL) return ret_value; + if(c_name == NULL) + return ret_value; /* * Call H5Fcreate function. */ c_file_id = H5Fcreate(c_name, c_access_flags, c_crt_prp, c_acc_prp); - if (c_file_id < 0) return ret_value; - *file_id = c_file_id; + if (c_file_id >= 0) { + ret_value = 0; + *file_id = c_file_id; + } + HDfree(c_name); - ret_value = 0; return ret_value; } @@ -238,31 +237,31 @@ nh5fopen_c (_fcd name, int_f *namelen, int_f *access_flags, hid_t_f *acc_prp, hi * Define access flags */ c_access_flags = (unsigned) *access_flags; + /* * Define access property */ c_acc_prp = *acc_prp; -/* - if ( H5P_DEFAULT_F == c_acc_prp ) c_acc_prp = H5P_DEFAULT; -*/ /* * Convert FORTRAN name to C name */ c_namelen = *namelen; c_name = (char *)HD5f2cstring(name, (size_t)c_namelen); - if (c_name == NULL) return ret_value; + if(c_name == NULL) + return ret_value; /* * Call H5Fopen function. */ c_file_id = H5Fopen(c_name, c_access_flags, c_acc_prp); - if (c_file_id < 0) return ret_value; - *file_id = (hid_t_f)c_file_id; + if(c_file_id >= 0) { + ret_value = 0; + *file_id = (hid_t_f)c_file_id; + } /* end if */ HDfree(c_name); - ret_value = 0; return ret_value; } diff --git a/fortran/src/H5Lf.c b/fortran/src/H5Lf.c index 59f4535..c971d5e 100644 --- a/fortran/src/H5Lf.c +++ b/fortran/src/H5Lf.c @@ -394,7 +394,7 @@ done: * Modifications: N/A *---------------------------------------------------------------------------*/ int_f -nh5lget_info_c (hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, +nh5lget_info_c(hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, int_f *cset, int_f *corder, int_f *corder_valid, int_f *link_type, haddr_t_f *address, size_t_f *val_size, hid_t_f *lapl_id) @@ -406,16 +406,16 @@ nh5lget_info_c (hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, /* * Convert FORTRAN name to C name */ - if((c_link_name = HD5f2cstring(link_name, (size_t)*link_namelen)) == NULL) - HGOTO_DONE(FAIL); + if(NULL == (c_link_name = HD5f2cstring(link_name, (size_t)*link_namelen))) + HGOTO_DONE(FAIL); + /* * Call H5Linfo function. */ if(H5Lget_info((hid_t)*link_loc_id, c_link_name, &link_buff, (hid_t)*lapl_id) < 0) - HGOTO_DONE(FAIL); + HGOTO_DONE(FAIL); /* Unpack the structure */ - *cset = (int_f)link_buff.cset; *corder = (int_f)link_buff.corder; *corder_valid = 0; @@ -425,6 +425,9 @@ nh5lget_info_c (hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, *val_size = (size_t_f)link_buff.u.val_size; done: + if(c_link_name) + HDfree(c_link_name); + return ret_value; } diff --git a/hl/src/H5DS.c b/hl/src/H5DS.c index faa6d30..432a725 100644 --- a/hl/src/H5DS.c +++ b/hl/src/H5DS.c @@ -132,12 +132,12 @@ herr_t H5DSattach_scale(hid_t did, hid_t ntid = -1; /* attribute native type ID */ hid_t aid = -1; /* attribute ID */ int rank; /* rank of dataset */ - hsize_t dims[1]; /* dimension of the "REFERENCE_LIST" array */ + hsize_t dims[1]; /* dimension of the "REFERENCE_LIST" array */ ds_list_t dsl; /* attribute data in the DS pointing to the dataset */ - ds_list_t *dsbuf=NULL; /* array of attribute data in the DS pointing to the dataset */ + ds_list_t *dsbuf = NULL; /* array of attribute data in the DS pointing to the dataset */ hobj_ref_t ref_to_ds; /* reference to the DS */ hobj_ref_t ref_j; /* iterator reference */ - hvl_t *buf=NULL; /* VL buffer to store in the attribute */ + hvl_t *buf = NULL; /* VL buffer to store in the attribute */ hid_t dsid_j; /* DS dataset ID in DIMENSION_LIST */ H5O_info_t oi1, oi2; H5I_type_t it1, it2; @@ -254,8 +254,7 @@ herr_t H5DSattach_scale(hid_t did, goto out; /* allocate and initialize the VL */ - buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t)); - + buf = (hvl_t *)malloc((size_t)rank * sizeof(hvl_t)); if(buf == NULL) goto out; @@ -270,25 +269,21 @@ herr_t H5DSattach_scale(hid_t did, ((hobj_ref_t *)buf[idx].p)[0] = ref_to_ds; /* write the attribute with the reference */ - if (H5Awrite(aid,tid,buf) < 0) + if(H5Awrite(aid, tid, buf) < 0) goto out; /* close */ - if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0) + if(H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf) < 0) goto out; - if (H5Sclose(sid) < 0) + if(H5Sclose(sid) < 0) goto out; - if (H5Tclose(tid) < 0) + if(H5Tclose(tid) < 0) goto out; - if (H5Aclose(aid) < 0) + if(H5Aclose(aid) < 0) goto out; - if (buf) - { - free(buf); - buf = NULL; - } - + free(buf); + buf = NULL; } /*------------------------------------------------------------------------- @@ -296,8 +291,7 @@ herr_t H5DSattach_scale(hid_t did, * and insert the new reference *------------------------------------------------------------------------- */ - - else if ( has_dimlist == 1 ) + else if(has_dimlist == 1) { if((aid = H5Aopen(did, DIMENSION_LIST, H5P_DEFAULT)) < 0) goto out; @@ -309,8 +303,7 @@ herr_t H5DSattach_scale(hid_t did, goto out; /* allocate and initialize the VL */ - buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t)); - + buf = (hvl_t *)malloc((size_t)rank * sizeof(hvl_t)); if(buf == NULL) goto out; @@ -320,13 +313,12 @@ herr_t H5DSattach_scale(hid_t did, /* check to avoid inserting duplicates. it is not FAIL, just do nothing */ /* iterate all the REFs in this dimension IDX */ - for (i=0; i<(int)buf[idx].len; i++) - { + for(i = 0; i < (int)buf[idx].len; i++) { /* get the reference */ ref_j = ((hobj_ref_t *)buf[idx].p)[i]; /* get the scale id for this REF */ - if ((dsid_j = H5Rdereference(did,H5R_OBJECT,&ref_j)) < 0) + if((dsid_j = H5Rdereference(did,H5R_OBJECT,&ref_j)) < 0) goto out; /* get info for DS in the parameter list */ @@ -342,48 +334,41 @@ herr_t H5DSattach_scale(hid_t did, found_ds = 1; /* close the dereferenced dataset */ - if (H5Dclose(dsid_j) < 0) + if(H5Dclose(dsid_j) < 0) goto out; - } + } /* end for */ - if (found_ds==0) - { + if(found_ds == 0) { /* we are adding one more DS to this dimension */ - if ( buf[idx].len > 0 ) - { + if(buf[idx].len > 0) { buf[idx].len++; len = buf[idx].len; - buf[idx].p = realloc( buf[idx].p, len * sizeof(hobj_ref_t)); - ((hobj_ref_t *)buf[idx].p)[ len-1 ] = ref_to_ds; - } - else - { + buf[idx].p = realloc(buf[idx].p, len * sizeof(hobj_ref_t)); + ((hobj_ref_t *)buf[idx].p)[len - 1] = ref_to_ds; + } /* end if */ + else { /* store the REF information in the index of the dataset that has the DS */ buf[idx].len = 1; - buf[idx].p = malloc( 1 * sizeof(hobj_ref_t)); + buf[idx].p = malloc(sizeof(hobj_ref_t)); ((hobj_ref_t *)buf[idx].p)[0] = ref_to_ds; - } - } + } /* end else */ + } /* end if */ /* write the attribute with the new references */ - if (H5Awrite(aid,tid,buf) < 0) + if(H5Awrite(aid, tid, buf) < 0) goto out; /* close */ - if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0) + if(H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf) < 0) goto out; - if (H5Sclose(sid) < 0) + if(H5Sclose(sid) < 0) goto out; - if (H5Tclose(tid) < 0) + if(H5Tclose(tid) < 0) goto out; - if (H5Aclose(aid) < 0) + if(H5Aclose(aid) < 0) goto out; - if (buf) - { - free(buf); - buf = NULL; - } - + free(buf); + buf = NULL; } /* has_dimlist */ /*------------------------------------------------------------------------- @@ -392,20 +377,18 @@ herr_t H5DSattach_scale(hid_t did, */ /* try to find the attribute "REFERENCE_LIST" on the >>DS<< dataset */ - if ((has_reflist = H5LT_find_attribute(dsid,REFERENCE_LIST)) < 0) + if((has_reflist = H5LT_find_attribute(dsid, REFERENCE_LIST)) < 0) goto out; /*------------------------------------------------------------------------- * it does not exist. we create the attribute and its reference data *------------------------------------------------------------------------- */ - if (has_reflist == 0) - { - + if(has_reflist == 0) { dims[0] = 1; /* space for the attribute */ - if ((sid = H5Screate_simple(1,dims,NULL)) < 0) + if((sid = H5Screate_simple(1,dims,NULL)) < 0) goto out; /* create the compound datatype for the attribute "REFERENCE_LIST" */ @@ -438,16 +421,13 @@ herr_t H5DSattach_scale(hid_t did, goto out; if(H5Aclose(aid) < 0) goto out; - - } + } /* end if */ /*------------------------------------------------------------------------- * the "REFERENCE_LIST" array already exists, open it and extend it *------------------------------------------------------------------------- */ - - else if(has_reflist == 1) - { + else if(has_reflist == 1) { if((aid = H5Aopen(dsid, REFERENCE_LIST, H5P_DEFAULT)) < 0) goto out; @@ -468,17 +448,16 @@ herr_t H5DSattach_scale(hid_t did, nelmts++; dsbuf = (ds_list_t*) malloc((size_t)nelmts * sizeof(ds_list_t)); - - if (dsbuf == NULL) + if(dsbuf == NULL) goto out; - if (H5Aread(aid,ntid,dsbuf) < 0) + if(H5Aread(aid, ntid, dsbuf) < 0) goto out; /* close */ - if (H5Sclose(sid) < 0) + if(H5Sclose(sid) < 0) goto out; - if (H5Aclose(aid) < 0) + if(H5Aclose(aid) < 0) goto out; /*------------------------------------------------------------------------- @@ -492,7 +471,7 @@ herr_t H5DSattach_scale(hid_t did, /* store the IDX information (index of the dataset that has the DS) */ dsl.dim_idx = idx; - dsbuf[nelmts-1] = dsl; + dsbuf[nelmts - 1] = dsl; /* create a new data space for the new references array */ dims[0] = nelmts; @@ -518,12 +497,8 @@ herr_t H5DSattach_scale(hid_t did, if (H5Tclose(ntid) < 0) goto out; - if (dsbuf) - { - free(dsbuf); - dsbuf = NULL; - } - + free(dsbuf); + dsbuf = NULL; } /* has_reflist */ /*------------------------------------------------------------------------- @@ -531,11 +506,10 @@ herr_t H5DSattach_scale(hid_t did, *------------------------------------------------------------------------- */ - if ((is_ds=H5DSis_scale(dsid)) < 0) + if((is_ds=H5DSis_scale(dsid)) < 0) return FAIL; - if (is_ds == 0 ) - { + if(is_ds == 0) { if (H5LT_set_attribute_string(dsid,"CLASS",DIMENSION_SCALE_CLASS) < 0) return FAIL; } @@ -544,17 +518,10 @@ herr_t H5DSattach_scale(hid_t did, /* error zone */ out: - - if (buf) - { + if(buf) free(buf); - buf = NULL; - } - if (dsbuf) - { + if(dsbuf) free(dsbuf); - dsbuf = NULL; - } H5E_BEGIN_TRY { H5Sclose(sid); @@ -706,13 +673,12 @@ herr_t H5DSdetach_scale(hid_t did, goto out; /* allocate and initialize the VL */ - buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t)); - + buf = (hvl_t *)malloc((size_t)rank * sizeof(hvl_t)); if(buf == NULL) goto out; /* read */ - if (H5Aread(aid,tid,buf) < 0) + if(H5Aread(aid, tid, buf) < 0) goto out; /* reset */ @@ -747,7 +713,8 @@ herr_t H5DSdetach_scale(hid_t did, and reset to NULL */ size_t len = buf[idx].len; - if(j 0) { have_ds = 1; break; } } if(have_ds) { - if(H5Awrite(aid,tid,buf) < 0) + if(H5Awrite(aid, tid, buf) < 0) goto out; } else { - if(H5Adelete(did,DIMENSION_LIST) < 0) + if(H5Adelete(did, DIMENSION_LIST) < 0) goto out; } /* close */ - if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0) + if(H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf) < 0) goto out; - if (H5Sclose(sid) < 0) + if(H5Sclose(sid) < 0) goto out; - if (H5Tclose(tid) < 0) + if(H5Tclose(tid) < 0) goto out; - if (H5Aclose(aid) < 0) + if(H5Aclose(aid) < 0) goto out; - if (buf) - { - free(buf); - buf = NULL; - } + free(buf); + buf = NULL; /*------------------------------------------------------------------------- @@ -826,7 +790,7 @@ herr_t H5DSdetach_scale(hid_t did, if(dsbuf == NULL) goto out; - if (H5Aread(aid,ntid,dsbuf) < 0) + if(H5Aread(aid, ntid, dsbuf) < 0) goto out; for(ii=0; ii=(unsigned int )rank) + if(idx >= (unsigned int )rank) return FAIL; /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */ @@ -2095,9 +2042,7 @@ int H5DSget_num_scales(hid_t did, * the attribute exists, open it *------------------------------------------------------------------------- */ - - else - { + else { if((aid = H5Aopen(did, DIMENSION_LIST, H5P_DEFAULT)) < 0) goto out; if((tid = H5Aget_type(aid)) < 0) @@ -2106,8 +2051,7 @@ int H5DSget_num_scales(hid_t did, goto out; /* allocate and initialize the VL */ - buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t)); - + buf = (hvl_t *)malloc((size_t)rank * sizeof(hvl_t)); if(buf == NULL) goto out; @@ -2115,23 +2059,19 @@ int H5DSget_num_scales(hid_t did, if(H5Aread(aid, tid, buf) < 0) goto out; - nscales=(int)buf[idx].len; + nscales = (int)buf[idx].len; /* close */ - if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0) + if(H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf) < 0) goto out; - if (H5Sclose(sid) < 0) + if(H5Sclose(sid) < 0) goto out; - if (H5Tclose(tid) < 0) + if(H5Tclose(tid) < 0) goto out; - if (H5Aclose(aid) < 0) + if(H5Aclose(aid) < 0) goto out; - if (buf) - { - free(buf); - buf = NULL; - } - + free(buf); + buf = NULL; } /* has_dimlist */ return nscales; @@ -2144,11 +2084,9 @@ out: H5Tclose(tid); } H5E_END_TRY; - if (buf) - { + if(buf) free(buf); - buf = NULL; - } + return FAIL; } diff --git a/src/H5Groot.c b/src/H5Groot.c index b8ba0fd..ff4a8c4 100644 --- a/src/H5Groot.c +++ b/src/H5Groot.c @@ -15,7 +15,7 @@ /*------------------------------------------------------------------------- * - * Created: H5Gobj.c + * Created: H5Groot.c * Apr 8 2009 * Neil Fortner * diff --git a/src/H5L.c b/src/H5L.c index 9319e2c..2a9d591 100644 --- a/src/H5L.c +++ b/src/H5L.c @@ -2414,8 +2414,8 @@ H5L_move_dest_cb(H5G_loc_t *grp_loc/*in*/, const char *name, H5G_own_loc_t *own_loc/*out*/) { H5L_trav_mv2_t *udata = (H5L_trav_mv2_t *)_udata; /* User data passed in */ - H5G_t *grp=NULL; /* H5G_t for this group, opened to pass to user callback */ - hid_t grp_id = FAIL; /* Id for this group (passed to user callback */ + H5G_t *grp = NULL; /* H5G_t for this group, opened to pass to user callback */ + hid_t grp_id = FAIL; /* ID for this group (passed to user callback */ H5G_loc_t temp_loc; /* For UD callback */ hbool_t temp_loc_init = FALSE; herr_t ret_value = SUCCEED; /* Return value */ @@ -2500,6 +2500,10 @@ done: * location for the object */ *own_loc = H5G_OWN_NONE; + /* Reset the "name" field in udata->lnk because it is owned by traverse() + * and must not be manipulated after traverse closes */ + udata->lnk->name = NULL; + FUNC_LEAVE_NOAPI(ret_value) } /* end H5L_move_dest_cb() */ @@ -2539,7 +2543,7 @@ H5L_move_cb(H5G_loc_t *grp_loc/*in*/, const char *name, const H5O_link_t *lnk, HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "the name of a link must be supplied to move or copy") /* Set up user data for move_dest_cb */ - if((udata_out.lnk = (H5O_link_t *)H5O_msg_copy(H5O_LINK_ID, lnk, NULL)) == NULL) + if(NULL == (udata_out.lnk = (H5O_link_t *)H5O_msg_copy(H5O_LINK_ID, lnk, NULL))) HGOTO_ERROR(H5E_LINK, H5E_CANTCOPY, FAIL, "unable to copy link to be moved") /* In this special case, the link's name is going to be replaced at its @@ -2600,16 +2604,11 @@ done: H5MM_xfree(orig_name); /* If udata_out.lnk was copied, free any memory allocated - * In this special case, the H5L_move_dest_cb callback frees the name - * if it succeeds + * In this special case, the H5L_move_dest_cb callback resets the name + * so H5O_msg_free shouldn't try to free it */ - if(link_copied) { - if(udata_out.lnk->type == H5L_TYPE_SOFT) - udata_out.lnk->u.soft.name = (char *)H5MM_xfree(udata_out.lnk->u.soft.name); - else if(udata_out.lnk->type >= H5L_TYPE_UD_MIN && udata_out.lnk->u.ud.size > 0) - udata_out.lnk->u.ud.udata = H5MM_xfree(udata_out.lnk->u.ud.udata); - H5MM_xfree(udata_out.lnk); - } /* end if */ + if(link_copied) + H5O_msg_free(H5O_LINK_ID, udata_out.lnk); /* Indicate that this callback didn't take ownership of the group * * location for the object */ diff --git a/test/bittests.c b/test/bittests.c index e435d6c..f063cee 100644 --- a/test/bittests.c +++ b/test/bittests.c @@ -908,41 +908,36 @@ test_clear (void) * Programmer: Robb Matzke * Tuesday, June 16, 1998 * - * Modifications: - * *------------------------------------------------------------------------- */ int -main (void) +main(void) { - int nerrors=0; + int nerrors = 0; /* - * Open the library explicitly for thread-safe builds, so per-thread - * things are initialized correctly. + * Open the library explicitly. */ -#ifdef H5_HAVE_THREADSAFE H5open(); -#endif /* H5_HAVE_THREADSAFE */ - - nerrors += test_find ()<0?1:0; - nerrors += test_set ()<0?1:0; - nerrors += test_clear()<0?1:0; - nerrors += test_copy ()<0?1:0; - nerrors += test_shift()<0?1:0; - nerrors += test_increment ()<0?1:0; - nerrors += test_decrement ()<0?1:0; - nerrors += test_negate ()<0?1:0; - - if (nerrors) { + + nerrors += test_find() < 0 ? 1 : 0; + nerrors += test_set() < 0 ? 1 : 0; + nerrors += test_clear() < 0 ? 1 : 0; + nerrors += test_copy() < 0 ? 1 : 0; + nerrors += test_shift() < 0 ? 1 : 0; + nerrors += test_increment() < 0 ? 1 : 0; + nerrors += test_decrement() < 0 ? 1 : 0; + nerrors += test_negate() < 0 ? 1 : 0; + + if(nerrors) { printf("***** %u FAILURE%s! *****\n", - nerrors, 1==nerrors?"":"S"); + nerrors, 1 == nerrors ? "" : "S"); exit(1); } printf("All bit tests passed.\n"); -#ifdef H5_HAVE_THREADSAFE H5close(); -#endif /* H5_HAVE_THREADSAFE */ + return 0; } + diff --git a/tools/h5repack/h5repack.c b/tools/h5repack/h5repack.c index 0f16e87..8c46638 100644 --- a/tools/h5repack/h5repack.c +++ b/tools/h5repack/h5repack.c @@ -407,7 +407,7 @@ int copy_attr(hid_t loc_in, hid_t ftype_id=-1; /* file type ID */ hid_t wtype_id=-1; /* read/write type ID */ size_t msize; /* size of type */ - void *buf=NULL; /* data buffer */ + void *buf = NULL; /* data buffer */ hsize_t nelmts; /* number of elements in dataset */ int rank; /* rank of dataset */ htri_t is_named; /* Whether the datatype is named */ @@ -424,28 +424,23 @@ int copy_attr(hid_t loc_in, * copy all attributes *------------------------------------------------------------------------- */ - - for ( u = 0; u < (unsigned)oinfo.num_attrs; u++) - { - buf=NULL; - + for(u = 0; u < (unsigned)oinfo.num_attrs; u++) { /* open attribute */ if((attr_id = H5Aopen_by_idx(loc_in, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, H5P_DEFAULT, H5P_DEFAULT)) < 0) goto error; /* get name */ - if (H5Aget_name( attr_id, (size_t)255, name ) < 0) + if(H5Aget_name(attr_id, (size_t)255, name) < 0) goto error; /* get the file datatype */ - if ((ftype_id = H5Aget_type( attr_id )) < 0 ) + if((ftype_id = H5Aget_type(attr_id)) < 0 ) goto error; /* Check if the datatype is committed */ if((is_named = H5Tcommitted(ftype_id)) < 0) goto error; - if(is_named && travt) - { + if(is_named && travt) { hid_t fidout; /* Create out file id */ @@ -462,29 +457,28 @@ int copy_attr(hid_t loc_in, if(H5Fclose(fidout) < 0) goto error; - } - else - { - if (options->use_native==1) + } /* end if */ + else { + if(options->use_native == 1) wtype_id = h5tools_get_native_type(ftype_id); else wtype_id = H5Tcopy(ftype_id); - } /* end if */ + } /* end else */ /* get the dataspace handle */ - if ((space_id = H5Aget_space( attr_id )) < 0 ) + if((space_id = H5Aget_space(attr_id)) < 0) goto error; /* get dimensions */ - if ( (rank = H5Sget_simple_extent_dims(space_id, dims, NULL)) < 0 ) + if((rank = H5Sget_simple_extent_dims(space_id, dims, NULL)) < 0) goto error; - nelmts=1; - for (j=0; jm_verbose || options->m_report) - { - do_print_objname ("attribute", np1, np2); - nfound = diff_array(buf1, - buf2, - nelmts1, - (hsize_t)0, - rank1, - dims1, - options, - np1, - np2, - mtype1_id, - attr1_id, - attr2_id); - print_found(nfound); + if(options->m_verbose || options->m_report) { + do_print_objname("attribute", np1, np2); + nfound = diff_array(buf1, buf2, nelmts1, (hsize_t)0, rank1, dims1, + options, np1, np2, mtype1_id, attr1_id, attr2_id); + print_found(nfound); } /* quiet mode (-q), just count differences */ - else if(options->m_quiet) - { - nfound = diff_array(buf1, - buf2, - nelmts1, - (hsize_t)0, - rank1, - dims1, - options, - np1, - np2, - mtype1_id, - attr1_id, - attr2_id); + else if(options->m_quiet) { + nfound = diff_array(buf1, buf2, nelmts1, (hsize_t)0, rank1, dims1, + options, np1, np2, mtype1_id, attr1_id, attr2_id); } /* the rest (-c, none, ...) */ - else - { - nfound = diff_array(buf1, - buf2, - nelmts1, - (hsize_t)0, - rank1, - dims1, - options, - np1, - np2, - mtype1_id, - attr1_id, - attr2_id); + else { + nfound = diff_array(buf1, buf2, nelmts1, (hsize_t)0, rank1, dims1, + options, np1, np2, mtype1_id, attr1_id, attr2_id); /* not comparable, no display the different number */ - if (!options->not_cmp && nfound) - { - do_print_objname ("attribute", np1, np2); + if(!options->not_cmp && nfound) { + do_print_objname("attribute", np1, np2); print_found(nfound); - } - } + } /* end if */ + } /* end else */ /*---------------------------------------------------------------------- @@ -269,51 +219,61 @@ hsize_t diff_attr(hid_t loc1_id, *---------------------------------------------------------------------- */ - if (H5Tclose(ftype1_id)<0) + /* Free buf1 and buf2, being careful to reclaim any VL data first */ + if(TRUE == H5Tdetect_class(mtype1_id, H5T_VLEN)) + H5Dvlen_reclaim(mtype1_id, space1_id, H5P_DEFAULT, buf1); + HDfree(buf1); + buf1 = NULL; + if(TRUE == H5Tdetect_class(mtype2_id, H5T_VLEN)) + H5Dvlen_reclaim(mtype2_id, space2_id, H5P_DEFAULT, buf2); + HDfree(buf2); + buf2 = NULL; + + if(H5Tclose(ftype1_id) < 0) goto error; - if (H5Tclose(ftype2_id)<0) + if(H5Tclose(ftype2_id) < 0) goto error; - if (H5Sclose(space1_id)<0) + if(H5Sclose(space1_id) < 0) goto error; - if (H5Sclose(space2_id)<0) + if(H5Sclose(space2_id) < 0) goto error; - if (H5Aclose(attr1_id)<0) + if(H5Aclose(attr1_id) < 0) goto error; - if (H5Aclose(attr2_id)<0) + if(H5Aclose(attr2_id) < 0) goto error; - if (H5Tclose(mtype1_id)<0) + if(H5Tclose(mtype1_id) < 0) goto error; - if (H5Tclose(mtype2_id)<0) + if(H5Tclose(mtype2_id) < 0) goto error; - if (buf1) - HDfree(buf1); - if (buf2) - HDfree(buf2); - nfound_total += nfound; - } /* u */ + } /* u */ - return nfound_total; + return nfound_total; error: - H5E_BEGIN_TRY { - H5Tclose(ftype1_id); - H5Tclose(ftype2_id); - H5Tclose(mtype1_id); - H5Tclose(mtype2_id); - H5Sclose(space1_id); - H5Sclose(space2_id); - H5Aclose(attr1_id); - H5Aclose(attr2_id); - if (buf1) - HDfree(buf1); - if (buf2) - HDfree(buf2); - } H5E_END_TRY; - - options->err_stat=1; - return nfound_total; + H5E_BEGIN_TRY { + if(buf1) { + if(TRUE == H5Tdetect_class(mtype1_id, H5T_VLEN)) + H5Dvlen_reclaim(mtype1_id, space1_id, H5P_DEFAULT, buf1); + HDfree(buf1); + } /* end if */ + if(buf2) { + if(TRUE == H5Tdetect_class(mtype2_id, H5T_VLEN)) + H5Dvlen_reclaim(mtype2_id, space2_id, H5P_DEFAULT, buf2); + HDfree(buf2); + } /* end if */ + H5Tclose(ftype1_id); + H5Tclose(ftype2_id); + H5Tclose(mtype1_id); + H5Tclose(mtype2_id); + H5Sclose(space1_id); + H5Sclose(space2_id); + H5Aclose(attr1_id); + H5Aclose(attr2_id); + } H5E_END_TRY; + + options->err_stat = 1; + return nfound_total; } - -- cgit v0.12