diff options
| author | 2011-01-11 05:20:28 +0100 | |
|---|---|---|
| committer | 2011-04-11 19:42:20 +0200 | |
| commit | 8c771ad2ee401bb098f0a437a3c86b68ea0bcde3 (patch) | |
| tree | c0f28937c538856c4658b3711cb7555a2dffa95d /tools | |
| parent | 39a5eceaaebee5fd84cfa817e7f70d5bf26ba02a (diff) | |
| download | libimobiledevice-8c771ad2ee401bb098f0a437a3c86b68ea0bcde3.tar.gz libimobiledevice-8c771ad2ee401bb098f0a437a3c86b68ea0bcde3.tar.bz2 | |
idevicebackup4: add more error checking to mb2_handle_receive_files
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/idevicebackup4.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/tools/idevicebackup4.c b/tools/idevicebackup4.c index 40f1a83..7084669 100644 --- a/tools/idevicebackup4.c +++ b/tools/idevicebackup4.c | |||
| @@ -757,10 +757,18 @@ static int mb2_handle_receive_files(plist_t message, const char *backup_dir) | |||
| 757 | if (nlen == 0) { | 757 | if (nlen == 0) { |
| 758 | // we're done here | 758 | // we're done here |
| 759 | break; | 759 | break; |
| 760 | } else if (nlen > 4096) { | ||
| 761 | // too very long path | ||
| 762 | printf("ERROR: %s: too long device filename (%d)!\n", __func__, nlen); | ||
| 763 | break; | ||
| 760 | } | 764 | } |
| 761 | fname = (char*)malloc(nlen+1); | 765 | fname = (char*)malloc(nlen+1); |
| 762 | r = 0; | 766 | r = 0; |
| 763 | mobilebackup2_receive_raw(mobilebackup2, fname, nlen, &r); | 767 | mobilebackup2_receive_raw(mobilebackup2, fname, nlen, &r); |
| 768 | if (r != nlen) { | ||
| 769 | printf("ERROR: %s: could not read device filename\n", __func__); | ||
| 770 | break; | ||
| 771 | } | ||
| 764 | fname[r] = 0; | 772 | fname[r] = 0; |
| 765 | // we don't need this name | 773 | // we don't need this name |
| 766 | //printf("\n%s\n", fname); | 774 | //printf("\n%s\n", fname); |
| @@ -768,19 +776,35 @@ static int mb2_handle_receive_files(plist_t message, const char *backup_dir) | |||
| 768 | nlen = 0; | 776 | nlen = 0; |
| 769 | mobilebackup2_receive_raw(mobilebackup2, (char*)&nlen, 4, &r); | 777 | mobilebackup2_receive_raw(mobilebackup2, (char*)&nlen, 4, &r); |
| 770 | nlen = GUINT32_FROM_BE(nlen); | 778 | nlen = GUINT32_FROM_BE(nlen); |
| 779 | if (nlen == 0) { | ||
| 780 | printf("ERROR: %s: zero-length backup filename!\n", __func__); | ||
| 781 | break; | ||
| 782 | } else if (nlen > 4096) { | ||
| 783 | printf("ERROR: %s: too long backup filename (%d)!\n", __func__, nlen); | ||
| 784 | break; | ||
| 785 | } | ||
| 771 | fname = (char*)malloc(nlen+1); | 786 | fname = (char*)malloc(nlen+1); |
| 772 | mobilebackup2_receive_raw(mobilebackup2, fname, nlen, &r); | 787 | mobilebackup2_receive_raw(mobilebackup2, fname, nlen, &r); |
| 773 | if (r != nlen) { | 788 | if (r != nlen) { |
| 774 | fprintf(stderr, "hmmm.... received %d from %d\n", r, nlen); | 789 | printf("ERROR: %s: could not receive backup filename!\n", __func__); |
| 790 | break; | ||
| 775 | } | 791 | } |
| 776 | fname[r] = 0; | 792 | fname[r] = 0; |
| 777 | bname = g_build_path(G_DIR_SEPARATOR_S, backup_dir, fname, NULL); | 793 | bname = g_build_path(G_DIR_SEPARATOR_S, backup_dir, fname, NULL); |
| 778 | free(fname); | 794 | free(fname); |
| 779 | nlen = 0; | 795 | nlen = 0; |
| 780 | mobilebackup2_receive_raw(mobilebackup2, (char*)&nlen, 4, &r); | 796 | mobilebackup2_receive_raw(mobilebackup2, (char*)&nlen, 4, &r); |
| 797 | if (r != 4) { | ||
| 798 | printf("ERROR: %s: could not receive code length!\n", __func__); | ||
| 799 | break; | ||
| 800 | } | ||
| 781 | nlen = GUINT32_FROM_BE(nlen); | 801 | nlen = GUINT32_FROM_BE(nlen); |
| 782 | code = 0; | 802 | code = 0; |
| 783 | mobilebackup2_receive_raw(mobilebackup2, &code, 1, &r); | 803 | mobilebackup2_receive_raw(mobilebackup2, &code, 1, &r); |
| 804 | if (r != 1) { | ||
| 805 | printf("ERROR: %s: could not receive code!\n", __func__); | ||
| 806 | break; | ||
| 807 | } | ||
| 784 | 808 | ||
| 785 | /* TODO remove this */ | 809 | /* TODO remove this */ |
| 786 | if ((code != CODE_SUCCESS) && (code != CODE_FILE_DATA) && (code != CODE_ERROR_REMOTE)) { | 810 | if ((code != CODE_SUCCESS) && (code != CODE_FILE_DATA) && (code != CODE_ERROR_REMOTE)) { |
