[svn-r18269] Bug fix for #1732 - The library had segmentation fault when tools call H5Close() after trying

to open corrupted files.  The problem turned out to be some memory leak when the library 
failed to open the file.  The solution is simply moving some code around to their proper 
places - moving H5AC_unpin_entry(f->shared->sblock) in H5F_dest of H5F.c and moving 
H5G_name_free(root_loc.path) in H5G_mkroot of H5Groot.c.

Tested on jam.  Tested the same change for 1.8.

M    src/H5F.c
M    src/H5Groot.c
This commit is contained in:
Raymond Lu 2010-02-17 12:45:37 -05:00
parent ad9e876b0c
commit 88c6921300
2 changed files with 6 additions and 4 deletions

View File

@ -1001,14 +1001,16 @@ H5F_dest(H5F_t *f, hid_t dxpl_id)
/* Push error, but keep going*/
HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release file free space info")
} /* end if */
} /* end if */
/* Unpin the superblock, since we're about to destroy the cache */
/* Unpin the superblock, since we're about to destroy the cache */
if(f->shared->sblock) {
if(H5AC_unpin_entry(f->shared->sblock) < 0)
/* Push error, but keep going*/
HDONE_ERROR(H5E_FSPACE, H5E_CANTUNPIN, FAIL, "unable to unpin superblock")
f->shared->sblock = NULL;
} /* end if */
}
/* Remove shared file struct from list of open files */
if(H5F_sfile_remove(f->shared) < 0)
/* Push error, but keep going*/

View File

@ -250,13 +250,13 @@ done:
* allocated */
if(ret_value < 0) {
if(f->shared->root_grp) {
H5G_name_free(root_loc.path);
if(f->shared->root_grp->shared)
f->shared->root_grp->shared = H5FL_FREE(H5G_shared_t, f->shared->root_grp->shared);
f->shared->root_grp = H5FL_FREE(H5G_t, f->shared->root_grp);
} /* end if */
if(f->shared->sblock)
f->shared->sblock->root_ent = (H5G_entry_t *)H5MM_xfree(f->shared->sblock->root_ent);
H5G_name_free(root_loc.path);
} /* end if */
/* Mark superblock dirty in cache, if necessary */