diff options
Diffstat (limited to 'src/libirecovery.c')
| -rw-r--r-- | src/libirecovery.c | 13 |
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; |
