Fix memory leaks

The return values of XGetAtomName() have to be freed with XFree().
This commit is contained in:
Markus Beth 2019-02-02 20:55:28 +01:00
parent 85f99edd65
commit 116e125139

54
xclip.c
View File

@ -220,11 +220,15 @@ xclip_provide_selection(XSelectionRequestEvent * req, Atom type, unsigned int fo
uint32 length) uint32 length)
{ {
XEvent xev; XEvent xev;
char *target_name, *property_name;
target_name = XGetAtomName(g_display, req->target);
property_name = XGetAtomName(g_display, req->property);
logger(Clipboard, Debug, logger(Clipboard, Debug,
"xclip_provide_selection(), requestor=0x%08x, target=%s, property=%s, length=%u", "xclip_provide_selection(), requestor=0x%08x, target=%s, property=%s, length=%u",
(unsigned) req->requestor, XGetAtomName(g_display, req->target), (unsigned) req->requestor, target_name, property_name, (unsigned) length);
XGetAtomName(g_display, req->property), (unsigned) length); XFree(target_name);
XFree(property_name);
XChangeProperty(g_display, req->requestor, req->property, XChangeProperty(g_display, req->requestor, req->property,
type, format, PropModeReplace, data, length); type, format, PropModeReplace, data, length);
@ -247,11 +251,15 @@ static void
xclip_refuse_selection(XSelectionRequestEvent * req) xclip_refuse_selection(XSelectionRequestEvent * req)
{ {
XEvent xev; XEvent xev;
char *target_name, *property_name;
target_name = XGetAtomName(g_display, req->target);
property_name = XGetAtomName(g_display, req->property);
logger(Clipboard, Debug, logger(Clipboard, Debug,
"xclip_refuse_selection(), requestor=0x%08x, target=%s, property=%s", "xclip_refuse_selection(), requestor=0x%08x, target=%s, property=%s",
(unsigned) req->requestor, XGetAtomName(g_display, req->target), (unsigned) req->requestor, target_name, property_name);
XGetAtomName(g_display, req->property)); XFree(target_name);
XFree(property_name);
xev.xselection.type = SelectionNotify; xev.xselection.type = SelectionNotify;
xev.xselection.serial = 0; xev.xselection.serial = 0;
@ -292,8 +300,12 @@ helper_cliprdr_send_empty_response()
static RD_BOOL static RD_BOOL
xclip_send_data_with_convert(uint8 * source, size_t source_size, Atom target) xclip_send_data_with_convert(uint8 * source, size_t source_size, Atom target)
{ {
char *target_name;
target_name = XGetAtomName(g_display, target);
logger(Clipboard, Debug, "xclip_send_data_with_convert(), target=%s, size=%u", logger(Clipboard, Debug, "xclip_send_data_with_convert(), target=%s, size=%u",
XGetAtomName(g_display, target), (unsigned) source_size); target_name, (unsigned) source_size);
XFree(target_name);
#ifdef USE_UNICODE_CLIPBOARD #ifdef USE_UNICODE_CLIPBOARD
if (target == format_string_atom || if (target == format_string_atom ||
@ -513,14 +525,20 @@ xclip_handle_SelectionNotify(XSelectionEvent * event)
Atom *supported_targets; Atom *supported_targets;
int res, format; int res, format;
uint8 *data = NULL; uint8 *data = NULL;
char *selection_name, *target_name, *property_name;
if (event->property == None) if (event->property == None)
goto fail; goto fail;
selection_name = XGetAtomName(g_display, event->selection);
target_name = XGetAtomName(g_display, event->target);
property_name = XGetAtomName(g_display, event->property);
logger(Clipboard, Debug, logger(Clipboard, Debug,
"xclip_handle_SelectionNotify(), selection=%s, target=%s, property=%s", "xclip_handle_SelectionNotify(), selection=%s, target=%s, property=%s",
XGetAtomName(g_display, event->selection), XGetAtomName(g_display, event->target), selection_name, target_name, property_name);
XGetAtomName(g_display, event->property)); XFree(selection_name);
XFree(target_name);
XFree(property_name);
if (event->target == timestamp_atom) if (event->target == timestamp_atom)
{ {
@ -643,9 +661,11 @@ xclip_handle_SelectionNotify(XSelectionEvent * event)
supported_targets = (Atom *) data; supported_targets = (Atom *) data;
for (i = 0; i < nitems; i++) for (i = 0; i < nitems; i++)
{ {
target_name = XGetAtomName(g_display, supported_targets[i]);
logger(Clipboard, Debug, logger(Clipboard, Debug,
"xclip_handle_SelectionNotify(), target %d: %s", i, "xclip_handle_SelectionNotify(), target %d: %s", i,
XGetAtomName(g_display, supported_targets[i])); target_name);
XFree(target_name);
if (supported_targets[i] == format_string_atom) if (supported_targets[i] == format_string_atom)
{ {
if (text_target_satisfaction < 1) if (text_target_satisfaction < 1)
@ -782,11 +802,17 @@ xclip_handle_SelectionRequest(XSelectionRequestEvent * event)
unsigned char *prop_return = NULL; unsigned char *prop_return = NULL;
int format, res; int format, res;
Atom type; Atom type;
char *selection_name, *target_name, *property_name;
selection_name = XGetAtomName(g_display, event->selection);
target_name = XGetAtomName(g_display, event->target);
property_name = XGetAtomName(g_display, event->property);
logger(Clipboard, Debug, logger(Clipboard, Debug,
"xclip_handle_SelectionRequest(), selection=%s, target=%s, property=%s", "xclip_handle_SelectionRequest(), selection=%s, target=%s, property=%s",
XGetAtomName(g_display, event->selection), XGetAtomName(g_display, event->target), selection_name, target_name, property_name);
XGetAtomName(g_display, event->property)); XFree(selection_name);
XFree(target_name);
XFree(property_name);
if (event->target == targets_atom) if (event->target == targets_atom)
{ {
@ -856,9 +882,11 @@ xclip_handle_SelectionRequest(XSelectionRequestEvent * event)
} }
else else
{ {
target_name = XGetAtomName(g_display, event->target);
logger(Clipboard, Warning, logger(Clipboard, Warning,
"xclip_handle_SelectionRequest(), unsupported target format, target='%s'", "xclip_handle_SelectionRequest(), unsupported target format, target='%s'",
XGetAtomName(g_display, event->target)); target_name);
XFree(target_name);
xclip_refuse_selection(event); xclip_refuse_selection(event);
return; return;
} }
@ -1052,9 +1080,11 @@ ui_clip_handle_data(uint8 * data, uint32 length)
} }
else else
{ {
char *target_name = XGetAtomName(g_display, selection_request.target);
logger(Clipboard, Debug, logger(Clipboard, Debug,
"ui_clip_handle_data(), no handler for selection target '%s'", "ui_clip_handle_data(), no handler for selection target '%s'",
XGetAtomName(g_display, selection_request.target)); target_name);
XFree(target_name);
xclip_refuse_selection(&selection_request); xclip_refuse_selection(&selection_request);
has_selection_request = False; has_selection_request = False;
return; return;