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:
Ryan Lortie 2010-09-22 06:45:02 -04:00
parent 02451227ec
commit 6145321680

View File

@ -48,6 +48,7 @@
#include "glibintl.h"
#ifndef G_OS_WIN32
#include "gunixcredentialsmessage.h"
#include "gunixfdmessage.h"
#endif
@ -172,7 +173,6 @@ g_socket_control_message_deserialize (int level,
gsize size,
gpointer data)
{
GSocketControlMessageClass *klass;
GSocketControlMessage *message;
GType *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 */
#ifndef G_OS_WIN32
a_type = g_unix_credentials_message_get_type ();
a_type = g_unix_fd_message_get_type ();
#endif
@ -191,13 +192,11 @@ g_socket_control_message_deserialize (int level,
message = NULL;
for (i = 0; i < n_message_types; i++)
{
klass = (GSocketControlMessageClass *)g_type_class_ref (message_types[i]);
GSocketControlMessageClass *class;
if (klass && klass->deserialize)
{
message = klass->deserialize (level, type, size, data);
g_type_class_unref ((GTypeClass *) klass);
}
class = g_type_class_ref (message_types[i]);
message = class->deserialize (level, type, size, data);
g_type_class_unref (class);
if (message != NULL)
break;