Merge branch 'array_elt_size_zero' into 'main'

garray: Add more element_size > 0 checks

See merge request GNOME/glib!4695
This commit is contained in:
Philip Withnall
2025-07-17 08:48:25 +00:00
2 changed files with 31 additions and 3 deletions

View File

@@ -185,7 +185,7 @@ g_array_new_take (gpointer data,
g_return_val_if_fail (data != NULL || len == 0, NULL);
g_return_val_if_fail (len <= G_MAXUINT, NULL);
g_return_val_if_fail (element_size <= G_MAXUINT, NULL);
g_return_val_if_fail (element_size > 0 && element_size <= G_MAXUINT, NULL);
array = g_array_sized_new (FALSE, clear, element_size, 0);
rarray = (GRealArray *) array;
@@ -237,7 +237,7 @@ g_array_new_take_zero_terminated (gpointer data,
GArray *array;
gsize len = 0;
g_return_val_if_fail (element_size <= G_MAXUINT, NULL);
g_return_val_if_fail (element_size > 0 && element_size <= G_MAXUINT, NULL);
if (data != NULL)
{

View File

@@ -321,6 +321,21 @@ array_new_take_zero_terminated (void)
g_clear_pointer (&old_data_copy, g_free);
}
/* Check that zero terminated arrays with zero size elements are not allowed. */
static void
array_new_take_zero_terminated_zero_size (void)
{
gpointer str = g_strdup ("not null");
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"*assertion 'element_size > 0 && element_size <= G_MAXUINT' failed");
g_assert_null (
g_array_new_take_zero_terminated (str, FALSE, 0));
g_test_assert_expected_messages ();
g_free (str);
}
/* Check that a non-existing array becomes a zero-terminated one when requested. */
static void
array_new_take_zero_terminated_null (void)
@@ -358,13 +373,24 @@ array_new_take_overflow (void)
g_test_assert_expected_messages ();
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"*assertion 'element_size <= G_MAXUINT' failed");
"*assertion 'element_size > 0 && element_size <= G_MAXUINT' failed");
g_assert_null (
g_array_new_take (NULL, 0, FALSE, (gsize) G_MAXUINT + 1));
g_test_assert_expected_messages ();
#endif
}
/* Check that arrays with zero size elements are not allowed. */
static void
array_new_take_zero_size (void)
{
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"*assertion 'element_size > 0 && element_size <= G_MAXUINT' failed");
g_assert_null (
g_array_new_take (NULL, 0, FALSE, 0));
g_test_assert_expected_messages ();
}
/* Check g_array_steal() function */
static void
array_steal (void)
@@ -3241,7 +3267,9 @@ main (int argc, char *argv[])
g_test_add_func ("/array/new/take", array_new_take);
g_test_add_func ("/array/new/take/empty", array_new_take_empty);
g_test_add_func ("/array/new/take/overflow", array_new_take_overflow);
g_test_add_func ("/array/new/take/zero-size", array_new_take_zero_size);
g_test_add_func ("/array/new/take-zero-terminated", array_new_take_zero_terminated);
g_test_add_func ("/array/new/take-zero-terminated/zero-size", array_new_take_zero_terminated_zero_size);
g_test_add_func ("/array/new/take-zero-terminated/null", array_new_take_zero_terminated_null);
g_test_add_func ("/array/ref-count", array_ref_count);
g_test_add_func ("/array/steal", array_steal);