diff options
Diffstat (limited to 'hl')
-rw-r--r-- | hl/src/H5TB.c | 348 | ||||
-rw-r--r-- | hl/src/H5TBpublic.h | 4 |
2 files changed, 198 insertions, 154 deletions
diff --git a/hl/src/H5TB.c b/hl/src/H5TB.c index 8a77f13..0013e67 100644 --- a/hl/src/H5TB.c +++ b/hl/src/H5TB.c @@ -15,6 +15,7 @@ #include <stdlib.h> #include <string.h> +#include "H5private.h" #include "H5LTprivate.h" #include "H5TBprivate.h" @@ -663,7 +664,7 @@ herr_t H5TBwrite_fields_index( hid_t loc_id, hid_t m_sid=-1; hid_t file_space_id=-1; char *member_name; - hsize_t i, j; + hsize_t i; hid_t preserve_id; size_t size_native; @@ -688,14 +689,19 @@ herr_t H5TBwrite_fields_index( hid_t loc_id, /* iterate tru the members */ for ( i = 0; i < nfields; i++) { + unsigned j; + + /* Range check value */ + if(field_index[i] < 0) + goto out; - j = field_index[i]; + j = (unsigned)field_index[i]; /* get the member name */ - member_name = H5Tget_member_name( tid, (unsigned) j ); + member_name = H5Tget_member_name( tid, j ); /* get the member type */ - if (( member_type_id = H5Tget_member_type( tid, (unsigned) j )) < 0) + if (( member_type_id = H5Tget_member_type( tid, j )) < 0) goto out; /* convert to native type */ @@ -1149,7 +1155,7 @@ herr_t H5TBread_fields_index( hid_t loc_id, hid_t m_sid=-1; hsize_t mem_size[1]; size_t size_native; - hsize_t i, j; + hsize_t i; /* open the dataset. */ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0) @@ -1166,13 +1172,19 @@ herr_t H5TBread_fields_index( hid_t loc_id, /* iterate tru the members */ for ( i = 0; i < nfields; i++) { - j = field_index[i]; + unsigned j; + + /* Range check */ + if(field_index[i] < 0) + goto out; + + j = (unsigned)field_index[i]; /* get the member name */ - member_name = H5Tget_member_name( tid, (unsigned) j ); + member_name = H5Tget_member_name( tid, j ); /* get the member type */ - if (( member_type_id = H5Tget_member_type( tid, (unsigned) j )) < 0) + if (( member_type_id = H5Tget_member_type( tid, j )) < 0) goto out; /* get the member size */ @@ -1748,50 +1760,50 @@ out: * *------------------------------------------------------------------------- */ -herr_t H5TBcombine_tables( hid_t loc_id1, +herr_t H5TBcombine_tables(hid_t loc_id1, const char *dset_name1, hid_t loc_id2, const char *dset_name2, - const char *dset_name3 ) + const char *dset_name3) { - /* identifiers for the 1st dataset. */ - hid_t did_1=-1; - hid_t tid_1=-1; - hid_t sid_1=-1; - hid_t pid_1=-1; + hid_t did_1 = H5I_BADID; + hid_t tid_1 = H5I_BADID; + hid_t sid_1 = H5I_BADID; + hid_t pid_1 = H5I_BADID; /* identifiers for the 2nd dataset. */ - hid_t did_2=-1; - hid_t tid_2=-1; - hid_t sid_2=-1; - hid_t pid_2=-1; + hid_t did_2 = H5I_BADID; + hid_t tid_2 = H5I_BADID; + hid_t sid_2 = H5I_BADID; + hid_t pid_2 = H5I_BADID; /* identifiers for the 3rd dataset. */ - hid_t did_3=-1; - hid_t tid_3=-1; - hid_t sid_3=-1; - hid_t pid_3=-1; + hid_t did_3 = H5I_BADID; + hid_t tid_3 = H5I_BADID; + hid_t sid_3 = H5I_BADID; + hid_t pid_3 = H5I_BADID; + hid_t sid = H5I_BADID; + hid_t m_sid = H5I_BADID; + hid_t member_type_id = H5I_BADID; + hid_t attr_id = H5I_BADID; hsize_t count[1]; hsize_t offset[1]; - hid_t m_sid; hsize_t mem_size[1]; hsize_t nfields; hsize_t nrecords; hsize_t dims[1]; - hsize_t maxdims[1] = { H5S_UNLIMITED }; + hsize_t maxdims[1] = {H5S_UNLIMITED}; + hsize_t i; size_t type_size; - hid_t sid; - hid_t member_type_id; size_t member_offset; + size_t src_size; + size_t *src_offset = NULL; + size_t *src_sizes = NULL; char attr_name[255]; - hid_t attr_id; char aux[255]; - unsigned char *tmp_buf; - unsigned char *tmp_fill_buf; - hsize_t i; - size_t src_size; - size_t *src_offset; - size_t *src_sizes; - int has_fill=0; + unsigned char *tmp_buf = NULL; + unsigned char *tmp_fill_buf = NULL; + htri_t has_fill; + int ret_val = -1; /*------------------------------------------------------------------------- * first we get information about type size and offsets on disk @@ -1799,18 +1811,17 @@ herr_t H5TBcombine_tables( hid_t loc_id1, */ /* get the number of records and fields */ - if (H5TBget_table_info ( loc_id1, dset_name1, &nfields, &nrecords ) < 0) - return -1; - - src_offset = (size_t *)malloc((size_t)nfields * sizeof(size_t)); - src_sizes = (size_t *)malloc((size_t)nfields * sizeof(size_t)); + if(H5TBget_table_info(loc_id1, dset_name1, &nfields, &nrecords) < 0) + goto out; - if (src_offset == NULL ) - return -1; + if(NULL == (src_offset = (size_t *)HDmalloc((size_t)nfields * sizeof(size_t)))) + goto out; + if(NULL == (src_sizes = (size_t *)HDmalloc((size_t)nfields * sizeof(size_t)))) + goto out; /* get field info */ - if (H5TBget_field_info( loc_id1, dset_name1, NULL, src_sizes, src_offset, &src_size ) < 0) - return -1; + if(H5TBget_field_info(loc_id1, dset_name1, NULL, src_sizes, src_offset, &src_size) < 0) + goto out; /*------------------------------------------------------------------------- * get information about the first table @@ -1818,24 +1829,24 @@ herr_t H5TBcombine_tables( hid_t loc_id1, */ /* open the 1st dataset. */ - if ((did_1 = H5Dopen2(loc_id1, dset_name1, H5P_DEFAULT)) < 0) + if((did_1 = H5Dopen2(loc_id1, dset_name1, H5P_DEFAULT)) < 0) goto out; /* get the datatype */ - if ((tid_1 = H5Dget_type( did_1 )) < 0) + if((tid_1 = H5Dget_type(did_1)) < 0) goto out; /* get the dataspace handle */ - if ((sid_1 = H5Dget_space( did_1 )) < 0) + if((sid_1 = H5Dget_space(did_1)) < 0) goto out; /* get creation properties list */ - if ((pid_1 = H5Dget_create_plist( did_1 )) < 0) + if((pid_1 = H5Dget_create_plist(did_1)) < 0) goto out; /* get the dimensions */ - if (H5TBget_table_info ( loc_id1, dset_name1, &nfields, &nrecords ) < 0) - return -1; + if(H5TBget_table_info(loc_id1, dset_name1, &nfields, &nrecords) < 0) + goto out; /*------------------------------------------------------------------------- * make the merged table with no data originally @@ -1843,11 +1854,11 @@ herr_t H5TBcombine_tables( hid_t loc_id1, */ /* clone the property list */ - if ((pid_3 = H5Pcopy(pid_1)) < 0) + if((pid_3 = H5Pcopy(pid_1)) < 0) goto out; /* clone the type id */ - if ((tid_3 = H5Tcopy(tid_1)) < 0) + if((tid_3 = H5Tcopy(tid_1)) < 0) goto out; /*------------------------------------------------------------------------- @@ -1858,96 +1869,97 @@ herr_t H5TBcombine_tables( hid_t loc_id1, dims[0] = 0; /* create a simple data space with unlimited size */ - if ((sid_3 = H5Screate_simple(1, dims, maxdims)) < 0) - return -1; + if((sid_3 = H5Screate_simple(1, dims, maxdims)) < 0) + goto out; /* create the dataset */ - if ((did_3 = H5Dcreate2(loc_id1, dset_name3, tid_3, sid_3, H5P_DEFAULT, pid_3, H5P_DEFAULT)) < 0) + if((did_3 = H5Dcreate2(loc_id1, dset_name3, tid_3, sid_3, H5P_DEFAULT, pid_3, H5P_DEFAULT)) < 0) goto out; /*------------------------------------------------------------------------- * attach the conforming table attributes *------------------------------------------------------------------------- */ - if (H5TB_attach_attributes("Merge table", loc_id1, dset_name3, nfields, tid_3) < 0) + if(H5TB_attach_attributes("Merge table", loc_id1, dset_name3, nfields, tid_3) < 0) goto out; /*------------------------------------------------------------------------- * get attributes *------------------------------------------------------------------------- */ - type_size = H5Tget_size(tid_3); /* alloc fill value attribute buffer */ - tmp_fill_buf = (unsigned char *)malloc(type_size); + if(NULL == (tmp_fill_buf = (unsigned char *)HDmalloc(type_size))) + goto out; /* get the fill value attributes */ - has_fill = H5TBAget_fill(loc_id1, dset_name1, did_1, tmp_fill_buf); + if((has_fill = H5TBAget_fill(loc_id1, dset_name1, did_1, tmp_fill_buf)) < 0) + goto out; /*------------------------------------------------------------------------- * attach the fill attributes from previous table *------------------------------------------------------------------------- */ - if (has_fill == 1 ) - { + if(has_fill) { - if (( sid = H5Screate(H5S_SCALAR)) < 0) + if((sid = H5Screate(H5S_SCALAR)) < 0) goto out; - for ( i = 0; i < nfields; i++) - { - + for(i = 0; i < nfields; i++) { /* get the member type */ - if (( member_type_id = H5Tget_member_type( tid_3, (unsigned) i )) < 0) + if((member_type_id = H5Tget_member_type(tid_3, (unsigned)i)) < 0) goto out; /* get the member offset */ member_offset = H5Tget_member_offset(tid_3, (unsigned)i); - strcpy(attr_name, "FIELD_"); - sprintf(aux, "%d", (int)i); - strcat(attr_name, aux); - sprintf(aux, "%s", "_FILL"); - strcat(attr_name, aux); + HDstrncpy(attr_name, "FIELD_", 6); + HDsnprintf(aux, 12, "%d", (int)i); + HDstrncat(attr_name, aux, 12); + HDsnprintf(aux, 6, "%s", "_FILL"); + HDstrncat(attr_name, aux, 7); - if ((attr_id = H5Acreate2(did_3, attr_name, member_type_id, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) + if((attr_id = H5Acreate2(did_3, attr_name, member_type_id, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) goto out; - if (H5Awrite(attr_id, member_type_id, tmp_fill_buf+member_offset) < 0) + if(H5Awrite(attr_id, member_type_id, tmp_fill_buf + member_offset) < 0) goto out; - if (H5Aclose(attr_id) < 0) + if(H5Aclose(attr_id) < 0) goto out; + attr_id = H5I_BADID; - if (H5Tclose(member_type_id) < 0) + if(H5Tclose(member_type_id) < 0) goto out; + member_type_id = H5I_BADID; } /* close data space. */ - if (H5Sclose( sid ) < 0) + if(H5Sclose(sid) < 0) goto out; + sid = H5I_BADID; } /*------------------------------------------------------------------------- * read data from 1st table *------------------------------------------------------------------------- */ - - tmp_buf = (unsigned char *)calloc((size_t) nrecords, type_size ); + if(NULL == (tmp_buf = (unsigned char *)HDcalloc((size_t)nrecords, type_size))) + goto out; /* define a hyperslab in the dataset of the size of the records */ offset[0] = 0; count[0] = nrecords; - if (H5Sselect_hyperslab( sid_1, H5S_SELECT_SET, offset, NULL, count, NULL) < 0) + if(H5Sselect_hyperslab(sid_1, H5S_SELECT_SET, offset, NULL, count, NULL) < 0) goto out; /* create a memory dataspace handle */ mem_size[0] = count[0]; - if ((m_sid = H5Screate_simple( 1, mem_size, NULL )) < 0) + if((m_sid = H5Screate_simple(1, mem_size, NULL)) < 0) goto out; - if (H5Dread( did_1, tid_1, m_sid, sid_1, H5P_DEFAULT, tmp_buf ) < 0) + if(H5Dread(did_1, tid_1, m_sid, sid_1, H5P_DEFAULT, tmp_buf) < 0) goto out; /*------------------------------------------------------------------------- @@ -1956,27 +1968,32 @@ herr_t H5TBcombine_tables( hid_t loc_id1, */ /* append the records to the new table */ - if (H5TBappend_records( loc_id1, dset_name3, nrecords, src_size, src_offset, src_sizes, tmp_buf ) < 0) + if(H5TBappend_records(loc_id1, dset_name3, nrecords, src_size, src_offset, src_sizes, tmp_buf) < 0) goto out; /*------------------------------------------------------------------------- * release resources from 1st table *------------------------------------------------------------------------- */ - - if (H5Sclose( m_sid ) < 0) + if(H5Sclose(m_sid) < 0) goto out; - if(H5Sclose( sid_1 ) < 0) + m_sid = H5I_BADID; + if(H5Sclose(sid_1) < 0) goto out; - if(H5Tclose( tid_1 ) < 0) + sid_1 = H5I_BADID; + if(H5Tclose(tid_1) < 0) goto out; - if(H5Pclose( pid_1 ) < 0) + tid_1 = H5I_BADID; + if(H5Pclose(pid_1) < 0) goto out; - if(H5Dclose( did_1 ) < 0) + pid_1 = H5I_BADID; + if(H5Dclose(did_1) < 0) goto out; + did_1 = H5I_BADID; /* Release resources. */ - free( tmp_buf ); + free(tmp_buf); + tmp_buf = NULL; /*------------------------------------------------------------------------- * get information about the 2nd table @@ -1984,44 +2001,45 @@ herr_t H5TBcombine_tables( hid_t loc_id1, */ /* open the dataset. */ - if ((did_2 = H5Dopen2(loc_id2, dset_name2, H5P_DEFAULT)) < 0) + if((did_2 = H5Dopen2(loc_id2, dset_name2, H5P_DEFAULT)) < 0) goto out; /* get the datatype */ - if ((tid_2 = H5Dget_type( did_2 )) < 0) + if((tid_2 = H5Dget_type(did_2)) < 0) goto out; /* get the dataspace handle */ - if ((sid_2 = H5Dget_space( did_2 )) < 0) + if((sid_2 = H5Dget_space(did_2)) < 0) goto out; /* get the property list handle */ - if ((pid_2 = H5Dget_create_plist( did_2 )) < 0) + if((pid_2 = H5Dget_create_plist(did_2)) < 0) goto out; /* get the dimensions */ - if (H5TBget_table_info ( loc_id2, dset_name2, &nfields, &nrecords ) < 0) - return -1; + if(H5TBget_table_info(loc_id2, dset_name2, &nfields, &nrecords) < 0) + goto out; /*------------------------------------------------------------------------- * read data from 2nd table *------------------------------------------------------------------------- */ - tmp_buf = (unsigned char *)calloc((size_t) nrecords, type_size ); + if(NULL == (tmp_buf = (unsigned char *)HDcalloc((size_t)nrecords, type_size))) + goto out; /* define a hyperslab in the dataset of the size of the records */ offset[0] = 0; count[0] = nrecords; - if (H5Sselect_hyperslab( sid_2, H5S_SELECT_SET, offset, NULL, count, NULL) < 0) + if(H5Sselect_hyperslab(sid_2, H5S_SELECT_SET, offset, NULL, count, NULL) < 0) goto out; /* create a memory dataspace handle */ mem_size[0] = count[0]; - if ((m_sid = H5Screate_simple( 1, mem_size, NULL )) < 0) + if((m_sid = H5Screate_simple(1, mem_size, NULL)) < 0) goto out; - if (H5Dread( did_2, tid_2, m_sid, sid_2, H5P_DEFAULT, tmp_buf ) < 0) + if(H5Dread(did_2, tid_2, m_sid, sid_2, H5P_DEFAULT, tmp_buf) < 0) goto out; /*------------------------------------------------------------------------- @@ -2030,7 +2048,7 @@ herr_t H5TBcombine_tables( hid_t loc_id1, */ /* append the records to the new table */ - if (H5TBappend_records( loc_id1, dset_name3, nrecords, src_size, src_offset, src_sizes, tmp_buf ) < 0) + if(H5TBappend_records(loc_id1, dset_name3, nrecords, src_size, src_offset, src_sizes, tmp_buf) < 0) goto out; /*------------------------------------------------------------------------- @@ -2038,58 +2056,88 @@ herr_t H5TBcombine_tables( hid_t loc_id1, *------------------------------------------------------------------------- */ - if (H5Sclose( m_sid ) < 0) + if(H5Sclose(m_sid) < 0) goto out; - if (H5Sclose( sid_2 ) < 0) + m_sid = H5I_BADID; + if(H5Sclose(sid_2) < 0) goto out; - if (H5Tclose( tid_2 ) < 0) - return -1; - if (H5Pclose( pid_2 ) < 0) + sid_2 = H5I_BADID; + if(H5Tclose(tid_2) < 0) goto out; - if (H5Dclose( did_2 ) < 0) - return -1; + tid_2 = H5I_BADID; + if(H5Pclose(pid_2) < 0) + goto out; + pid_2 = H5I_BADID; + if(H5Dclose(did_2) < 0) + goto out; + did_2 = H5I_BADID; /*------------------------------------------------------------------------- * release resources from 3rd table *------------------------------------------------------------------------- */ - if (H5Sclose( sid_3 ) < 0) - return -1; - if (H5Tclose( tid_3 ) < 0) - return -1; - if (H5Pclose( pid_3 ) < 0) - return -1; - if (H5Dclose( did_3 ) < 0) - return -1; - - /* Release resources. */ - free( tmp_buf ); - free( tmp_fill_buf ); - free( src_offset ); - free( src_sizes ); + if(H5Sclose(sid_3) < 0) + goto out; + sid_3 = H5I_BADID; + if(H5Tclose(tid_3) < 0) + goto out; + tid_3 = H5I_BADID; + if(H5Pclose(pid_3) < 0) + goto out; + pid_3 = H5I_BADID; + if(H5Dclose(did_3) < 0) + goto out; + did_3 = H5I_BADID; - return 0; + ret_val = 0; - /* error zone */ out: - H5E_BEGIN_TRY - { - H5Dclose(did_1); - H5Sclose(sid_1); - H5Tclose(tid_1); - H5Pclose(pid_1); - H5Dclose(did_2); - H5Sclose(sid_2); - H5Tclose(tid_2); - H5Pclose(pid_2); - H5Dclose(did_3); - H5Sclose(sid_3); - H5Tclose(tid_3); - H5Pclose(pid_3); + if(tmp_buf) + free(tmp_buf); + if(tmp_fill_buf) + free(tmp_fill_buf); + if(src_offset) + free(src_offset); + if(src_sizes) + free(src_sizes); + + H5E_BEGIN_TRY { + if(member_type_id > 0) + H5Tclose(member_type_id); + if(attr_id > 0) + H5Aclose(attr_id); + if(sid > 0) + H5Sclose(sid); + if(m_sid > 0) + H5Sclose(m_sid); + if(pid_1 > 0) + H5Pclose(pid_1); + if(tid_1 > 0) + H5Tclose(tid_1); + if(sid_1 > 0) + H5Sclose(sid_1); + if(did_1 > 0) + H5Dclose(did_1); + if(pid_2 > 0) + H5Pclose(pid_2); + if(tid_2 > 0) + H5Tclose(tid_2); + if(sid_2 > 0) + H5Sclose(sid_2); + if(did_2 > 0) + H5Dclose(did_2); + if(pid_3 > 0) + H5Pclose(pid_3); + if(tid_3 > 0) + H5Tclose(tid_3); + if(sid_3 > 0) + H5Sclose(sid_3); + if(did_3 > 0) + H5Dclose(did_3); } H5E_END_TRY; - return -1; + return ret_val; } /*------------------------------------------------------------------------- @@ -2581,7 +2629,7 @@ herr_t H5TBdelete_field( hid_t loc_id, size_t member_offset; hid_t attr_id; hsize_t i; - int has_fill=0; + htri_t has_fill = 0; /* get the number of records and fields */ if (H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords ) < 0) @@ -3017,7 +3065,7 @@ herr_t H5TBAget_title( hid_t loc_id, * * Purpose: Read the table attribute fill values * -* Return: Success: 0, Failure: -1 +* Return: Success: TRUE/FALSE, Failure: -1 * * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu * @@ -3029,12 +3077,10 @@ herr_t H5TBAget_title( hid_t loc_id, * *------------------------------------------------------------------------- */ - - -herr_t H5TBAget_fill( hid_t loc_id, +htri_t H5TBAget_fill(hid_t loc_id, const char *dset_name, hid_t dset_id, - unsigned char *dst_buf ) + unsigned char *dst_buf) { hsize_t nfields; @@ -3149,9 +3195,7 @@ herr_t H5TBget_table_info ( hid_t loc_id, */ if (nfields) - { - *nfields = num_members; - } + *nfields = (hsize_t)num_members; /*------------------------------------------------------------------------- @@ -3331,19 +3375,19 @@ int H5TB_find_field( const char *field, const char *field_list ) const char *start = field_list; const char *end; - while ( (end = strstr( start, "," )) != 0 ) + while ( (end = HDstrstr( start, "," )) != 0 ) { - size_t count = end - start; - if(strncmp(start, field, count) == 0 && count == strlen(field) ) + ptrdiff_t count = end - start; + + if(HDstrncmp(start, field, count) == 0 && count == HDstrlen(field) ) return 1; start = end + 1; } - if(strcmp( start, field ) == 0 ) + if(HDstrcmp( start, field ) == 0 ) return 1; return -1; - } diff --git a/hl/src/H5TBpublic.h b/hl/src/H5TBpublic.h index 4dd17bb..874ef20 100644 --- a/hl/src/H5TBpublic.h +++ b/hl/src/H5TBpublic.h @@ -219,10 +219,10 @@ H5_HLDLL herr_t H5TBdelete_field( hid_t loc_id, H5_HLDLL herr_t H5TBAget_title( hid_t loc_id, char *table_title ); -H5_HLDLL herr_t H5TBAget_fill( hid_t loc_id, +H5_HLDLL htri_t H5TBAget_fill(hid_t loc_id, const char *dset_name, hid_t dset_id, - unsigned char *dst_buf ); + unsigned char *dst_buf); #ifdef __cplusplus } |