diff options
Diffstat (limited to 'libcrystfel/src')
-rw-r--r-- | libcrystfel/src/hdf5-file.c | 52 |
1 files changed, 41 insertions, 11 deletions
diff --git a/libcrystfel/src/hdf5-file.c b/libcrystfel/src/hdf5-file.c index 720f6e0f..e7b6eed4 100644 --- a/libcrystfel/src/hdf5-file.c +++ b/libcrystfel/src/hdf5-file.c @@ -1926,7 +1926,10 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name, } dh = H5Dopen2(f->fh, subst_name, H5P_DEFAULT); - if ( dh < 0 ) return NULL; + if ( dh < 0 ) { + free(subst_name); + return NULL; + } type = H5Dget_type(dh); class = H5Tget_class(type); @@ -1938,6 +1941,8 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name, v = H5Tis_variable_str(type); if ( v < 0 ) { + H5Tclose(type); + free(subst_name); return "WTF?"; } @@ -1946,9 +1951,13 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name, r = H5Dread(dh, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, &tmp); if ( r < 0 ) { - tmp = NULL; + H5Tclose(type); + free(subst_name); + return NULL; } + return tmp; + } else { size = H5Tget_size(type); @@ -1957,9 +1966,11 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name, sh = H5Screate(H5S_SCALAR); r = H5Dread(dh, type, sh, sh, H5P_DEFAULT, tmp); + H5Sclose(sh); if ( r < 0 ) { free(tmp); - tmp = NULL; + free(subst_name); + return NULL; } else { /* Two possibilities: @@ -1968,17 +1979,20 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name, * Make sure things are done properly... */ tmp[size] = '\0'; chomp(tmp); + H5Dclose(dh); + free(subst_name); + return tmp; } - H5Sclose(sh); - } - } else { int r; + H5Dclose(dh); + H5Tclose(type); + switch ( class ) { case H5T_FLOAT : @@ -1986,7 +2000,15 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name, H5T_NATIVE_DOUBLE); if ( r == 0 ) { tmp = malloc(256); + if ( tmp == NULL ) { + ERROR("Failed to allocate float\n"); + return NULL; + } snprintf(tmp, 255, "%f", buf_f); + return tmp; + } else { + ERROR("Failed to read value\n"); + return NULL; } break; @@ -1995,17 +2017,25 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name, H5T_NATIVE_INT); if ( r == 0 ) { tmp = malloc(256); + if ( tmp == NULL ) { + ERROR("Failed to allocate int buf!\n"); + return NULL; + } snprintf(tmp, 255, "%d", buf_i); + return tmp; + + } else { + ERROR("Failed to read value\n"); + return NULL; } break; + + default : + ERROR("Don't know what to do!\n"); + return NULL; } } - - H5Tclose(type); - H5Dclose(dh); - free(subst_name); - return tmp; } |