mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-03-19 16:50:46 +08:00
Use internal version of H5Eprint2 to avoid possible stack overflow (#661)
This commit is contained in:
parent
2c5d08d84d
commit
ee9d6f514a
35
src/H5E.c
35
src/H5E.c
@ -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);
|
||||
|
||||
/*********************/
|
||||
@ -326,10 +327,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;
|
||||
@ -1447,13 +1448,37 @@ done:
|
||||
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
|
||||
@ -1473,8 +1498,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
|
||||
|
@ -228,16 +228,14 @@ test_error_compat(void)
|
||||
if ((sid = 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;
|
||||
|
||||
@ -282,12 +280,12 @@ test_error_compat(void)
|
||||
if (did >= 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)
|
||||
@ -305,7 +303,7 @@ test_error_compat(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
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user