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" #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;