Skip to content

Commit

Permalink
err: clear flags better when clearing errors.
Browse files Browse the repository at this point in the history
An attempt to clear an error with malloced data didn't clear the flags.
Now it clears all flags except the malloced flag.

Fixes openssl#12530
  • Loading branch information
paulidale committed Jun 9, 2021
1 parent 4bf696c commit f8df23c
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 0 deletions.
1 change: 1 addition & 0 deletions crypto/err/err_local.h
Expand Up @@ -27,6 +27,7 @@ static ossl_inline void err_clear_data(ERR_STATE *es, size_t i, int deall)
es->err_data_flags[i] = 0;
} else if (es->err_data[i] != NULL) {
es->err_data[i][0] = '\0';
es->err_data_flags[i] = ERR_TXT_MALLOCED;
}
} else {
es->err_data[i] = NULL;
Expand Down
48 changes: 48 additions & 0 deletions test/errtest.c
Expand Up @@ -287,6 +287,53 @@ static int test_marks(void)
return 1;
}

static int test_clear_error(void)
{
int flags = -1;
const char *data = NULL;
int res = 0;

/* Raise an error with data and clear it */
ERR_raise_data(0, 0, "hello %s", "world");
ERR_peek_error_data(&data, &flags);
if (!TEST_str_eq(data, "hello world")
|| !TEST_int_eq(flags, ERR_TXT_STRING | ERR_TXT_MALLOCED))
goto err;
ERR_clear_error();

/* Raise a new error without data */
ERR_raise(0, 0);
ERR_peek_error_data(&data, &flags);
if (!TEST_str_eq(data, "")
|| !TEST_int_eq(flags, ERR_TXT_MALLOCED))
goto err;
ERR_clear_error();

/* Raise a new error with data */
ERR_raise_data(0, 0, "goodbye %s world", "cruel");
ERR_peek_error_data(&data, &flags);
if (!TEST_str_eq(data, "goodbye cruel world")
|| !TEST_int_eq(flags, ERR_TXT_STRING | ERR_TXT_MALLOCED))
goto err;
ERR_clear_error();

/*
* Raise a new error without data to check that the malloced storage
* is freed properly
*/
ERR_raise(0, 0);
ERR_peek_error_data(&data, &flags);
if (!TEST_str_eq(data, "")
|| !TEST_int_eq(flags, ERR_TXT_MALLOCED))
goto err;
ERR_clear_error();

res = 1;
err:
ERR_clear_error();
return res;
}

int setup_tests(void)
{
ADD_TEST(preserves_system_error);
Expand All @@ -296,5 +343,6 @@ int setup_tests(void)
ADD_TEST(test_print_error_format);
#endif
ADD_TEST(test_marks);
ADD_TEST(test_clear_error);
return 1;
}

0 comments on commit f8df23c

Please sign in to comment.