mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-03 17:56:17 +01:00
GSocketControlMessage: clean up confusing code
It looks like the deserialisation function in GSocketControlMessage can potentially leak a reference to the class structure of a GSocketControlMessage subclass (although the particular code path is probably never hit). Clean up the code a bit. Also, make sure that the GUnixCredentialsMessage type is registered before attempting deserialisation. Closes bug #629687.
This commit is contained in:
parent
02451227ec
commit
6145321680
@ -48,6 +48,7 @@
|
|||||||
#include "glibintl.h"
|
#include "glibintl.h"
|
||||||
|
|
||||||
#ifndef G_OS_WIN32
|
#ifndef G_OS_WIN32
|
||||||
|
#include "gunixcredentialsmessage.h"
|
||||||
#include "gunixfdmessage.h"
|
#include "gunixfdmessage.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -172,7 +173,6 @@ g_socket_control_message_deserialize (int level,
|
|||||||
gsize size,
|
gsize size,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
GSocketControlMessageClass *klass;
|
|
||||||
GSocketControlMessage *message;
|
GSocketControlMessage *message;
|
||||||
GType *message_types;
|
GType *message_types;
|
||||||
guint n_message_types;
|
guint n_message_types;
|
||||||
@ -183,6 +183,7 @@ g_socket_control_message_deserialize (int level,
|
|||||||
|
|
||||||
/* Ensure we know about the built in types */
|
/* Ensure we know about the built in types */
|
||||||
#ifndef G_OS_WIN32
|
#ifndef G_OS_WIN32
|
||||||
|
a_type = g_unix_credentials_message_get_type ();
|
||||||
a_type = g_unix_fd_message_get_type ();
|
a_type = g_unix_fd_message_get_type ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -191,13 +192,11 @@ g_socket_control_message_deserialize (int level,
|
|||||||
message = NULL;
|
message = NULL;
|
||||||
for (i = 0; i < n_message_types; i++)
|
for (i = 0; i < n_message_types; i++)
|
||||||
{
|
{
|
||||||
klass = (GSocketControlMessageClass *)g_type_class_ref (message_types[i]);
|
GSocketControlMessageClass *class;
|
||||||
|
|
||||||
if (klass && klass->deserialize)
|
class = g_type_class_ref (message_types[i]);
|
||||||
{
|
message = class->deserialize (level, type, size, data);
|
||||||
message = klass->deserialize (level, type, size, data);
|
g_type_class_unref (class);
|
||||||
g_type_class_unref ((GTypeClass *) klass);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (message != NULL)
|
if (message != NULL)
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user