Projet

Général

Profil

0001-Fix-reference-count-in-lasso_server_add_provider2-fi.patch

Benjamin Dauvergne, 03 septembre 2019 13:42

Télécharger (3,85 ko)

Voir les différences:

Subject: [PATCH] Fix reference count in lasso_server_add_provider2 (fixes
 #35061)

As implemented lasso_server_add_provider2 could not be used as a publik
API as it dit not increase the reference count of the LassoProvider
object before adding it to the providers hashtable.

lasso_server_add_provider_helper had to be modified to decrement the
reference count of the new LassoProvider object after using
lasso_server_add_provider2.
 lasso/id-ff/server.c | 32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)
lasso/id-ff/server.c
60 60
/* public methods                                                            */
61 61
/*****************************************************************************/
62 62

  
63
static gint
63
static lasso_error_t
64 64
lasso_server_add_provider_helper(LassoServer *server, LassoProviderRole role,
65 65
		const gchar *metadata, const gchar *public_key, const gchar *ca_cert_chain,
66 66
		LassoProvider *(*provider_constructor)(LassoProviderRole role,
67 67
		const char *metadata, const char *public_key, const char *ca_cert_chain))
68 68
{
69 69
	LassoProvider *provider;
70
	lasso_error_t rc = 0;
70 71

  
71 72
	g_return_val_if_fail(LASSO_IS_SERVER(server), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
72 73
	g_return_val_if_fail(metadata != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
73 74

  
74 75
	provider = provider_constructor(role, metadata, public_key, ca_cert_chain);
75
	if (provider == NULL) {
76
		return critical_error(LASSO_SERVER_ERROR_ADD_PROVIDER_FAILED);
77
	}
76
	goto_cleanup_if_fail_with_rc(provider != NULL, critical_error(LASSO_SERVER_ERROR_ADD_PROVIDER_FAILED));
77

  
78 78
	provider->role = role;
79 79

  
80
	if (LASSO_PROVIDER(server)->private_data->conformance == LASSO_PROTOCOL_SAML_2_0 &&
81
			provider->private_data->conformance != LASSO_PROTOCOL_SAML_2_0) {
82
		lasso_node_destroy(LASSO_NODE(provider));
83
		return LASSO_SERVER_ERROR_ADD_PROVIDER_PROTOCOL_MISMATCH;
80
	if (LASSO_PROVIDER(server)->private_data->conformance == LASSO_PROTOCOL_SAML_2_0 && provider->private_data->conformance != LASSO_PROTOCOL_SAML_2_0) {
81
		goto_cleanup_with_rc(LASSO_SERVER_ERROR_ADD_PROVIDER_PROTOCOL_MISMATCH);
84 82
	}
85 83

  
86
	if (LASSO_PROVIDER(server)->private_data->conformance == LASSO_PROTOCOL_LIBERTY_1_2 &&
87
			provider->private_data->conformance > LASSO_PROTOCOL_LIBERTY_1_2) {
88
		lasso_node_destroy(LASSO_NODE(provider));
89
		return LASSO_SERVER_ERROR_ADD_PROVIDER_PROTOCOL_MISMATCH;
84
	if (LASSO_PROVIDER(server)->private_data->conformance == LASSO_PROTOCOL_LIBERTY_1_2
85
		&& provider->private_data->conformance > LASSO_PROTOCOL_LIBERTY_1_2) {
86
		goto_cleanup_with_rc(LASSO_SERVER_ERROR_ADD_PROVIDER_PROTOCOL_MISMATCH);
90 87
	}
91 88

  
92
	return lasso_server_add_provider2(server, provider);
89
	lasso_server_add_provider2(server, provider);
90

  
91
cleanup:
92
	lasso_release_gobject(provider);
93
	return rc;
93 94
}
94 95

  
95 96
/**
......
104 105
 *
105 106
 * Return value: 0 on success; a negative value if an error occured.
106 107
 **/
107
gint
108
lasso_error_t
108 109
lasso_server_add_provider(LassoServer *server, LassoProviderRole role,
109 110
		const gchar *metadata, const gchar *public_key, const gchar *ca_cert_chain)
110 111
{
......
129 130
	g_return_val_if_fail(provider->ProviderID, LASSO_PARAM_ERROR_NON_INITIALIZED_OBJECT);
130 131
	g_return_val_if_fail(server->providers, LASSO_PARAM_ERROR_NON_INITIALIZED_OBJECT);
131 132

  
132
	g_hash_table_insert(server->providers, g_strdup(provider->ProviderID), provider);
133
	g_object_ref(provider);
134
	g_hash_table_insert(server->providers, g_strdup(provider->ProviderID), g_object_ref(provider));
133 135

  
134 136
	return 0;
135 137
}
136
-