hdf5/test/del_many_dense_attrs.c
Sean McBride 4ac6ccc021
Snprintf2 (#1399)
* Replaced many uses of sprintf with safer snprintf

Many very straightforward, but in a few cases added a length parameter to some private functions, because buffer length was otherwise unknowable.

* Removed unnecessary use of static on small buffers

This improves thread safety.

* Committing clang-format changes

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
2022-01-28 16:43:48 -06:00

202 lines
6.0 KiB
C

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the COPYING file, which can be found at the root of the source code *
* distribution tree, or in https://www.hdfgroup.org/licenses. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* Purpose: Test to verify that the infinite loop closing library/abort failure
* is fixed when the application creates and removes dense attributes
* (See HDFFV-10659).
*/
#include "h5test.h"
/* The test file name */
const char *FILENAME[] = {"del_many_dense_attrs", NULL};
#define ATTR_COUNT 64 /* The number of attributes */
/*-------------------------------------------------------------------------
* Function: catch_signal
*
* Purpose: The signal handler to catch the SIGABRT signal.
*
* Return: No return
*
* Programmer: Vailin Choi
*
*-------------------------------------------------------------------------
*/
static void
catch_signal(int H5_ATTR_UNUSED signo)
{
HDexit(EXIT_FAILURE);
} /* catch_signal() */
/*-------------------------------------------------------------------------
* Function: main
*
* Purpose: Test to verify that the infinite loop closing library/abort failure
* is fixed when the application creates and removes dense attributes
* (See HDFFV-10659).
*
* Return: Success: exit(EXIT_SUCCESS)
* Failure: exit(EXIT_FAILURE)
*
* Programmer: Vailin Choi; Dec 2018
*
*-------------------------------------------------------------------------
*/
int
main(void)
{
hid_t fid = -1; /* HDF5 File ID */
hid_t gid = -1; /* Group ID */
hid_t sid = -1; /* Dataspace ID */
hid_t aid = -1; /* Attribute ID */
hid_t tid = -1; /* Datatype ID */
hid_t fapl = -1; /* File access property lists */
hid_t gcpl = -1; /* Group creation property list */
char aname[50]; /* Name of attribute */
const char *basename = "attr"; /* Name prefix for attribute */
char filename[100]; /* File name */
int i; /* Local index variable */
/* Testing setup */
h5_reset();
/* To exit from the file for SIGABRT signal */
if (HDsignal(SIGABRT, catch_signal) == SIG_ERR)
TEST_ERROR
fapl = h5_fileaccess();
h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
/* Set to latest format */
if (H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
TEST_ERROR
/* Create the file */
if ((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR
/* Close the file */
if (H5Fclose(fid) < 0)
TEST_ERROR
/* Re-open the file */
if ((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
TEST_ERROR
/* Create the group creation property list */
if ((gcpl = H5Pcreate(H5P_GROUP_CREATE)) < 0)
TEST_ERROR
/* Set to use dense storage for all attributes on the group */
if (H5Pset_attr_phase_change(gcpl, 0, 0) < 0)
TEST_ERROR
/* Create the group in the file */
if ((gid = H5Gcreate2(fid, "group", H5P_DEFAULT, gcpl, H5P_DEFAULT)) < 0)
TEST_ERROR
/* Create dataspace */
if ((sid = H5Screate(H5S_SCALAR)) < 0)
TEST_ERROR
/* Get a copy of the datatype */
if ((tid = H5Tcopy(H5T_NATIVE_FLOAT)) < 0)
TEST_ERROR
/* Create attributes in the group */
for (i = ATTR_COUNT; i >= 0; i--) {
/* Set up the attribute name */
HDsnprintf(aname, sizeof(aname), "%s%d", basename, i);
/* Create the attribute */
if ((aid = H5Acreate2(gid, aname, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR
/* Write to the attribute */
if (H5Awrite(aid, tid, &i) < 0)
TEST_ERROR
/* Close the attribute */
if (H5Aclose(aid) < 0)
TEST_ERROR
}
/* Close the datatype */
if (H5Tclose(tid) < 0)
TEST_ERROR
/* Close the dataspace */
if (H5Sclose(sid) < 0)
TEST_ERROR
/* Close the group */
if (H5Gclose(gid) < 0)
TEST_ERROR
/* Close the group creation property list */
if (H5Pclose(gcpl) < 0)
TEST_ERROR
/* Close the file */
if (H5Fclose(fid) < 0)
TEST_ERROR
/* Re-open the file */
if ((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
TEST_ERROR
/* Open the group */
if ((gid = H5Gopen2(fid, "group", H5P_DEFAULT)) < 0)
TEST_ERROR
/* Delete the attributes */
for (i = 0; i <= ATTR_COUNT; i++) {
/* Set up the attribute name */
HDsnprintf(aname, sizeof(aname), "%s%d", basename, i);
/* Delete the attribute */
if (H5Adelete(gid, aname) < 0)
TEST_ERROR
} /* end for */
/* Close the group */
if (H5Gclose(gid) < 0)
TEST_ERROR
/* Close the file */
if (H5Fclose(fid) < 0)
TEST_ERROR
h5_cleanup(FILENAME, fapl);
return (EXIT_SUCCESS);
error:
H5E_BEGIN_TRY
{
H5Gclose(gid);
H5Sclose(sid);
H5Tclose(tid);
H5Aclose(aid);
H5Fclose(fid);
H5Pclose(gcpl);
H5Pclose(fapl);
}
H5E_END_TRY
return EXIT_FAILURE;
}