diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ideviceinstaller.c | 124 | 
1 files changed, 79 insertions, 45 deletions
| diff --git a/src/ideviceinstaller.c b/src/ideviceinstaller.c index f45326f..5709b58 100644 --- a/src/ideviceinstaller.c +++ b/src/ideviceinstaller.c @@ -657,6 +657,7 @@ int main(int argc, char **argv)  	if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(device, &client, "ideviceinstaller")) {  		fprintf(stderr, "Could not connect to lockdownd. Exiting.\n"); +		res = -1;  		goto leave_cleanup;  	} @@ -665,6 +666,7 @@ int main(int argc, char **argv)  		  &service) != LOCKDOWN_E_SUCCESS) || !service) {  		fprintf(stderr,  				"Could not start com.apple.mobile.notification_proxy!\n"); +		res = -1;  		goto leave_cleanup;  	} @@ -677,6 +679,7 @@ int main(int argc, char **argv)  	if (nperr != NP_E_SUCCESS) {  		fprintf(stderr, "Could not connect to notification_proxy!\n"); +		res = -1;  		goto leave_cleanup;  	} @@ -696,6 +699,7 @@ run_again:  		  &service) != LOCKDOWN_E_SUCCESS) || !service) {  		fprintf(stderr,  				"Could not start com.apple.mobile.installation_proxy!\n"); +		res = -1;  		goto leave_cleanup;  	} @@ -708,6 +712,7 @@ run_again:  	if (err != INSTPROXY_E_SUCCESS) {  		fprintf(stderr, "Could not connect to installation_proxy!\n"); +		res = -1;  		goto leave_cleanup;  	} @@ -760,6 +765,7 @@ run_again:  			if (!apps || (plist_get_node_type(apps) != PLIST_ARRAY)) {  				fprintf(stderr,  						"ERROR: instproxy_browse returnd an invalid plist!\n"); +				res = -1;  				goto leave_cleanup;  			} @@ -785,6 +791,7 @@ run_again:  		instproxy_client_options_free(client_opts);  		if (err != INSTPROXY_E_SUCCESS) {  			fprintf(stderr, "ERROR: instproxy_browse returned %d\n", err); +			res = -1;  			goto leave_cleanup;  		} @@ -804,6 +811,7 @@ run_again:  		if ((lockdownd_start_service(client, "com.apple.afc", &service) !=  			 LOCKDOWN_E_SUCCESS) || !service) {  			fprintf(stderr, "Could not start com.apple.afc!\n"); +			res = -1;  			goto leave_cleanup;  		} @@ -812,11 +820,13 @@ run_again:  		if (afc_client_new(device, service, &afc) != AFC_E_SUCCESS) {  			fprintf(stderr, "Could not connect to AFC!\n"); +			res = -1;  			goto leave_cleanup;  		}  		if (stat(appid, &fst) != 0) {  			fprintf(stderr, "ERROR: stat: %s: %s\n", appid, strerror(errno)); +			res = -1;  			goto leave_cleanup;  		} @@ -845,6 +855,7 @@ run_again:  			zf = zip_open(appid, 0, &errp);  			if (!zf) {  				fprintf(stderr, "ERROR: zip_open: %s: %d\n", appid, errp); +				res = -1;  				goto leave_cleanup;  			} @@ -917,6 +928,7 @@ run_again:  								afc_file_close(afc, af);  								zip_fclose(zfile);  								free(dstpath); +								res = -1;  								goto leave_cleanup;  							}  						} @@ -940,6 +952,7 @@ run_again:  			if (asprintf(&pkgname, "%s/%s", PKG_PATH, basename(appid)) < 0) {  				fprintf(stderr, "ERROR: Out of memory allocating pkgname!?\n"); +				res = -1;  				goto leave_cleanup;  			} @@ -947,55 +960,59 @@ run_again:  			afc_upload_dir(afc, appid, pkgname);  			printf("DONE.\n"); -                       /* extract the CFBundleIdentifier from the package */ - -                       /* construct full filename to Info.plist */ -                       char *filename = (char*)malloc(strlen(appid)+10+1); -                       strcpy(filename, appid); -                       strcat(filename, "/Info.plist"); - -                       struct stat st; -                       FILE *fp = NULL; - -                       if (stat(filename, &st) == -1 || (fp = fopen(filename, "r")) == NULL) { -                               fprintf(stderr, "ERROR: could not locate %s in app!\n", filename); -                               free(filename); -                               goto leave_cleanup; -                       } -                       size_t filesize = st.st_size; -                       char *ibuf = malloc(filesize * sizeof(char)); -                       size_t amount = fread(ibuf, 1, filesize, fp); -                       if (amount != filesize) { -                               fprintf(stderr, "ERROR: could not read %ld bytes from %s\n", filesize, filename); -                               free(filename); -                               goto leave_cleanup; -                       } -                       fclose(fp); -                       free(filename); - -                       plist_t info = NULL; -                       if (memcmp(ibuf, "bplist00", 8) == 0) { -                               plist_from_bin(ibuf, filesize, &info); -                       } else { -                               plist_from_xml(ibuf, filesize, &info); -                       } -                       free(ibuf); - -                       if (!info) { -                               fprintf(stderr, "ERROR: could not parse Info.plist!\n"); -                               goto leave_cleanup; -                       } - -                       plist_t bname = plist_dict_get_item(info, "CFBundleIdentifier"); -                       if (bname) { -                               plist_get_string_val(bname, &bundleidentifier); -                       } -                       plist_free(info); -                       info = NULL; +			/* extract the CFBundleIdentifier from the package */ + +			/* construct full filename to Info.plist */ +			char *filename = (char*)malloc(strlen(appid)+10+1); +			strcpy(filename, appid); +			strcat(filename, "/Info.plist"); + +			struct stat st; +			FILE *fp = NULL; + +			if (stat(filename, &st) == -1 || (fp = fopen(filename, "r")) == NULL) { +				fprintf(stderr, "ERROR: could not locate %s in app!\n", filename); +				free(filename); +				res = -1; +				goto leave_cleanup; +			} +			size_t filesize = st.st_size; +			char *ibuf = malloc(filesize * sizeof(char)); +			size_t amount = fread(ibuf, 1, filesize, fp); +			if (amount != filesize) { +				fprintf(stderr, "ERROR: could not read %ld bytes from %s\n", filesize, filename); +				free(filename); +				res = -1; +				goto leave_cleanup; +			} +			fclose(fp); +			free(filename); + +			plist_t info = NULL; +			if (memcmp(ibuf, "bplist00", 8) == 0) { +				plist_from_bin(ibuf, filesize, &info); +			} else { +				plist_from_xml(ibuf, filesize, &info); +			} +			free(ibuf); + +			if (!info) { +				fprintf(stderr, "ERROR: could not parse Info.plist!\n"); +				res = -1; +				goto leave_cleanup; +			} + +			plist_t bname = plist_dict_get_item(info, "CFBundleIdentifier"); +			if (bname) { +				plist_get_string_val(bname, &bundleidentifier); +			} +			plist_free(info); +			info = NULL;  		} else {  			zf = zip_open(appid, 0, &errp);  			if (!zf) {  				fprintf(stderr, "ERROR: zip_open: %s: %d\n", appid, errp); +				res = -1;  				goto leave_cleanup;  			} @@ -1024,6 +1041,7 @@ run_again:  			if (zip_get_app_directory(zf, &app_directory_name)) {  				fprintf(stderr, "Unable to locate app directory in archive!\n"); +				res = -1;  				goto leave_cleanup;  			} @@ -1039,6 +1057,7 @@ run_again:  				free(filename);  				zip_unchange_all(zf);  				zip_close(zf); +				res = -1;  				goto leave_cleanup;  			}  			free(filename); @@ -1053,6 +1072,7 @@ run_again:  				fprintf(stderr, "Could not parse Info.plist!\n");  				zip_unchange_all(zf);  				zip_close(zf); +				res = -1;  				goto leave_cleanup;  			} @@ -1074,12 +1094,14 @@ run_again:  				fprintf(stderr, "Could not determine value for CFBundleExecutable!\n");  				zip_unchange_all(zf);  				zip_close(zf); +				res = -1;  				goto leave_cleanup;  			}  			char *sinfname = NULL;  			if (asprintf(&sinfname, "Payload/%s.app/SC_Info/%s.sinf", bundleexecutable, bundleexecutable) < 0) {  				fprintf(stderr, "Out of memory!?\n"); +				res = -1;  				goto leave_cleanup;  			}  			free(bundleexecutable); @@ -1099,6 +1121,7 @@ run_again:  			pkgname = NULL;  			if (asprintf(&pkgname, "%s/%s", PKG_PATH, bundleidentifier) < 0) {  				fprintf(stderr, "Out of memory!?\n"); +				res = -1;  				goto leave_cleanup;  			} @@ -1162,12 +1185,14 @@ run_again:  		err = instproxy_lookup_archives(ipc, NULL, &dict);  		if (err != INSTPROXY_E_SUCCESS) {  			fprintf(stderr, "ERROR: lookup_archives returned %d\n", err); +			res = -1;  			goto leave_cleanup;  		}  		if (!dict) {  			fprintf(stderr,  					"ERROR: lookup_archives did not return a plist!?\n"); +			res = -1;  			goto leave_cleanup;  		} @@ -1273,12 +1298,14 @@ run_again:  			if (stat(copy_path, &fst) != 0) {  				fprintf(stderr, "ERROR: stat: %s: %s\n", copy_path, strerror(errno));  				free(copy_path); +				res = -1;  				goto leave_cleanup;  			}  			if (!S_ISDIR(fst.st_mode)) {  				fprintf(stderr, "ERROR: '%s' is not a directory as expected.\n", copy_path);  				free(copy_path); +				res = -1;  				goto leave_cleanup;  			} @@ -1290,6 +1317,7 @@ run_again:  			if ((lockdownd_start_service(client, "com.apple.afc", &service) != LOCKDOWN_E_SUCCESS) || !service) {  				fprintf(stderr, "Could not start com.apple.afc!\n");  				free(copy_path); +				res = -1;  				goto leave_cleanup;  			} @@ -1298,6 +1326,7 @@ run_again:  			if (afc_client_new(device, service, &afc) != AFC_E_SUCCESS) {  				fprintf(stderr, "Could not connect to AFC!\n"); +				res = -1;  				goto leave_cleanup;  			}  		} @@ -1318,6 +1347,7 @@ run_again:  			if (err_occurred) {  				afc_client_free(afc);  				afc = NULL; +				res = -1;  				goto leave_cleanup;  			}  			FILE *f = NULL; @@ -1326,6 +1356,7 @@ run_again:  			char *localfile = NULL;  			if (asprintf(&localfile, "%s/%s.ipa", copy_path, appid) < 0) {  				fprintf(stderr, "Out of memory!?\n"); +				res = -1;  				goto leave_cleanup;  			}  			free(copy_path); @@ -1351,6 +1382,7 @@ run_again:  				fclose(f);  				free(remotefile);  				free(localfile); +				res = -1;  				goto leave_cleanup;  			} @@ -1381,6 +1413,7 @@ run_again:  				fprintf(stderr, "ERROR: could not open '%s' on device for reading!\n", remotefile);  				free(remotefile);  				free(localfile); +				res = -1;  				goto leave_cleanup;  			} @@ -1430,6 +1463,7 @@ run_again:  				options = NULL;  				if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(device, &client, "ideviceinstaller")) {  					fprintf(stderr, "Could not connect to lockdownd. Exiting.\n"); +					res = -1;  					goto leave_cleanup;  				}  				goto run_again; | 
