diff options
| author | 2009-04-22 20:17:55 +0200 | |
|---|---|---|
| committer | 2009-04-23 19:04:41 -0700 | |
| commit | fa8424a5da3d9e745541834048a5bbbfd5427a5c (patch) | |
| tree | a97da763985dccd161b0bceb86f540c4c54672ac /src/MobileSync.c | |
| parent | 63e5eed5542c8c85144ee0ac20174c0859fab866 (diff) | |
| download | libimobiledevice-fa8424a5da3d9e745541834048a5bbbfd5427a5c.tar.gz libimobiledevice-fa8424a5da3d9e745541834048a5bbbfd5427a5c.tar.bz2 | |
Fix receive of plists larger than a packet for lockdown and MobileSync
[#35 state:resolved]
Signed-off-by: Matt Colyer <matt@colyer.name>
Diffstat (limited to 'src/MobileSync.c')
| -rw-r--r-- | src/MobileSync.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/MobileSync.c b/src/MobileSync.c index b16a51b..25f9473 100644 --- a/src/MobileSync.c +++ b/src/MobileSync.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include "MobileSync.h" | 22 | #include "MobileSync.h" |
| 23 | #include <plist/plist.h> | 23 | #include <plist/plist.h> |
| 24 | #include <string.h> | 24 | #include <string.h> |
| 25 | #include <arpa/inet.h> | ||
| 25 | 26 | ||
| 26 | 27 | ||
| 27 | #define MSYNC_VERSION_INT1 100 | 28 | #define MSYNC_VERSION_INT1 100 |
| @@ -136,16 +137,27 @@ iphone_error_t iphone_msync_recv(iphone_msync_client_t client, plist_t * plist) | |||
| 136 | if (!client || !plist || (plist && *plist)) | 137 | if (!client || !plist || (plist && *plist)) |
| 137 | return IPHONE_E_INVALID_ARG; | 138 | return IPHONE_E_INVALID_ARG; |
| 138 | iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; | 139 | iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; |
| 139 | char *receive; | 140 | char *receive = NULL; |
| 140 | uint32_t datalen = 0, bytes = 0; | 141 | uint32_t datalen = 0, bytes = 0, received_bytes = 0; |
| 141 | 142 | ||
| 142 | ret = iphone_mux_recv(client->connection, (char *) &datalen, sizeof(datalen), &bytes); | 143 | ret = iphone_mux_recv(client->connection, (char *) &datalen, sizeof(datalen), &bytes); |
| 143 | datalen = ntohl(datalen); | 144 | datalen = ntohl(datalen); |
| 144 | 145 | ||
| 145 | receive = (char *) malloc(sizeof(char) * datalen); | 146 | receive = (char *) malloc(sizeof(char) * datalen); |
| 146 | ret = iphone_mux_recv(client->connection, receive, datalen, &bytes); | ||
| 147 | 147 | ||
| 148 | plist_from_bin(receive, bytes, plist); | 148 | /* fill buffer and request more packets if needed */ |
| 149 | while ((received_bytes < datalen) && (ret == IPHONE_E_SUCCESS)) { | ||
| 150 | ret = iphone_mux_recv(client->connection, receive + received_bytes, datalen - received_bytes, &bytes); | ||
| 151 | received_bytes += bytes; | ||
| 152 | } | ||
| 153 | |||
| 154 | if (ret != IPHONE_E_SUCCESS) { | ||
| 155 | free(receive); | ||
| 156 | return ret; | ||
| 157 | } | ||
| 158 | |||
| 159 | plist_from_bin(receive, received_bytes, plist); | ||
| 160 | free(receive); | ||
| 149 | 161 | ||
| 150 | char *XMLContent = NULL; | 162 | char *XMLContent = NULL; |
| 151 | uint32_t length = 0; | 163 | uint32_t length = 0; |
