mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-09-28 18:16:34 +02:00
garray: Fix g_ptr_array_insert() with indices > G_MAXINT
While an index greater than `G_MAXINT` can’t be passed to `g_ptr_array_insert()`, `-1` can be — and if that’s done with an array which has more than `G_MAXINT` elements in it, the new element will be inserted part-way through the array rather than being appended. Spotted by building with `-Wsign-conversion`. Signed-off-by: Philip Withnall <pwithnall@gnome.org> Helps: #3405
This commit is contained in:
@@ -2338,23 +2338,23 @@ g_ptr_array_insert (GPtrArray *array,
|
|||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
GRealPtrArray *rarray = (GRealPtrArray *)array;
|
GRealPtrArray *rarray = (GRealPtrArray *)array;
|
||||||
|
guint real_index;
|
||||||
|
|
||||||
g_return_if_fail (rarray);
|
g_return_if_fail (rarray);
|
||||||
g_return_if_fail (index_ >= -1);
|
g_return_if_fail (index_ >= -1);
|
||||||
g_return_if_fail (index_ <= (gint)rarray->len);
|
g_return_if_fail (index_ < 0 || (guint) index_ <= rarray->len);
|
||||||
|
|
||||||
g_ptr_array_maybe_expand (rarray, 1u + rarray->null_terminated);
|
g_ptr_array_maybe_expand (rarray, 1u + rarray->null_terminated);
|
||||||
|
|
||||||
if (index_ < 0)
|
real_index = (index_ >= 0) ? (guint) index_ : rarray->len;
|
||||||
index_ = rarray->len;
|
|
||||||
|
|
||||||
if ((guint) index_ < rarray->len)
|
if (real_index < rarray->len)
|
||||||
memmove (&(rarray->pdata[index_ + 1]),
|
memmove (&(rarray->pdata[real_index + 1]),
|
||||||
&(rarray->pdata[index_]),
|
&(rarray->pdata[real_index]),
|
||||||
(rarray->len - index_) * sizeof (gpointer));
|
(rarray->len - real_index) * sizeof (gpointer));
|
||||||
|
|
||||||
rarray->len++;
|
rarray->len++;
|
||||||
rarray->pdata[index_] = data;
|
rarray->pdata[real_index] = data;
|
||||||
|
|
||||||
ptr_array_maybe_null_terminate (rarray);
|
ptr_array_maybe_null_terminate (rarray);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user