summaryrefslogtreecommitdiffstats
path: root/tools/idevicebackup4.c
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2011-01-11 05:20:28 +0100
committerGravatar Martin Szulecki2011-04-11 19:42:20 +0200
commit8c771ad2ee401bb098f0a437a3c86b68ea0bcde3 (patch)
treec0f28937c538856c4658b3711cb7555a2dffa95d /tools/idevicebackup4.c
parent39a5eceaaebee5fd84cfa817e7f70d5bf26ba02a (diff)
downloadlibimobiledevice-8c771ad2ee401bb098f0a437a3c86b68ea0bcde3.tar.gz
libimobiledevice-8c771ad2ee401bb098f0a437a3c86b68ea0bcde3.tar.bz2
idevicebackup4: add more error checking to mb2_handle_receive_files
Diffstat (limited to 'tools/idevicebackup4.c')
-rw-r--r--tools/idevicebackup4.c26
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)) {