Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use internal version of H5Eprint2 to avoid possible stack overflow #661

Merged
merged 1 commit into from
May 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 30 additions & 5 deletions src/H5E.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ static H5E_t * H5E__get_current_stack(void);
static herr_t H5E__set_current_stack(H5E_t *estack);
static herr_t H5E__close_stack(H5E_t *err_stack, void **request);
static ssize_t H5E__get_num(const H5E_t *err_stack);
static herr_t H5E__print2(hid_t err_stack, FILE *stream);
static herr_t H5E__append_stack(H5E_t *dst_estack, const H5E_t *src_stack);

/*********************/
Expand Down Expand Up @@ -312,10 +313,10 @@ H5E__set_default_auto(H5E_t *stk)
#endif /* H5_USE_16_API_DEFAULT */

stk->auto_op.func1 = stk->auto_op.func1_default = (H5E_auto1_t)H5Eprint1;
stk->auto_op.func2 = stk->auto_op.func2_default = (H5E_auto2_t)H5Eprint2;
stk->auto_op.func2 = stk->auto_op.func2_default = (H5E_auto2_t)H5E__print2;
stk->auto_op.is_default = TRUE;
#else /* H5_NO_DEPRECATED_SYMBOLS */
stk->auto_op.func2 = (H5E_auto2_t)H5Eprint2;
stk->auto_op.func2 = (H5E_auto2_t)H5E__print2;
#endif /* H5_NO_DEPRECATED_SYMBOLS */

stk->auto_data = NULL;
Expand Down Expand Up @@ -1433,13 +1434,37 @@ H5Eclear2(hid_t err_stack)
herr_t
H5Eprint2(hid_t err_stack, FILE *stream)
{
H5E_t *estack; /* Error stack to operate on */
herr_t ret_value = SUCCEED; /* Return value */

/* Don't clear the error stack! :-) */
FUNC_ENTER_API_NOCLEAR(FAIL)
/*NO TRACE*/

/* Print error stack */
if ((ret_value = H5E__print2(err_stack, stream)) < 0)
HGOTO_ERROR(H5E_ERROR, H5E_CANTLIST, FAIL, "can't display error stack")

done:
FUNC_LEAVE_API(ret_value)
} /* end H5Eprint2() */

/*-------------------------------------------------------------------------
* Function: H5E__print2
*
* Purpose: Internal helper routine for H5Eprint2.
*
* Return: Non-negative on success/Negative on failure
*
*-------------------------------------------------------------------------
*/
static herr_t
H5E__print2(hid_t err_stack, FILE *stream)
{
H5E_t *estack; /* Error stack to operate on */
herr_t ret_value = SUCCEED; /* Return value */

FUNC_ENTER_STATIC

/* Need to check for errors */
if (err_stack == H5E_DEFAULT) {
if (NULL == (estack = H5E__get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in
Expand All @@ -1459,8 +1484,8 @@ H5Eprint2(hid_t err_stack, FILE *stream)
HGOTO_ERROR(H5E_ERROR, H5E_CANTLIST, FAIL, "can't display error stack")

done:
FUNC_LEAVE_API(ret_value)
} /* end H5Eprint2() */
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5E__print2() */

/*-------------------------------------------------------------------------
* Function: H5Ewalk2
Expand Down
16 changes: 7 additions & 9 deletions test/err_compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -238,16 +238,14 @@ test_error1(void)
if ((space = H5Screate_simple(2, dims, NULL)) < 0)
TEST_ERROR;

/* Use H5Eget_auto2 to query the default printing function. The library
*should indicate H5Eprint2 as the default. */
/* Use H5Eget_auto2 to query the default printing function. */
if (H5Eget_auto2(H5E_DEFAULT, &old_func2, &old_data) < 0)
TEST_ERROR;
if (old_data != NULL)
TEST_ERROR;
if (!old_func2 || (H5E_auto2_t)H5Eprint2 != old_func2)
if (old_func2 == NULL)
TEST_ERROR;

/* This function sets the default printing function to be H5Eprint2. */
if (H5Eset_auto2(H5E_DEFAULT, old_func2, old_data) < 0)
TEST_ERROR;

Expand Down Expand Up @@ -292,12 +290,12 @@ test_error1(void)
if (dataset >= 0)
TEST_ERROR;

/* This function changes the new-style printing function back to the default H5Eprint2. */
if (H5Eset_auto2(H5E_DEFAULT, (H5E_auto2_t)H5Eprint2, NULL) < 0)
/* This function changes the new-style printing function to the original. */
if (H5Eset_auto2(H5E_DEFAULT, old_func2, NULL) < 0)
TEST_ERROR;

/* This call should work because the H5Eset_auto2 above restored the default printing
* function H5Eprint2. It simply returns user_print1. */
/* This call should work because the H5Eset_auto2 above set the default printing
* function to H5Eprint2. It simply returns user_print1. */
if ((ret = H5Eget_auto1(&old_func1, &old_data)) < 0)
TEST_ERROR;
if (old_data != NULL)
Expand All @@ -315,7 +313,7 @@ test_error1(void)
TEST_ERROR;
if (old_data != NULL)
TEST_ERROR;
if (!old_func2 || (H5E_auto2_t)H5Eprint2 != old_func2)
if (old_func2 == NULL)
TEST_ERROR;

/* Try the printing function. Dataset creation should fail because the file
Expand Down
2 changes: 1 addition & 1 deletion test/error_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ test_error(hid_t file)
TEST_ERROR;
if (old_data != NULL)
TEST_ERROR;
if (old_func != (H5E_auto2_t)H5Eprint2)
if (old_func == NULL)
TEST_ERROR;

if (H5Eset_auto2(H5E_DEFAULT, NULL, NULL) < 0)
Expand Down