summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libirecovery.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/libirecovery.c b/src/libirecovery.c
index 69f1d90..a255d78 100644
--- a/src/libirecovery.c
+++ b/src/libirecovery.c
@@ -1760,6 +1760,15 @@ IRECV_API irecv_error_t irecv_send_buffer(irecv_client_t client, unsigned char*
1760 dfu_hash_step(h1, buffer[i*packet_size + j]); 1760 dfu_hash_step(h1, buffer[i*packet_size + j]);
1761 } 1761 }
1762 if (i+1 == packets) { 1762 if (i+1 == packets) {
1763 if (size+16 > packet_size) {
1764 bytes = irecv_usb_control_transfer(client, 0x21, 1, i, 0, &buffer[i * packet_size], size, USB_TIMEOUT);
1765 if (bytes != size) {
1766 return IRECV_E_USB_UPLOAD;
1767 }
1768 count += size;
1769 size = 0;
1770 }
1771
1763 for (j = 0; j < 2; j++) { 1772 for (j = 0; j < 2; j++) {
1764 dfu_hash_step(h1, dfu_xbuf[j*6 + 0]); 1773 dfu_hash_step(h1, dfu_xbuf[j*6 + 0]);
1765 dfu_hash_step(h1, dfu_xbuf[j*6 + 1]); 1774 dfu_hash_step(h1, dfu_xbuf[j*6 + 1]);
@@ -1770,7 +1779,9 @@ IRECV_API irecv_error_t irecv_send_buffer(irecv_client_t client, unsigned char*
1770 } 1779 }
1771 1780
1772 char* newbuf = (char*)malloc(size + 16); 1781 char* newbuf = (char*)malloc(size + 16);
1773 memcpy(newbuf, &buffer[i * packet_size], size); 1782 if (size > 0) {
1783 memcpy(newbuf, &buffer[i * packet_size], size);
1784 }
1774 memcpy(newbuf+size, dfu_xbuf, 12); 1785 memcpy(newbuf+size, dfu_xbuf, 12);
1775 newbuf[size+12] = h1 & 0xFF; 1786 newbuf[size+12] = h1 & 0xFF;
1776 newbuf[size+13] = (h1 >> 8) & 0xFF; 1787 newbuf[size+13] = (h1 >> 8) & 0xFF;