summaryrefslogtreecommitdiffstats
path: root/src/lockdown.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lockdown.c')
-rw-r--r--src/lockdown.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/lockdown.c b/src/lockdown.c
index e3636d1..64c325e 100644
--- a/src/lockdown.c
+++ b/src/lockdown.c
@@ -193,8 +193,8 @@ iphone_error_t iphone_lckd_recv(iphone_lckd_client_t client, plist_t * plist)
193 if (!client || !plist || (plist && *plist)) 193 if (!client || !plist || (plist && *plist))
194 return IPHONE_E_INVALID_ARG; 194 return IPHONE_E_INVALID_ARG;
195 iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; 195 iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR;
196 char *receive; 196 char *receive = NULL;
197 uint32_t datalen = 0, bytes = 0; 197 uint32_t datalen = 0, bytes = 0, received_bytes = 0;
198 198
199 if (!client->in_SSL) 199 if (!client->in_SSL)
200 ret = iphone_mux_recv(client->connection, (char *) &datalen, sizeof(datalen), &bytes); 200 ret = iphone_mux_recv(client->connection, (char *) &datalen, sizeof(datalen), &bytes);
@@ -206,21 +206,31 @@ iphone_error_t iphone_lckd_recv(iphone_lckd_client_t client, plist_t * plist)
206 datalen = ntohl(datalen); 206 datalen = ntohl(datalen);
207 207
208 receive = (char *) malloc(sizeof(char) * datalen); 208 receive = (char *) malloc(sizeof(char) * datalen);
209 if (!client->in_SSL) 209
210 ret = iphone_mux_recv(client->connection, receive, datalen, &bytes); 210 if (!client->in_SSL) {
211 else { 211 /* fill buffer and request more packets if needed */
212 bytes = gnutls_record_recv(*client->ssl_session, receive, datalen); 212 while ((received_bytes < datalen) && (ret == IPHONE_E_SUCCESS)) {
213 if (bytes > 0) 213 ret = iphone_mux_recv(client->connection, receive + received_bytes, datalen - received_bytes, &bytes);
214 received_bytes += bytes;
215 }
216 } else {
217 received_bytes = gnutls_record_recv(*client->ssl_session, receive, datalen);
218 if (received_bytes > 0)
214 ret = IPHONE_E_SUCCESS; 219 ret = IPHONE_E_SUCCESS;
215 } 220 }
216 221
217 if (bytes <= 0) { 222 if (ret != IPHONE_E_SUCCESS) {
223 free(receive);
224 return ret;
225 }
226
227 if (received_bytes <= 0) {
218 free(receive); 228 free(receive);
219 return IPHONE_E_NOT_ENOUGH_DATA; 229 return IPHONE_E_NOT_ENOUGH_DATA;
220 } 230 }
221 231
222 log_dbg_msg(DBGMASK_LOCKDOWND, "Recv msg :\nsize : %i\nbuffer :\n%s\n", bytes, receive); 232 log_dbg_msg(DBGMASK_LOCKDOWND, "Recv msg :\nsize : %i\nbuffer :\n%s\n", received_bytes, receive);
223 plist_from_xml(receive, bytes, plist); 233 plist_from_xml(receive, received_bytes, plist);
224 free(receive); 234 free(receive);
225 235
226 if (!*plist) 236 if (!*plist)