summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArun Scaria <arunscaria91@gmail.com>2011-07-14 18:05:54 +0530
committerArun Scaria <arunscaria91@gmail.com>2011-07-14 18:05:54 +0530
commitb8495d2fd3a293e567cd34e78e0f5d40062fdf76 (patch)
tree064888a0b4274340a7a98dd7cc000729551f6731
parent3a482c147511b1c147fbba92813b048dcc36cdda (diff)
downloadsssd_unused-b8495d2fd3a293e567cd34e78e0f5d40062fdf76.tar.gz
sssd_unused-b8495d2fd3a293e567cd34e78e0f5d40062fdf76.tar.xz
sssd_unused-b8495d2fd3a293e567cd34e78e0f5d40062fdf76.zip
safe disconnection of sudo plugin is added
-rw-r--r--src/sss_client/sudo_plugin/sss_sudoplugin.c80
1 files changed, 57 insertions, 23 deletions
diff --git a/src/sss_client/sudo_plugin/sss_sudoplugin.c b/src/sss_client/sudo_plugin/sss_sudoplugin.c
index 00838165..fa1aed0e 100644
--- a/src/sss_client/sudo_plugin/sss_sudoplugin.c
+++ b/src/sss_client/sudo_plugin/sss_sudoplugin.c
@@ -846,6 +846,29 @@ int validate_message_content( void )
return SSS_SUDO_VALIDATION_SUCCESS;
}
+void free_connection(DBusConnection *conn,
+ DBusError *err,
+ hash_table_t *settings_table,
+ DBusMessageIter *msg,
+ DBusMessageIter *reply ){
+
+ if(msg != NULL)
+ dbus_message_unref(msg);
+
+ if(reply != NULL)
+ dbus_message_unref(reply);
+
+ if (err != NULL && dbus_error_is_set(err))
+ dbus_error_free(err);
+
+ if(settings_table != NULL)
+ hash_destroy(settings_table);
+
+ if(conn != NULL)
+ dbus_connection_close(conn);
+
+}
+
int sss_sudo_make_request(struct sss_cli_req_data *rd,
uint8_t **repbuf,
@@ -869,9 +892,9 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
dbus_bool_t ret=FALSE;
- hash_table_t *env_table;
- hash_table_t *settings_table;
- hash_table_t *env_table_out;
+ hash_table_t *env_table = NULL;
+ hash_table_t *settings_table = NULL;
+ hash_table_t *env_table_out = NULL;
fprintf(stdout,"Calling remote method to pack message\n");
@@ -916,9 +939,7 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
SUDO_METHOD_QUERY); /* method name */
if (NULL == dbus_msg) {
fprintf(stderr, "Message Null\n");
- if (dbus_error_is_set(&err))
- dbus_error_free(&err);
- dbus_connection_close(conn);
+ free_connection(conn,&err,settings_table,NULL,NULL);
return SSS_SUDO_MESSAGE_ERR;
}
@@ -926,6 +947,11 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
dbus_message_iter_init_append(dbus_msg, &msg_iter);
+ if(dbus_error_is_set(&err)){
+ fprintf(stderr, "Failed to initialize the iterator.\n");
+ free_connection(conn,&err,settings_table,dbus_msg,NULL);
+ return SSS_SUDO_MESSAGE_ERR;
+ }
if(!dbus_message_iter_open_container(&msg_iter,
@@ -933,12 +959,14 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
NULL,
&sub_iter)) {
fprintf(stderr, "Out Of Memory!\n");
+ free_connection(conn,&err,settings_table,dbus_msg,NULL);
return SSS_SUDO_MESSAGE_ERR;
}
if (!dbus_message_iter_append_basic(&sub_iter,
DBUS_TYPE_UINT32,
&msg.userid)) {
fprintf(stderr, "Out Of Memory!\n");
+ free_connection(conn,&err,settings_table,dbus_msg,NULL);
return SSS_SUDO_MESSAGE_ERR;
}
@@ -946,6 +974,7 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
DBUS_TYPE_STRING,
&msg.cwd)) {
fprintf(stderr, "Out Of Memory!\n");
+ free_connection(conn,&err,settings_table,dbus_msg,NULL);
return SSS_SUDO_MESSAGE_ERR;
}
@@ -955,11 +984,13 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
DBUS_TYPE_STRING,
&msg.tty)) {
fprintf(stderr, "Out Of Memory!\n");
+ free_connection(conn,&err,settings_table,dbus_msg,NULL);
return SSS_SUDO_MESSAGE_ERR;
}
if (!dbus_message_iter_close_container(&msg_iter,&sub_iter)) {
fprintf(stderr, "Out Of Memory!\n");
+ free_connection(conn,&err,settings_table,dbus_msg,NULL);
return SSS_SUDO_MESSAGE_ERR;
}
@@ -967,6 +998,7 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
DBUS_TYPE_UINT32,
&msg.command_count)) {
fprintf(stderr, "Out Of Memory!\n");
+ free_connection(conn,&err,settings_table,dbus_msg,NULL);
return SSS_SUDO_MESSAGE_ERR;
}
@@ -975,6 +1007,7 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
"s",
&sub_iter)) {
fprintf(stderr, "Out Of Memory!\n");
+ free_connection(conn,&err,settings_table,dbus_msg,NULL);
return SSS_SUDO_MESSAGE_ERR;
}
@@ -984,6 +1017,7 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
DBUS_TYPE_STRING,
command_array)) {
fprintf(stderr, "Out Of Memory!\n");
+ free_connection(conn,&err,settings_table,dbus_msg,NULL);
return SSS_SUDO_MESSAGE_ERR;
}
@@ -991,17 +1025,20 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
if (!dbus_message_iter_close_container(&msg_iter,&sub_iter)) {
fprintf(stderr, "Out Of Memory!\n");
+ free_connection(conn,&err,settings_table,dbus_msg,NULL);
return SSS_SUDO_MESSAGE_ERR;
}
////////
if(dbus_dhash_to_msg_iter(&settings_table,&msg_iter) != SSS_SBUS_CONV_SUCCESS){
fprintf(stderr,"fatal: message framing failed.");
+ free_connection(conn,&err,settings_table,dbus_msg,NULL);
return SSS_SUDO_MESSAGE_ERR;
}
if(dbus_dhash_to_msg_iter(&env_table,&msg_iter) != SSS_SBUS_CONV_SUCCESS){
fprintf(stderr,"fatal: message framing failed.");
+ free_connection(conn,&err,settings_table,dbus_msg,NULL);
return SSS_SUDO_MESSAGE_ERR;
}
@@ -1014,11 +1051,12 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
fprintf(stdout,"Request Sent\n");
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Connection send-reply Error (%s)\n", err.message);
- dbus_error_free(&err);
+ free_connection(conn,&err,NULL,dbus_msg,NULL);
return SSS_SUDO_REPLY_ERR;
}
if (NULL == dbus_reply) {
fprintf(stderr, "reply failed\n");
+ free_connection(conn,&err,NULL,dbus_msg,NULL);
return SSS_SUDO_REPLY_ERR;
}
@@ -1031,10 +1069,7 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
DBUS_TYPE_INVALID);
if (!ret) {
fprintf (stderr,"Failed to parse reply, killing connection\n");
- if (dbus_error_is_set(&err))
- dbus_error_free(&err);
-
- dbus_connection_close(conn);
+ free_connection(conn,&err,NULL,dbus_msg,dbus_reply);
return SSS_SUDO_REPLY_ERR;
}
@@ -1047,31 +1082,30 @@ int sss_sudo_make_request(struct sss_cli_req_data *rd,
}
if (!dbus_message_iter_init(dbus_reply, &msg_iter)) {
fprintf(stderr, "Reply iterator failed!\n");
+ free_connection(conn,&err,NULL,dbus_msg,dbus_reply);
return SSS_SUDO_REPLY_ERR;
}
+ printf("\n");
dbus_message_iter_next(&msg_iter);
dbus_message_iter_next(&msg_iter);
dbus_message_iter_next(&msg_iter);
if(dbus_msg_iter_to_dhash(&msg_iter, &env_table_out) != SSS_SBUS_CONV_SUCCESS){
fprintf(stderr, "env message iterator corrupted!\n");
+ free_connection(conn,&err,NULL,dbus_msg,dbus_reply);
return SSS_SUDO_REPLY_ERR;
+ }
+ printf("---------Reply End----------\n");
- }
- printf("---------Reply End----------");
-
- // free reply and close connection
- /* free message */
- dbus_message_unref(dbus_msg);
- dbus_message_unref(dbus_reply);
- dbus_connection_close(conn);
+ /* free connection now */
+ free_connection(conn,&err,NULL,dbus_msg,dbus_reply);
-if(strncmp(result_str,"PASS",4)==0)
- return SSS_STATUS_SUCCESS;
-else
- return SSS_STATUS_FAILED;
+ if(strncmp(result_str,"PASS",4)==0)
+ return SSS_STATUS_SUCCESS;
+ else
+ return SSS_STATUS_FAILED;
}