Pacify GCC in pgtkselect malloc alignment

This is a better fix for Bug#76414.
* src/pgtkselect.c (pgtk_nalloc): New function.
(pgtk_get_window_property, lisp_data_to_selection_data): Use it.
This commit is contained in:
Paul Eggert 2025-03-02 15:57:14 -08:00
parent 07bbfea901
commit 76342efe9d

View file

@ -57,6 +57,17 @@ static void lisp_data_to_selection_data (struct pgtk_display_info *, Lisp_Object
static Lisp_Object pgtk_get_local_selection (Lisp_Object, Lisp_Object,
bool, struct pgtk_display_info *);
/* Allocate an array of NITEMS items, each of positive size ITEM_SIZE.
Make room for an extra byte at the end, as GDK sometimes needs that. */
static void *
pgtk_nalloc (ptrdiff_t nitems, ptrdiff_t item_size)
{
/* To pacify gcc --Wanalyzer-allocation-size, make room for an extra
item at the end instead of just the extra byte GDK sometimes needs. */
return xnmalloc (nitems + 1, item_size);
}
/* From a Lisp_Object, return a suitable frame for selection
operations. OBJECT may be a frame, a terminal object, or nil
(which stands for the selected frame--or, if that is not an pgtk
@ -1129,7 +1140,7 @@ pgtk_get_window_property (GdkWindow *window, unsigned char **data_ret,
eassert (actual_format == 32);
length = length / sizeof (GdkAtom);
xdata = xmalloc (sizeof (GdkAtom) * length + 1);
xdata = pgtk_nalloc (length, sizeof (GdkAtom));
memcpy (xdata, data, 1 + length * sizeof (GdkAtom));
g_free (data);
@ -1145,10 +1156,7 @@ pgtk_get_window_property (GdkWindow *window, unsigned char **data_ret,
element_size = pgtk_size_for_format (actual_format);
length = length / element_size;
/* Add an extra byte on the end. GDK guarantees that it is
NULL. */
xdata = xmalloc (1 + element_size * length);
xdata = pgtk_nalloc (length, element_size);
memcpy (xdata, data, 1 + element_size * length);
if (actual_format == 32 && LONG_WIDTH > 32)
@ -1437,7 +1445,7 @@ lisp_data_to_selection_data (struct pgtk_display_info *dpyinfo,
}
else if (SYMBOLP (obj))
{
void *data = xmalloc (sizeof (GdkAtom) + 1);
void *data = pgtk_nalloc (1, sizeof (GdkAtom));
GdkAtom *x_atom_ptr = data;
cs->data = data;
cs->format = 32;
@ -1448,7 +1456,7 @@ lisp_data_to_selection_data (struct pgtk_display_info *dpyinfo,
}
else if (RANGED_FIXNUMP (SHRT_MIN, obj, SHRT_MAX))
{
void *data = xmalloc (sizeof (short) + 1);
void *data = pgtk_nalloc (1, sizeof (short));
short *short_ptr = data;
cs->data = data;
cs->format = 16;
@ -1463,7 +1471,7 @@ lisp_data_to_selection_data (struct pgtk_display_info *dpyinfo,
|| (CONSP (XCDR (obj))
&& FIXNUMP (XCAR (XCDR (obj)))))))
{
void *data = xmalloc (sizeof (unsigned long) + 1);
void *data = pgtk_nalloc (1, sizeof (unsigned long));
unsigned long *x_long_ptr = data;
cs->data = data;
cs->format = 32;