forked from AuroraMiddleware/gtk
Sanitize memory handling in cups_request_printer_list_cb
gtk+ was trying to display already freed strings, leaking memory, ...I noticed this because I was getting weird blinking characters as the status of my cups printers, and valgrind confirmed something was wrong. https://bugzilla.gnome.org/show_bug.cgi?id=683072
This commit is contained in:
parent
693581250e
commit
e8659679cd
@ -1696,7 +1696,7 @@ typedef struct
|
|||||||
const gchar *member_uris;
|
const gchar *member_uris;
|
||||||
const gchar *location;
|
const gchar *location;
|
||||||
const gchar *description;
|
const gchar *description;
|
||||||
const gchar *state_msg;
|
gchar *state_msg;
|
||||||
const gchar *reason_msg;
|
const gchar *reason_msg;
|
||||||
PrinterStateLevel reason_level;
|
PrinterStateLevel reason_level;
|
||||||
gint state;
|
gint state;
|
||||||
@ -1732,7 +1732,7 @@ cups_printer_handle_attribute (GtkPrintBackendCups *cups_backend,
|
|||||||
else if (strcmp (ippGetName (attr), "printer-info") == 0)
|
else if (strcmp (ippGetName (attr), "printer-info") == 0)
|
||||||
info->description = ippGetString (attr, 0, NULL);
|
info->description = ippGetString (attr, 0, NULL);
|
||||||
else if (strcmp (ippGetName (attr), "printer-state-message") == 0)
|
else if (strcmp (ippGetName (attr), "printer-state-message") == 0)
|
||||||
info->state_msg = ippGetString (attr, 0, NULL);
|
info->state_msg = g_strdup (ippGetString (attr, 0, NULL));
|
||||||
else if (strcmp (ippGetName (attr), "printer-state-reasons") == 0)
|
else if (strcmp (ippGetName (attr), "printer-state-reasons") == 0)
|
||||||
/* Store most important reason to reason_msg and set
|
/* Store most important reason to reason_msg and set
|
||||||
its importance at printer_state_reason_level */
|
its importance at printer_state_reason_level */
|
||||||
@ -2130,8 +2130,8 @@ cups_request_printer_list_cb (GtkPrintBackendCups *cups_backend,
|
|||||||
|
|
||||||
if (tmp_msg2 != NULL)
|
if (tmp_msg2 != NULL)
|
||||||
{
|
{
|
||||||
|
g_free (info->state_msg);
|
||||||
info->state_msg = tmp_msg2;
|
info->state_msg = tmp_msg2;
|
||||||
g_free (tmp_msg2);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2159,14 +2159,18 @@ cups_request_printer_list_cb (GtkPrintBackendCups *cups_backend,
|
|||||||
if (info->reason_level >= GTK_PRINTER_STATE_LEVEL_WARNING)
|
if (info->reason_level >= GTK_PRINTER_STATE_LEVEL_WARNING)
|
||||||
{
|
{
|
||||||
if (strlen (info->state_msg) == 0)
|
if (strlen (info->state_msg) == 0)
|
||||||
info->state_msg = reason_msg_desc;
|
{
|
||||||
|
g_free (info->state_msg);
|
||||||
|
info->state_msg = reason_msg_desc;
|
||||||
|
reason_msg_desc = NULL;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gchar *tmp_msg = NULL;
|
gchar *tmp_msg = NULL;
|
||||||
tmp_msg = g_strjoin (" ; ", info->state_msg,
|
tmp_msg = g_strjoin (" ; ", info->state_msg,
|
||||||
reason_msg_desc, NULL);
|
reason_msg_desc, NULL);
|
||||||
|
g_free (info->state_msg);
|
||||||
info->state_msg = tmp_msg;
|
info->state_msg = tmp_msg;
|
||||||
g_free (tmp_msg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (reason_msg_desc != NULL)
|
if (reason_msg_desc != NULL)
|
||||||
@ -2195,6 +2199,7 @@ cups_request_printer_list_cb (GtkPrintBackendCups *cups_backend,
|
|||||||
|
|
||||||
/* The ref is held by GtkPrintBackend, in add_printer() */
|
/* The ref is held by GtkPrintBackend, in add_printer() */
|
||||||
g_object_unref (printer);
|
g_object_unref (printer);
|
||||||
|
g_free (info->state_msg);
|
||||||
g_slice_free (PrinterSetupInfo, info);
|
g_slice_free (PrinterSetupInfo, info);
|
||||||
|
|
||||||
if (attr == NULL)
|
if (attr == NULL)
|
||||||
|
Loading…
Reference in New Issue
Block a user