summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2009-12-07 18:13:21 +0100
committerGravatar Matt Colyer2009-12-07 19:45:07 -0800
commitea45a41a7987ab1d05e2160ce831d2fcff695077 (patch)
tree882e6070ec9703f87dc7b6d0117b30a2e712b99f /src
parent213025d04ae8788be393b63e245f2805386f7f8a (diff)
downloadlibimobiledevice-ea45a41a7987ab1d05e2160ce831d2fcff695077.tar.gz
libimobiledevice-ea45a41a7987ab1d05e2160ce831d2fcff695077.tar.bz2
better handling of session_id
This will change session_id out of the lockdownd_client_int struct to a pointer instead of using a buffer of fixed size. The session_id is allocated anyway by libplist when reading it from the plist received from the device, so why don't just use it? [#94 state:resolved] Signed-off-by: Matt Colyer <matt@colyer.name>
Diffstat (limited to 'src')
-rw-r--r--src/lockdown.c47
-rw-r--r--src/lockdown.h2
2 files changed, 27 insertions, 22 deletions
diff --git a/src/lockdown.c b/src/lockdown.c
index afca410..6bf4c84 100644
--- a/src/lockdown.c
+++ b/src/lockdown.c
@@ -120,13 +120,18 @@ lockdownd_error_t lockdownd_stop_session(lockdownd_client_t client)
120 if (!client) 120 if (!client)
121 return LOCKDOWN_E_INVALID_ARG; 121 return LOCKDOWN_E_INVALID_ARG;
122 122
123 if (!client->session_id) {
124 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: no session_id given, cannot stop session\n", __func__);
125 return LOCKDOWN_E_INVALID_ARG;
126 }
127
123 lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR; 128 lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR;
124 129
125 plist_t dict = plist_new_dict(); 130 plist_t dict = plist_new_dict();
126 plist_dict_insert_item(dict,"Request", plist_new_string("StopSession")); 131 plist_dict_insert_item(dict,"Request", plist_new_string("StopSession"));
127 plist_dict_insert_item(dict,"SessionID", plist_new_string(client->session_id)); 132 plist_dict_insert_item(dict,"SessionID", plist_new_string(client->session_id));
128 133
129 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: called\n", __func__); 134 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: stopping session %s\n", __func__, client->session_id);
130 135
131 ret = lockdownd_send(client, dict); 136 ret = lockdownd_send(client, dict);
132 137
@@ -148,6 +153,9 @@ lockdownd_error_t lockdownd_stop_session(lockdownd_client_t client)
148 plist_free(dict); 153 plist_free(dict);
149 dict = NULL; 154 dict = NULL;
150 155
156 free(client->session_id);
157 client->session_id = NULL;
158
151 return ret; 159 return ret;
152} 160}
153 161
@@ -209,6 +217,10 @@ lockdownd_error_t lockdownd_client_free(lockdownd_client_t client)
209 } 217 }
210 } 218 }
211 219
220 if (client->session_id) {
221 free(client->session_id);
222 }
223
212 free(client); 224 free(client);
213 return ret; 225 return ret;
214} 226}
@@ -642,6 +654,7 @@ lockdownd_error_t lockdownd_client_new(iphone_device_t device, lockdownd_client_
642 client_loc->ssl_session = NULL; 654 client_loc->ssl_session = NULL;
643 client_loc->ssl_certificate = NULL; 655 client_loc->ssl_certificate = NULL;
644 client_loc->in_SSL = 0; 656 client_loc->in_SSL = 0;
657 client_loc->session_id = NULL;
645 658
646 if (LOCKDOWN_E_SUCCESS != lockdownd_query_type(client_loc)) { 659 if (LOCKDOWN_E_SUCCESS != lockdownd_query_type(client_loc)) {
647 log_debug_msg("%s: QueryType failed in the lockdownd client.\n", __func__); 660 log_debug_msg("%s: QueryType failed in the lockdownd client.\n", __func__);
@@ -985,7 +998,10 @@ lockdownd_error_t lockdownd_start_ssl_session(lockdownd_client_t client, const c
985 uint32_t return_me = 0; 998 uint32_t return_me = 0;
986 999
987 lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR; 1000 lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR;
988 client->session_id[0] = '\0'; 1001 if (client->session_id) {
1002 free(client->session_id);
1003 client->session_id = NULL;
1004 }
989 1005
990 /* Setup DevicePublicKey request plist */ 1006 /* Setup DevicePublicKey request plist */
991 dict = plist_new_dict(); 1007 dict = plist_new_dict();
@@ -1100,27 +1116,16 @@ lockdownd_error_t lockdownd_start_ssl_session(lockdownd_client_t client, const c
1100 ret = LOCKDOWN_E_SUCCESS; 1116 ret = LOCKDOWN_E_SUCCESS;
1101 } 1117 }
1102 } 1118 }
1103 /* store session id */ 1119 /* store session id, we need it for StopSession */
1104 plist_t session_node = plist_dict_get_item(dict, "SessionID"); 1120 plist_t session_node = plist_dict_get_item(dict, "SessionID");
1105 if (session_node) { 1121 if (session_node && (plist_get_node_type(session_node) == PLIST_STRING)) {
1106 1122 plist_get_string_val(session_node, &client->session_id);
1107 plist_type session_node_type = plist_get_node_type(session_node); 1123 }
1108 1124 if (client->session_id) {
1109 if (session_node_type == PLIST_STRING) { 1125 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: SessionID: %s\n", __func__, client->session_id);
1110 1126 } else {
1111 char *session_id = NULL;
1112 plist_get_string_val(session_node, &session_id);
1113
1114 if (session_node_type == PLIST_STRING && session_id) {
1115 /* we need to store the session ID for StopSession */
1116 strcpy(client->session_id, session_id);
1117 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: SessionID: %s\n", __func__, client->session_id);
1118 }
1119 if (session_id)
1120 free(session_id);
1121 }
1122 } else
1123 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: Failed to get SessionID!\n", __func__); 1127 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: Failed to get SessionID!\n", __func__);
1128 }
1124 plist_free(dict); 1129 plist_free(dict);
1125 dict = NULL; 1130 dict = NULL;
1126 1131
diff --git a/src/lockdown.h b/src/lockdown.h
index 9312867..49b467f 100644
--- a/src/lockdown.h
+++ b/src/lockdown.h
@@ -32,7 +32,7 @@ struct lockdownd_client_int {
32 gnutls_session_t ssl_session; 32 gnutls_session_t ssl_session;
33 gnutls_certificate_credentials_t ssl_certificate; 33 gnutls_certificate_credentials_t ssl_certificate;
34 int in_SSL; 34 int in_SSL;
35 char session_id[40]; 35 char *session_id;
36}; 36};
37 37
38lockdownd_error_t lockdownd_get_device_public_key(lockdownd_client_t client, gnutls_datum_t * public_key); 38lockdownd_error_t lockdownd_get_device_public_key(lockdownd_client_t client, gnutls_datum_t * public_key);