diff --git a/src/lockdown.c b/src/lockdown.c index e3636d1..f5c1505 100644 --- a/src/lockdown.c +++ b/src/lockdown.c @@ -194,7 +194,7 @@ iphone_error_t iphone_lckd_recv(iphone_lckd_client_t client, plist_t * plist) return IPHONE_E_INVALID_ARG; iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; char *receive; - uint32_t datalen = 0, bytes = 0; + uint32_t datalen = 0, bytes = 0, received_bytes = 0; if (!client->in_SSL) ret = iphone_mux_recv(client->connection, (char *) &datalen, sizeof(datalen), &bytes); @@ -205,22 +205,33 @@ iphone_error_t iphone_lckd_recv(iphone_lckd_client_t client, plist_t * plist) } datalen = ntohl(datalen); + bytes = 0; receive = (char *) malloc(sizeof(char) * datalen); - if (!client->in_SSL) - ret = iphone_mux_recv(client->connection, receive, datalen, &bytes); - else { - bytes = gnutls_record_recv(*client->ssl_session, receive, datalen); - if (bytes > 0) - ret = IPHONE_E_SUCCESS; + + /* fill buffer and request more packets if needed */ + while ((received_bytes < datalen) && (ret == IPHONE_E_SUCCESS)) { + if (!client->in_SSL) + ret = iphone_mux_recv(client->connection, receive + received_bytes, datalen, &bytes); + else { + bytes = gnutls_record_recv(*client->ssl_session, receive + received_bytes, datalen); + if (bytes > 0) + ret = IPHONE_E_SUCCESS; + } + received_bytes += bytes; + } + + if (ret != IPHONE_E_SUCCESS) { + free(receive); + return ret; } - if (bytes <= 0) { + if (received_bytes <= 0) { free(receive); return IPHONE_E_NOT_ENOUGH_DATA; } - log_dbg_msg(DBGMASK_LOCKDOWND, "Recv msg :\nsize : %i\nbuffer :\n%s\n", bytes, receive); - plist_from_xml(receive, bytes, plist); + log_dbg_msg(DBGMASK_LOCKDOWND, "Recv msg :\nsize : %i\nbuffer :\n%s\n", received_bytes, receive); + plist_from_xml(receive, received_bytes, plist); free(receive); if (!*plist)