diff options
| author | 2010-04-05 22:57:15 +0200 | |
|---|---|---|
| committer | 2010-04-06 12:32:38 +0200 | |
| commit | 1b8f638e160bb06eb453e5ab8e9632575921bfcc (patch) | |
| tree | 0e174a11dbf2b73bbaced3e775894dcdec07575f | |
| parent | b1fa58d09428ae4ff35d610b50424aa7e6eea4c1 (diff) | |
| download | libimobiledevice-1b8f638e160bb06eb453e5ab8e9632575921bfcc.tar.gz libimobiledevice-1b8f638e160bb06eb453e5ab8e9632575921bfcc.tar.bz2  | |
idevicebackup: better handle broken or missing plist files
| -rw-r--r-- | tools/idevicebackup.c | 48 | 
1 files changed, 35 insertions, 13 deletions
diff --git a/tools/idevicebackup.c b/tools/idevicebackup.c index d7d7d1c..a8b37d9 100644 --- a/tools/idevicebackup.c +++ b/tools/idevicebackup.c @@ -150,17 +150,26 @@ static void buffer_read_from_filename(const char *filename, char **buffer, uint3  	FILE *f;  	uint64_t size; +	*length = 0; +  	f = fopen(filename, "rb"); +	if (!f) { +		return; +	}  	fseek(f, 0, SEEK_END);  	size = ftell(f);  	rewind(f); +	if (size == 0) { +		return; +	} +  	*buffer = (char*)malloc(sizeof(char)*size);  	fread(*buffer, sizeof(char), size, f);  	fclose(f); -	*length = size; +	*length = (uint32_t)size;  }  static void buffer_write_to_filename(const char *filename, const char *buffer, uint32_t length) @@ -186,7 +195,7 @@ static int plist_read_from_filename(plist_t *plist, const char *filename)  		return 0;  	} -	if (memcmp(buffer, "bplist00", 8) == 0) { +	if ((length > 8) && (memcmp(buffer, "bplist00", 8) == 0)) {  		plist_from_bin(buffer, length, plist);  	} else {  		plist_from_xml(buffer, length, plist); @@ -553,7 +562,11 @@ int main(int argc, char *argv[])  			printf("Reading Info.plist from backup.\n");  			plist_read_from_filename(&info_plist, info_path); -			if (cmd == CMD_BACKUP) { +			if (!info_plist) { +				printf("Could not read Info.plist\n"); +				is_full_backup = 1; +			} +			if (info_plist && (cmd == CMD_BACKUP)) {  				if (mobilebackup_info_is_current_device(info_plist)) {  					/* update the last backup time within Info.plist */  					mobilebackup_info_update_last_backup_date(info_plist); @@ -587,16 +600,6 @@ int main(int argc, char *argv[])  			/* TODO: check domain com.apple.mobile.backup key RequiresEncrypt and WillEncrypt with lockdown */  			/* TODO: verify battery on AC enough battery remaining */	 -			/* Info.plist (Device infos, IC-Info.sidb, photos, app_ids, iTunesPrefs) */ -			/* create new Info.plist on new backups */ -			if (is_full_backup) { -				printf("Creating Info.plist for new backup.\n"); -				info_plist = mobilebackup_factory_info_plist_new(); -				plist_write_to_filename(info_plist, info_path, PLIST_FORMAT_XML); -			} - -			g_free(info_path); -  			/* Manifest.plist (backup manifest (backup state)) */  			char *manifest_path = mobilebackup_build_path(backup_directory, "Manifest", ".plist"); @@ -604,7 +607,26 @@ int main(int argc, char *argv[])  			if (!is_full_backup) {  				printf("Reading existing Manifest.\n");  				plist_read_from_filename(&manifest_plist, manifest_path); +				if (!manifest_plist) { +					printf("Could not read Manifest.plist, switching to full backup mode.\n"); +					is_full_backup = 1; +				} +			} + +			/* Info.plist (Device infos, IC-Info.sidb, photos, app_ids, iTunesPrefs) */ + +			/* create new Info.plist on new backups */ +			if (is_full_backup) { +				if (info_plist) { +					plist_free(info_plist); +					info_plist = NULL; +				} +				remove(info_path); +				printf("Creating Info.plist for new backup.\n"); +				info_plist = mobilebackup_factory_info_plist_new(); +				plist_write_to_filename(info_plist, info_path, PLIST_FORMAT_XML);  			} +			g_free(info_path);  			plist_free(info_plist);  			info_plist = NULL;  | 
